Control Surface  1.2.0
MIDI Control Surface library for Arduino
MAX7219SevenSegmentDisplay.hpp
Go to the documentation of this file.
1 #pragma once
2 
4 AH_DIAGNOSTIC_WERROR() // Enable errors on warnings
5 
6 #include "MAX7219_Base.hpp"
7 
9 
22 static constexpr uint8_t SevenSegmentCharacters[0x40] = {
23  0b00000000, 0b01110111, 0b00011111, 0b01001110, // @ A B C
24  0b00111101, 0b01001111, 0b01000111, 0b01011110, // D E F G
25  0b00010111, 0b00110000, 0b00111100, 0b00000111, // H I J K
26  0b00001110, 0b01110110, 0b00010101, 0b00011101, // L M N O
27  0b01100111, 0b01110011, 0b00000101, 0b01011011, // P Q R S
28  0b00001111, 0b00011100, 0b00100111, 0b00111110, // T U V W
29  0b00110111, 0b00111011, 0b01101101, 0b01001110, // X Y Z [
30  0b00010011, 0b01111000, 0b01100010, 0b00001000, // \ ] ^ _
31  0b00000000, 0b00000000, 0b00100010, 0b01100011, // ! " #
32  0b01011011, 0b01100111, 0b01111101, 0b00000010, // $ % & '
33  0b01001110, 0b01111000, 0b01100011, 0b00110001, // ( ) * +
34  0b00000100, 0b00000001, 0b00001000, 0b00100101, // , - . /
35  0b01111110, 0b00110000, 0b01101101, 0b01111001, // 0 1 2 3
36  0b00110011, 0b01011011, 0b01011111, 0b01110000, // 4 5 6 7
37  0b01111111, 0b01111011, 0b00000000, 0b01000100, // 8 9 : ;
38  0b00110001, 0b00001001, 0b00000111, 0b01100101, // < = > ?
39 };
40 
41 static constexpr const uint8_t *AlphaChars = &SevenSegmentCharacters[0x01];
42 static constexpr const uint8_t *NumericChars = &SevenSegmentCharacters[0x30];
43 
50  public:
59  MAX7219SevenSegmentDisplay(pin_t loadPin, uint8_t chainlength = 1)
60  : MAX7219_Base(loadPin, chainlength) {}
61 
64  void begin() { init(); }
65 
77  void sendDigit(uint16_t digit, uint8_t value) {
78  sendRaw((digit % 8) + 1, value, digit / 8);
79  }
80 
85  uint8_t getNumberOfDigits() const { return 8 * getChainLength(); }
86 
107  int16_t display(long number, int16_t startDigit = 0,
108  int16_t endDigit = -1) {
109  if (startDigit < 0)
110  startDigit += getNumberOfDigits();
111  if (endDigit < 0)
112  endDigit += getNumberOfDigits();
113  unsigned long anumber = abs(number);
114  int16_t i = startDigit;
115  do {
116  sendDigit(i++, NumericChars[anumber % 10]);
117  anumber /= 10;
118  } while (anumber && i <= endDigit);
119  if (number < 0 && i <= endDigit) {
120  sendDigit(i++, 0b00000001); // minus sign
121  }
122  if (anumber != 0) {
123  for (int16_t i = startDigit; i <= endDigit;)
124  sendDigit(i++, 0b00000001);
125  } else {
126  // clear unused digits within range
127  while (i <= endDigit)
128  sendDigit(i++, 0b00000000);
129  }
130  return endDigit - startDigit;
131  }
132 
134  int16_t display(int number, int16_t startDigit = 0, int16_t endDigit = -1) {
135  return display(long(number), startDigit, endDigit);
136  }
137 
158  int16_t display(unsigned long number, int16_t startDigit = 0,
159  int16_t endDigit = -1) {
160  if (startDigit < 0)
161  startDigit += getNumberOfDigits();
162  if (endDigit < 0)
163  endDigit += getNumberOfDigits();
164  int16_t i = startDigit;
165  do {
166  sendDigit(i++, NumericChars[number % 10]);
167  number /= 10;
168  } while (number && i <= endDigit);
169  if (number != 0) {
170  for (int16_t i = startDigit; i <= endDigit;)
171  sendDigit(i++, 0b00000001);
172  } else {
173  // clear unused digits within range
174  while (i <= endDigit)
175  sendDigit(i++, 0b00000000);
176  }
177  return endDigit - startDigit;
178  }
179 
181  int16_t display(unsigned int number, int16_t startDigit = 0,
182  int16_t endDigit = -1) {
183  return display((unsigned long)(number), startDigit, endDigit);
184  }
185 
196  int16_t display(const char *text, int16_t startPos = 0) {
197  if (startPos < 0)
198  startPos += getNumberOfDigits();
199  int16_t i = getNumberOfDigits() - startPos;
200  char prevD = '\0';
201  while (*text && (i > 0 || *text == '.')) {
202  char c = *text++;
203  uint8_t d = 0;
204  if (c == '.') {
205  if (prevD) {
206  sendDigit(i, prevD | 0b10000000);
207  prevD = '\0';
208  continue;
209  } else {
210  sendDigit(--i, 0b10000000);
211  continue;
212  }
213  } else if (c >= '@' && c <= '_')
214  d = SevenSegmentCharacters[(uint8_t)c - '@'];
215  else if (c >= '!' && c <= '?')
216  d = SevenSegmentCharacters[(uint8_t)c];
217  else if (c >= 'a' && c <= 'z')
218  d = SevenSegmentCharacters[(uint8_t)c - 'a' + 'A' - '@'];
219  sendDigit(--i, d);
220  prevD = d;
221  }
222  return getNumberOfDigits() - i - startPos;
223  }
224 
233  void printHexChar(int16_t digit, uint8_t value) {
234  if (digit < 0)
235  digit += getNumberOfDigits();
236  value &= 0x0F;
237  uint8_t c = value >= 0x0A //
238  ? AlphaChars[value - 0x0A]
239  : NumericChars[value];
240  sendDigit(digit, c);
241  }
242 
261  int16_t displayHex(unsigned long number, int16_t startDigit = 0,
262  int16_t endDigit = -1) {
263  if (startDigit < 0)
264  startDigit += getNumberOfDigits();
265  if (endDigit < 0)
266  endDigit += getNumberOfDigits();
267  int16_t i = startDigit;
268  do {
269  printHexChar(i++, uint8_t(number));
270  number >>= 4;
271  } while (number && i <= endDigit);
272  if (number != 0) {
273  for (int16_t i = startDigit; i <= endDigit;)
274  sendDigit(i++, 0b00000001);
275  } else {
276  // clear unused digits within range
277  while (i <= endDigit)
278  sendDigit(i++, 0b00000000);
279  }
280  return endDigit - startDigit;
281  }
282 };
283 
285 
AH::AlphaChars
static constexpr const uint8_t * AlphaChars
Definition: MAX7219SevenSegmentDisplay.hpp:41
AH::MAX7219SevenSegmentDisplay::begin
void begin()
Initialize.
Definition: MAX7219SevenSegmentDisplay.hpp:64
AH::MAX7219SevenSegmentDisplay
A class for 8-digit 7-segment displays with a MAX7219 driver.
Definition: MAX7219SevenSegmentDisplay.hpp:49
AH::MAX7219SevenSegmentDisplay::MAX7219SevenSegmentDisplay
MAX7219SevenSegmentDisplay(pin_t loadPin, uint8_t chainlength=1)
Create a MAX7219SevenSegmentDisplay.
Definition: MAX7219SevenSegmentDisplay.hpp:59
AH::MAX7219_Base
A base class for classes that control MAX7219 LED drivers.
Definition: MAX7219_Base.hpp:23
Warnings.hpp
AH::pin_t
uint16_t pin_t
The type for Arduino pins (and ExtendedIOElement pins).
Definition: Hardware-Types.hpp:17
AH::MAX7219SevenSegmentDisplay::display
int16_t display(const char *text, int16_t startPos=0)
Display a string of text to the display.
Definition: MAX7219SevenSegmentDisplay.hpp:196
AH::MAX7219SevenSegmentDisplay::display
int16_t display(long number, int16_t startDigit=0, int16_t endDigit=-1)
Display a long integer to the display.
Definition: MAX7219SevenSegmentDisplay.hpp:107
AH_DIAGNOSTIC_POP
#define AH_DIAGNOSTIC_POP()
Definition: Warnings.hpp:36
AH::MAX7219SevenSegmentDisplay::printHexChar
void printHexChar(int16_t digit, uint8_t value)
Print a single hexadecimal digit.
Definition: MAX7219SevenSegmentDisplay.hpp:233
AH::MAX7219SevenSegmentDisplay::display
int16_t display(int number, int16_t startDigit=0, int16_t endDigit=-1)
Display a long integer to the display.
Definition: MAX7219SevenSegmentDisplay.hpp:134
AH::NumericChars
static constexpr const uint8_t * NumericChars
Definition: MAX7219SevenSegmentDisplay.hpp:42
AH::MAX7219SevenSegmentDisplay::display
int16_t display(unsigned long number, int16_t startDigit=0, int16_t endDigit=-1)
Display a long unsigned integer to the display.
Definition: MAX7219SevenSegmentDisplay.hpp:158
AH::MAX7219SevenSegmentDisplay::displayHex
int16_t displayHex(unsigned long number, int16_t startDigit=0, int16_t endDigit=-1)
Print a number to the display in hexadecimal format.
Definition: MAX7219SevenSegmentDisplay.hpp:261
AH::MAX7219SevenSegmentDisplay::display
int16_t display(unsigned int number, int16_t startDigit=0, int16_t endDigit=-1)
Display a long unsigned integer to the display.
Definition: MAX7219SevenSegmentDisplay.hpp:181
AH::MAX7219SevenSegmentDisplay::getNumberOfDigits
uint8_t getNumberOfDigits() const
Get the total number of digits in this chain of displays, i.e.
Definition: MAX7219SevenSegmentDisplay.hpp:85
AH_DIAGNOSTIC_WERROR
#define AH_DIAGNOSTIC_WERROR()
Definition: Warnings.hpp:35
BEGIN_AH_NAMESPACE
#define BEGIN_AH_NAMESPACE
Definition: AH/Settings/NamespaceSettings.hpp:9
END_AH_NAMESPACE
#define END_AH_NAMESPACE
Definition: AH/Settings/NamespaceSettings.hpp:10
AH::MAX7219SevenSegmentDisplay::sendDigit
void sendDigit(uint16_t digit, uint8_t value)
Set the value of a single digit.
Definition: MAX7219SevenSegmentDisplay.hpp:77
AH::SevenSegmentCharacters
static constexpr uint8_t SevenSegmentCharacters[0x40]
A lookup table for 7-segment characters, as specified by the Logic Control manual.
Definition: MAX7219SevenSegmentDisplay.hpp:22