Arduino-LCD
LCD library for Arduino
MAX72XX.h
Go to the documentation of this file.
1 
19 #ifndef MAX72XX_H
20 #define MAX72XX_H
21 
22 #include "LCD.h"
23 #include "GPIO.h"
24 #include "SRPO.h"
25 
45 template<BOARD::pin_t SCE_PIN, BOARD::pin_t SDIN_PIN, BOARD::pin_t SCLK_PIN>
46 class MAX72XX : public LCD::Device {
47 public:
49  static const uint8_t WIDTH = 8;
50  static const uint8_t HEIGHT = 1;
51 
73  MAX72XX(const uint8_t* font = NULL) :
74  LCD::Device()
75  {
77  static const uint8_t default_font[] PROGMEM = {
78  0b00000000, // (space)
79  0b10000000, // !
80  0b00100010, // "
81  0b10000000, // #
82  0b10000000, // $
83  0b10000000, // %
84  0b10000000, // &
85  0b00000010, // '
86  0b01001110, // (
87  0b01111000, // )
88  0b10000000, // *
89  0b10000000, // +
90  0b10000000, // ,
91  0b00000001, // -
92  0b10000000, // .
93  0b00100100, // /
94  0b01111110, // 0
95  0b00110000, // 1
96  0b01101101, // 2
97  0b01111001, // 3
98  0b00110011, // 4
99  0b01011011, // 5
100  0b01011111, // 6
101  0b01110000, // 7
102  0b01111111, // 8
103  0b01111011, // 9
104  0b10000000, // :
105  0b10000000, // ;
106  0b10000000, // <
107  0b00001001, // =
108  0b10000000, // >
109  0b10000000, // ?
110  0b10000000, // @
111  0b01110111, // A
112  0b00011111, // B/b
113  0b01001110, // C
114  0b00111101, // D/d
115  0b01001111, // E
116  0b01000111, // F
117  0b01011110, // G
118  0b00110111, // H
119  0b00110000, // I
120  0b00111000, // J
121  0b10000000, // K
122  0b00001110, // L
123  0b10000000, // M
124  0b11110110, // N
125  0b01111110, // O
126  0b01100111, // P
127  0b10000000, // Q
128  0b10000000, // R
129  0b01011011, // S
130  0b10000000, // T
131  0b00111110, // U
132  0b10000000, // V
133  0b10000000, // W
134  0b00110111, // X
135  0b00110011, // Y
136  0b01101101, // Z
137  0b01001110, // [
138  0b00010011, // "\"
139  0b01111000, // ]
140  0b11100010, // ^
141  0b00001000, // _
142  0b10000000, // `
143  0b10000000, // a
144  0b00011111, // b
145  0b00001101, // c
146  0b00111101, // d
147  0b01001111, // e/E
148  0b01000111, // f
149  0b01111011, // g
150  0b00010111, // h
151  0b00010000, // i
152  0b00111000, // j
153  0b10000000, // k
154  0b00110000, // l
155  0b10000000, // m
156  0b00010101, // n
157  0b00011101, // o
158  0b01100111, // p
159  0b01110011, // q
160  0b00000101, // r
161  0b10000000, // s
162  0b10000000, // t
163  0b00011100, // u
164  0b10000000, // v
165  0b10000000, // w
166  0b10000000, // x
167  0b10000000, // y
168  0b10000000, // z
169  0b00110001, // {
170  0b00110000, // |
171  0b00000111, // }
172  0b00100101, // ~
173  0b00010011 // DEL
174  };
175  m_font = font != NULL ? font : default_font;
176  m_sce.output();
177  m_sce.high();
178  }
179 
186  virtual bool begin()
187  {
188  display_off();
189  set(DECODE_MODE, NO_DECODE);
190  set(SCAN_LIMIT, 7);
191  display_contrast(7);
192  display_clear();
193  display_on();
194  return (true);
195  }
196 
203  virtual bool end()
204  {
206  return (true);
207  }
208 
214  virtual void display_contrast(uint8_t level)
215  {
216  set(INTENSITY, level & 0xF);
217  }
218 
223  virtual void display_on()
224  {
226  }
227 
232  virtual void display_off()
233  {
235  }
236 
241  virtual void display_clear()
242  {
243  for (uint8_t reg = DIGIT0; reg <= DIGIT7; reg++)
244  set(reg, 0x00);
245  cursor_home();
246  }
247 
254  virtual void cursor_set(uint8_t x, uint8_t y)
255  {
256  if (x >= WIDTH) x = 0;
257  if (y >= HEIGHT) y = 0;
258  m_x = x;
259  m_y = y;
260  }
261 
272  virtual size_t write(uint8_t c)
273  {
274  // Check for illegal characters
275  if (c > 128) return (0);
276 
277  // Check for special characters
278  if (c < ' ') {
279  switch (c) {
280  case '\r': // Carriage-return: move to start of line
281  cursor_set(0, m_y);
282  break;
283  case '\f': // Form-feed: clear the display or line-feed: clear line
284  case '\n':
285  display_clear();
286  break;
287  case '\t': // Horizontal tab
288  {
289  uint8_t x = m_x + m_tab - (m_x % m_tab);
290  uint8_t y = m_y + (x >= WIDTH);
291  cursor_set(x, y);
292  }
293  break;
294  case '\b': // Back-space: move cursor back one step (if possible)
295  cursor_set(m_x - 1, m_y);
296  set(m_x + 1, 0);
297  break;
298  case '\a': // Alert: invert character mode
299  m_mode = ~m_mode;
300  break;
301  default:
302  return (0);
303  }
304  return (1);
305  }
306 
307  // Write character; compress dot with latest character
308  uint8_t segments;
309  if (c == '.') {
310  c = m_latest;
311  segments = pgm_read_byte(m_font + c - ' ') | 0x80;
312  }
313  else {
314  if (m_x == WIDTH) write('\n');
315  m_x += 1;
316  m_latest = c;
317  segments = pgm_read_byte(m_font + c - ' ');
318  }
319 
320  // Set the segments of the current digit
321  set(m_x, segments);
322  return (1);
323  }
324 
325 protected:
329  enum {
330  NOP = 0x00,
331  DIGIT0 = 0x01,
332  DIGIT1 = 0x02,
333  DIGIT2 = 0x03,
334  DIGIT3 = 0x04,
335  DIGIT4 = 0x05,
336  DIGIT5 = 0x06,
337  DIGIT6 = 0x07,
338  DIGIT7 = 0x08,
339  DECODE_MODE = 0x09,
340  INTENSITY = 0x0a,
341  SCAN_LIMIT = 0x0b,
342  DISPLAY_MODE = 0x0c,
343  DISPLAY_TEST = 0x0f
344  } __attribute__((packed));
345 
351  void set(uint8_t reg, uint8_t value)
352  {
353  m_sce.toggle();
354  m_srpo.write(reg);
355  m_srpo.write(value);
356  m_sce.toggle();
357  }
358 
362  enum {
363  SHUTDOWN_MODE = 0x00,
365  } __attribute__((packed));
366 
370  enum {
371  NO_DECODE = 0x00,
372  ALL_DECODE = 0xff
373  } __attribute__((packed));
374 
375  GPIO<SCE_PIN> m_sce;
376  SRPO<MSBFIRST, SDIN_PIN, SCLK_PIN> m_srpo;
377  const uint8_t* m_font;
378  char m_latest;
379 
380 };
381 #endif
const uint8_t * m_font
Font in program memory.
Definition: MAX72XX.h:377
uint8_t m_y
Cursor position y.
Definition: LCD.h:205
Digit 1 (encode or segment data).
Definition: MAX72XX.h:332
uint8_t m_x
Cursor position x.
Definition: LCD.h:204
Display Mode (shutdown, normal).
Definition: MAX72XX.h:342
virtual size_t write(uint8_t c)
Definition: MAX72XX.h:272
virtual bool end()
Definition: MAX72XX.h:203
Digit 6 (encode or segment data).
Definition: MAX72XX.h:337
virtual void cursor_set(uint8_t x, uint8_t y)
Definition: MAX72XX.h:254
Display Test (0..1, on/off).
Definition: MAX72XX.h:343
Definition: Debug.h:28
Normal operation.
Definition: MAX72XX.h:364
Digit 7 (encode or segment data).
Definition: MAX72XX.h:338
virtual void display_contrast(uint8_t level)
Definition: MAX72XX.h:214
virtual void display_off()
Definition: MAX72XX.h:232
uint8_t m_tab
Tab step.
Definition: LCD.h:206
Scan Limit (0..7, digits 1..8).
Definition: MAX72XX.h:341
Digit 3 (encode or segment data).
Definition: MAX72XX.h:334
Digit 5 (encode or segment data).
Definition: MAX72XX.h:336
Decode Mode (0..255, digit bitset).
Definition: MAX72XX.h:339
static const uint8_t WIDTH
Definition: MAX72XX.h:49
Digit 4 (encode or segment data).
Definition: MAX72XX.h:335
GPIO< SCE_PIN > m_sce
Chip enable pin.
Definition: MAX72XX.h:375
virtual void display_on()
Definition: MAX72XX.h:223
No-operation.
Definition: MAX72XX.h:330
virtual void display_clear()
Definition: MAX72XX.h:241
Shutdown mode.
Definition: MAX72XX.h:363
virtual bool begin()
Definition: MAX72XX.h:186
SRPO< MSBFIRST, SDIN_PIN, SCLK_PIN > m_srpo
Serial output.
Definition: MAX72XX.h:376
Digit 2 (encode or segment data).
Definition: MAX72XX.h:333
MAX72XX(const uint8_t *font=NULL)
Definition: MAX72XX.h:73
Code B decode for digits 7-0.
Definition: MAX72XX.h:372
uint8_t m_mode
Text mode.
Definition: LCD.h:207
char m_latest
Latest character code.
Definition: MAX72XX.h:378
virtual void cursor_home()
Definition: LCD.h:145
Intensity (0..15, level).
Definition: MAX72XX.h:340
Device()
Definition: LCD.h:31
Digit 0 (encode or segment data).
Definition: MAX72XX.h:331
static const uint8_t HEIGHT
Definition: MAX72XX.h:50
No decode for digits 7-0.
Definition: MAX72XX.h:371