COSA
An Object-Oriented Platform for Arduino Programming
MAX72XX.cpp
Go to the documentation of this file.
1 
21 #include "MAX72XX.hh"
22 
38 const uint8_t MAX72XX::font[] __PROGMEM = {
39  0b00000000, // (space)
40  0b10000000, // !
41  0b00100010, // "
42  0b10000000, // #
43  0b10000000, // $
44  0b10000000, // %
45  0b10000000, // &
46  0b00000010, // '
47  0b01001110, // (
48  0b01111000, // )
49  0b10000000, // *
50  0b10000000, // +
51  0b10000000, // ,
52  0b00000001, // -
53  0b10000000, // .
54  0b00100100, // /
55  0b01111110, // 0
56  0b00110000, // 1
57  0b01101101, // 2
58  0b01111001, // 3
59  0b00110011, // 4
60  0b01011011, // 5
61  0b01011111, // 6
62  0b01110000, // 7
63  0b01111111, // 8
64  0b01111011, // 9
65  0b10000000, // :
66  0b10000000, // ;
67  0b10000000, // <
68  0b10000000, // =
69  0b10000000, // >
70  0b10000000, // ?
71  0b10000000, // @
72  0b01110111, // A
73  0b10000000, // B
74  0b01001110, // C
75  0b10000000, // D
76  0b01001111, // E
77  0b01000111, // F
78  0b01011110, // G
79  0b00110111, // H
80  0b00110000, // I
81  0b00111000, // J
82  0b10000000, // K
83  0b00001110, // L
84  0b10000000, // M
85  0b11110110, // N
86  0b01111110, // O
87  0b01100111, // P
88  0b10000000, // Q
89  0b10000000, // R
90  0b01011011, // S
91  0b10000000, // T
92  0b00111110, // U
93  0b10000000, // V
94  0b10000000, // W
95  0b00110111, // X
96  0b00110011, // Y
97  0b01101101, // Z
98  0b01001110, // [
99  0b00010011, // "\"
100  0b01111000, // ]
101  0b11100010, // ^
102  0b00001000, // _
103  0b10000000, // `
104  0b10000000, // a
105  0b00011111, // b
106  0b00001101, // c
107  0b00111101, // d
108  0b10000000, // e
109  0b01000111, // f
110  0b01111011, // g
111  0b00010111, // h
112  0b00010000, // i
113  0b00111000, // j
114  0b10000000, // k
115  0b00110000, // l
116  0b10000000, // m
117  0b00010101, // n
118  0b00011101, // o
119  0b01100111, // p
120  0b01110011, // q
121  0b00000101, // r
122  0b10000000, // s
123  0b10000000, // t
124  0b00011100, // u
125  0b10000000, // v
126  0b10000000, // w
127  0b10000000, // x
128  0b10000000, // y
129  0b10000000, // z
130  0b00110001, // {
131  0b00110000, // |
132  0b00000111, // }
133  0b00100101, // ~
134  0b00010011 // DEL
135 };
136 
137 MAX72XX::MAX72XX(LCD::IO* io, const uint8_t* font) :
138  LCD::Device(),
139  m_io(io),
140  m_font(font != NULL ? font : MAX72XX::font)
141 {
142 }
143 
144 void
145 MAX72XX::set(Register reg, uint8_t value)
146 {
147  m_io->begin();
148  m_io->write(reg);
149  m_io->write(value);
150  m_io->end();
151 }
152 
153 bool
155 {
156  set(DECODE_MODE, NO_DECODE);
157  set(SCAN_LIMIT, 7);
158  display_contrast(7);
159  display_clear();
160  display_on();
161  return (true);
162 }
163 
164 bool
166 {
168  return (true);
169 }
170 
171 void
173 {
175 }
176 
177 void
179 {
181 }
182 
183 void
185 {
186  for (uint8_t reg = DIGIT0; reg <= DIGIT7; reg++)
187  set((Register) reg, 0x00);
188  set_cursor(0, 0);
189 }
190 
191 void
193 {
194  set(INTENSITY, level);
195 }
196 
197 void
198 MAX72XX::set_cursor(uint8_t x, uint8_t y)
199 {
200  m_x = x;
201  m_y = y;
202 }
203 
204 int
206 {
207  // Check for illegal characters
208  if (c < 0) return (-1);
209 
210  // Check for special characters
211  if (c < ' ') {
212 
213  // Carriage-return: move to start of line
214  if (c == '\r') {
215  set_cursor(0, m_y);
216  return (c);
217  }
218  // Form-feed: clear the display or line-feed: clear line
219  if ((c == '\f') || (c == '\n')) {
220  display_clear();
221  return (c);
222  }
223 
224  // Horizontal tab
225  if (c == '\t') {
226  uint8_t x = m_x + m_tab - (m_x % m_tab);
227  uint8_t y = m_y + (x >= WIDTH);
228  set_cursor(x, y);
229  return (c);
230  }
231 
232  // Back-space: move cursor back one step (if possible)
233  if (c == '\b') {
234  set_cursor(m_x - 1, m_y);
235  return (c);
236  }
237 
238  // Alert: blink the backlight
239  if (c == '\a') {
240  display_off();
241  delay(32);
242  display_on();
243  return (c);
244  }
245  }
246 
247  // Write character
248  uint8_t segments;
249  if (c == '.') {
250  c = m_latest;
251  segments = pgm_read_byte(m_font + c - ' ') | 0x80;
252  }
253  else {
254  if (m_x == WIDTH) putchar('\n');
255  m_x += 1;
256  m_latest = c;
257  segments = pgm_read_byte(m_font + c - ' ');
258  }
259  set((Register) m_x, segments);
260 
261  return (c & 0xff);
262 }
virtual void display_clear()
Definition: MAX72XX.cpp:184
uint8_t m_y
Cursor position y.
Definition: LCD.hh:181
virtual void set_cursor(uint8_t x, uint8_t y)
Definition: MAX72XX.cpp:198
char m_latest
Latest character code.
Definition: MAX72XX.hh:182
const uint8_t MAX72XX::font[] __PROGMEM
Definition: MAX72XX.cpp:38
uint8_t m_x
Cursor position x.
Definition: LCD.hh:180
virtual int putchar(char c)
Definition: MAX72XX.cpp:205
virtual void begin()=0
#define NULL
Definition: Types.h:101
Display Mode (shutdown, normal).
Definition: MAX72XX.hh:156
virtual void display_off()
Definition: MAX72XX.cpp:178
virtual void display_on()
Definition: MAX72XX.cpp:172
virtual void display_contrast(uint8_t level)
Definition: MAX72XX.cpp:192
Decode Mode (0..255, digit bitset).
Definition: MAX72XX.hh:153
virtual void write(uint8_t data)=0
Intensity (0..15, level).
Definition: MAX72XX.hh:154
uint8_t m_tab
Tab step.
Definition: LCD.hh:182
void(* delay)(uint32_t ms)
static const uint8_t font[]
Definition: MAX72XX.hh:177
MAX72XX(LCD::IO *io, const uint8_t *font=NULL)
Definition: MAX72XX.cpp:137
Definition: LCD.hh:190
Shutdown mode.
Definition: MAX72XX.hh:164
void set(Register reg, uint8_t value)
Definition: MAX72XX.cpp:145
virtual bool begin()
Definition: MAX72XX.cpp:154
No decode for digits 7-0.
Definition: MAX72XX.hh:172
Definition: LCD.hh:36
Normal operation.
Definition: MAX72XX.hh:165
virtual bool end()
Definition: MAX72XX.cpp:165
Digit 7 (encode or segment data).
Definition: MAX72XX.hh:152
const uint8_t * m_font
Font in program memory.
Definition: MAX72XX.hh:181
Scan Limit (0..7, digits 1..8).
Definition: MAX72XX.hh:155
Digit 0 (encode or segment data).
Definition: MAX72XX.hh:145
static const uint8_t WIDTH
Definition: MAX72XX.hh:67
virtual void end()=0
LCD::IO * m_io
Display adapter.
Definition: MAX72XX.hh:180