diff --git a/src/LedControl.cpp b/src/LedControl.cpp index e43211fd..af4518e0 100644 --- a/src/LedControl.cpp +++ b/src/LedControl.cpp @@ -168,6 +168,39 @@ void LedControl::setDigit(int addr, int digit, byte value, boolean dp) { spiTransfer(addr, digit+1,v); } +#define NON_SIGNIFICANT_ZEROS_AWARE_SET(addr, pos, mask) { \ + if (flag) \ + setDigit(addr, pos, digit##pos, points & mask); \ + else { \ + if (digit##pos) { \ + setDigit(addr, pos, digit##pos, points & mask); \ + flag = true; \ + } \ + else setChar(addr, pos, ' ', points & mask); \ + } \ +} + +void LedControl::setNumber(int addr, unsigned long value, byte points) { + bool flag = false; + int trimmed = value % 100000000; + int digit0 = (trimmed % 10) / 1; + int digit1 = (trimmed % 100) / 10; + int digit2 = (trimmed % 1000) / 100; + int digit3 = (trimmed % 10000) / 1000; + int digit4 = (trimmed % 100000) / 10000; + int digit5 = (trimmed % 1000000) / 100000; + int digit6 = (trimmed % 10000000) / 1000000; + int digit7 = (trimmed % 100000000) / 10000000; + NON_SIGNIFICANT_ZEROS_AWARE_SET(addr, 7, 0x80) + NON_SIGNIFICANT_ZEROS_AWARE_SET(addr, 6, 0x40) + NON_SIGNIFICANT_ZEROS_AWARE_SET(addr, 5, 0x20) + NON_SIGNIFICANT_ZEROS_AWARE_SET(addr, 4, 0x10) + NON_SIGNIFICANT_ZEROS_AWARE_SET(addr, 3, 0x08) + NON_SIGNIFICANT_ZEROS_AWARE_SET(addr, 2, 0x04) + NON_SIGNIFICANT_ZEROS_AWARE_SET(addr, 1, 0x02) + setDigit(addr, 0, digit0, points & 0x01); +} + void LedControl::setChar(int addr, int digit, char value, boolean dp) { int offset; byte index,v; @@ -189,6 +222,16 @@ void LedControl::setChar(int addr, int digit, char value, boolean dp) { spiTransfer(addr, digit+1,v); } +void LedControl::setString(int addr, char* value, byte points) { + short valuel = strlen(value); + for (int i=0; i<8-valuel; i++) { + setChar(addr, 7-i, ' ', points&(0x01<<(7-i))); + } + for (int i=0; i<8 && i*/B00000000,/*?*/B00000000, + /*@*/B00000000,/*A*/B01110111,/*B*/B00011111,/*C*/B01001110,/*D*/B00111101,/*E*/B01001111,/*F*/B01000111,/*G*/B01011110, + /*H*/B00110111,/*I*/B00110000,/*J*/B00111000,/*K*/B00000000,/*L*/B00001110,/*M*/B00000000,/*N*/B00000000,/*O*/B01111110, + /*P*/B01100111,/*Q*/B00000000,/*R*/B00000000,/*S*/B01011011,/*T*/B00000000,/*U*/B00111110,/*V*/B00000000,/*W*/B00000000, + /*X*/B00000000,/*Y*/B00000000,/*Z*/B00000000,/*[*/B00000000,/*\*/B00000000,/*]*/B00000000,/*^*/B00000000,/*_*/B00001000, + /*`*/B00000000,/*a*/B01110111,/*b*/B00011111,/*c*/B00001101,/*d*/B00111101,/*e*/B01001111,/*f*/B01000111,/*g*/B01011110, + /*h*/B00010111,/*i*/B00010000,/*j*/B00000000,/*k*/B00000000,/*l*/B00001110,/*m*/B00000000,/*n*/B00010101,/*o*/B00011101, + /*p*/B01100111,/*q*/B00000000,/*r*/B00000101,/*s*/B01011011,/*t*/B00000000,/*u*/B00011100,/*v*/B00000000,/*w*/B00000000, + /*x*/B00000000,/*y*/B00000000,/*z*/B00000000,/*{*/B00000000,/*|*/B00000000,/*}*/B00000000,/*~*/B00000000,/* */B00000000 }; class LedControl { @@ -182,6 +182,12 @@ class LedControl { * dp sets the decimal point. */ void setChar(int addr, int digit, char value, boolean dp); + + /* + */ + void setNumber(int addr, unsigned long value, byte points); + + void setString(int addr, char* value, byte points); }; #endif //LedControl.h