Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added ASCII and string support for 7-segment backpack #41

Merged
merged 13 commits into from
Oct 6, 2021
198 changes: 171 additions & 27 deletions Adafruit_LEDBackpack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,26 +51,107 @@
} ///< 16-bit var swap
#endif

static const uint8_t numbertable[] = {
0x3F, /* 0 */
0x06, /* 1 */
0x5B, /* 2 */
0x4F, /* 3 */
0x66, /* 4 */
0x6D, /* 5 */
0x7D, /* 6 */
0x07, /* 7 */
0x7F, /* 8 */
0x6F, /* 9 */
0x77, /* a */
0x7C, /* b */
0x39, /* C */
0x5E, /* d */
0x79, /* E */
0x71, /* F */
static const PROGMEM uint8_t sevensegfonttable[] = {

0b00000000, // (space)
0b10000110, // !
0b00100010, // "
0b01111110, // #
0b01101101, // $
0b11010010, // %
0b01000110, // &
0b00100000, // '
0b00101001, // (
0b00001011, // )
0b00100001, // *
0b01110000, // +
0b00010000, // ,
0b01000000, // -
0b10000000, // .
0b01010010, // /
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111, // 9
0b00001001, // :
0b00001101, // ;
0b01100001, // <
0b01001000, // =
0b01000011, // >
0b11010011, // ?
0b01011111, // @
0b01110111, // A
0b01111100, // B
0b00111001, // C
0b01011110, // D
0b01111001, // E
0b01110001, // F
0b00111101, // G
0b01110110, // H
0b00110000, // I
0b00011110, // J
0b01110101, // K
0b00111000, // L
0b00010101, // M
0b00110111, // N
0b00111111, // O
0b01110011, // P
0b01101011, // Q
0b00110011, // R
0b01101101, // S
0b01111000, // T
0b00111110, // U
0b00111110, // V
0b00101010, // W
0b01110110, // X
0b01101110, // Y
0b01011011, // Z
0b00111001, // [
0b01100100, //
0b00001111, // ]
0b00100011, // ^
0b00001000, // _
0b00000010, // `
0b01011111, // a
0b01111100, // b
0b01011000, // c
0b01011110, // d
0b01111011, // e
0b01110001, // f
0b01101111, // g
0b01110100, // h
0b00010000, // i
0b00001100, // j
0b01110101, // k
0b00110000, // l
0b00010100, // m
0b01010100, // n
0b01011100, // o
0b01110011, // p
0b01100111, // q
0b01010000, // r
0b01101101, // s
0b01111000, // t
0b00011100, // u
0b00011100, // v
0b00010100, // w
0b01110110, // x
0b01101110, // y
0b01011011, // z
0b01000110, // {
0b00110000, // |
0b01110000, // }
0b00000001, // ~
0b00000000, // del
};

static const uint16_t alphafonttable[] PROGMEM = {
static const PROGMEM uint16_t alphafonttable[] = {

0b0000000000000001, 0b0000000000000010, 0b0000000000000100,
0b0000000000001000, 0b0000000000010000, 0b0000000000100000,
Expand Down Expand Up @@ -479,15 +560,19 @@ void Adafruit_BicolorMatrix::drawPixel(int16_t x, int16_t y, uint16_t color) {

Adafruit_7segment::Adafruit_7segment(void) { position = 0; }

void Adafruit_7segment::print(const String &c) { write(c.c_str(), c.length()); }

void Adafruit_7segment::print(const char c[]) { write(c, strlen(c)); }

void Adafruit_7segment::print(char c) { write(c); }

void Adafruit_7segment::print(unsigned long n, int base) {
if (base == 0)
write(n);
else
printNumber(n, base);
}

void Adafruit_7segment::print(char c, int base) { print((long)c, base); }

void Adafruit_7segment::print(unsigned char b, int base) {
print((unsigned long)b, base);
}
Expand All @@ -500,8 +585,18 @@ void Adafruit_7segment::print(unsigned int n, int base) {

void Adafruit_7segment::println(void) { position = 0; }

void Adafruit_7segment::println(char c, int base) {
print(c, base);
void Adafruit_7segment::println(const String &c) {
print(c);
println();
}

void Adafruit_7segment::println(const char c[]) {
print(c);
println();
}

void Adafruit_7segment::println(char c) {
print(c);
println();
}

Expand Down Expand Up @@ -537,7 +632,7 @@ void Adafruit_7segment::println(double n, int digits) {

void Adafruit_7segment::print(double n, int digits) { printFloat(n, digits); }

size_t Adafruit_7segment::write(uint8_t c) {
size_t Adafruit_7segment::write(char c) {

uint8_t r = 0;

Expand All @@ -546,8 +641,8 @@ size_t Adafruit_7segment::write(uint8_t c) {
if (c == '\r')
position = 0;

if ((c >= '0') && (c <= '9')) {
writeDigitNum(position, c - '0');
if ((c >= ' ') && (c <= 127)) {
writeDigitAscii(position, c);
r = 1;
}

Expand All @@ -558,6 +653,22 @@ size_t Adafruit_7segment::write(uint8_t c) {
return r;
}

size_t Adafruit_7segment::write(const char *buffer, size_t size) {
size_t n = 0;

while (n < size) {
write(buffer[n]);
n++;
}

// Clear unwritten positions
for (uint8_t i = position; i < 5; i++) {
writeDigitRaw(i, 0x00);
}

return n;
}

void Adafruit_7segment::writeDigitRaw(uint8_t d, uint8_t bitmask) {
if (d > 4)
return;
Expand All @@ -581,11 +692,44 @@ void Adafruit_7segment::writeColon(void) {
i2c_dev->write(buffer, 3);
}

void Adafruit_7segment::writeDigitNum(uint8_t d, uint8_t num, bool dot) {
void Adafruit_7segment::writeDigitNum(uint8_t d, uint8_t num, boolean dot) {
if (d > 4 || num > 15)
return;

if (num >= 10) { // Hex characters
switch (num) {
case 10:
writeDigitAscii(d, 'a', dot);
break;
case 11:
writeDigitAscii(d, 'B', dot);
break;
case 12:
writeDigitAscii(d, 'C', dot);
break;
case 13:
writeDigitAscii(d, 'd', dot);
break;
case 14:
writeDigitAscii(d, 'E', dot);
break;
case 15:
writeDigitAscii(d, 'F', dot);
break;
}
}

else
writeDigitAscii(d, num + 48, dot); // use ASCII offset
}

void Adafruit_7segment::writeDigitAscii(uint8_t d, uint8_t c, boolean dot) {
if (d > 4)
return;

writeDigitRaw(d, numbertable[num] | (dot << 7));
uint8_t font = pgm_read_byte(sevensegfonttable + c - 32);

writeDigitRaw(d, font | (dot << 7));
}

void Adafruit_7segment::print(long n, int base) { printNumber(n, base); }
Expand Down
54 changes: 46 additions & 8 deletions Adafruit_LEDBackpack.h
Original file line number Diff line number Diff line change
Expand Up @@ -220,18 +220,25 @@ class Adafruit_7segment : public Adafruit_LEDBackpack {
Adafruit_7segment(void);

/*!
@brief Issue single digit to display.
@param c Digit to write (ASCII character, not numeric).
@return 1 if character written, else 0 (non-digit characters).
@brief Issue single character to display.
@param c Character to write (ASCII character, not numeric).
@return 1 if character written, else 0 (non-ASCII characters).
*/
size_t write(uint8_t c);
size_t write(char c);

/*!
@brief Write characters from buffer to display.
@param buffer Character array to write
@param size Number of characters to write
@return Number of characters written
*/
size_t write(const char *buffer, size_t size);

/*!
@brief Print byte-size numeric value to 7-segment display.
@param c Numeric value.
@param base Number base (default = RAW_BITS = raw bits)
*/
void print(char c, int base = RAW_BITS);
void print(char c);

/*!
@brief Print unsigned byte-size numeric value to 7-segment display.
Expand Down Expand Up @@ -275,12 +282,23 @@ class Adafruit_7segment : public Adafruit_LEDBackpack {
*/
void print(double n, int digits = 2);

/*!
@brief Print from a String object to 7-segment display.
@param c String object, passed by reference.
*/
void print(const String &c);

/*!
@brief Print from a C-style string array to 7-segment display.
@param c Array of characters.
*/
void print(const char c[]);

/*!
@brief Print byte-size numeric value w/newline to 7-segment display.
@param c Numeric value.
@param base Number base (default = RAW_BITS = raw bits)
*/
void println(char c, int base = RAW_BITS);
void println(char c);

/*!
@brief Print unsigned byte-size numeric value w/newline to 7-segment
Expand Down Expand Up @@ -325,6 +343,18 @@ class Adafruit_7segment : public Adafruit_LEDBackpack {
*/
void println(double n, int digits = 2);

/*!
@brief Print from a String object w/newline to 7-segment display.
@param c String object, passed by reference.
*/
void println(const String &c);

/*!
@brief Print from a C-style string array w/newline to 7-segment display.
@param c Array of characters.
*/
void println(const char c[]);

/*!
@brief Print newline to 7-segment display (rewind position to start).
*/
Expand All @@ -345,6 +375,14 @@ class Adafruit_7segment : public Adafruit_LEDBackpack {
*/
void writeDigitNum(uint8_t x, uint8_t num, bool dot = false);

/*!
@brief Set specific digit # to a character value.
@param x Character position.
@param c Character (ASCII).
@param dot If true, light corresponding decimal.
*/
void writeDigitAscii(uint8_t x, uint8_t c, bool dot = false);

/*!
@brief Set or unset colon segment.
@param state 'true' to enable colon, 'false' for off.
Expand Down
5 changes: 5 additions & 0 deletions examples/sevenseg/sevenseg.ino
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@ void loop() {
matrix.print(12.34);
matrix.writeDisplay();
delay(500);

// print a string message
matrix.print("7SEG");
matrix.writeDisplay();
delay(10000);

// print with print/println
for (uint16_t counter = 0; counter < 9999; counter++) {
Expand Down