Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions src/LedControl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<valuel; i++) {
setChar(addr, i, value[valuel-i-1], points&(0x01<<i));
}
}

void LedControl::spiTransfer(int addr, volatile byte opcode, volatile byte data) {
//Create an array with the data to shift out
int offset=addr*2;
Expand Down
38 changes: 22 additions & 16 deletions src/LedControl.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,22 +40,22 @@
* 7-Segment Displays
*/
const static byte charTable [] PROGMEM = {
B01111110,B00110000,B01101101,B01111001,B00110011,B01011011,B01011111,B01110000,
B01111111,B01111011,B01110111,B00011111,B00001101,B00111101,B01001111,B01000111,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
B00000000,B00000000,B00000000,B00000000,B10000000,B00000001,B10000000,B00000000,
B01111110,B00110000,B01101101,B01111001,B00110011,B01011011,B01011111,B01110000,
B01111111,B01111011,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
B00000000,B01110111,B00011111,B00001101,B00111101,B01001111,B01000111,B00000000,
B00110111,B00000000,B00000000,B00000000,B00001110,B00000000,B00000000,B00000000,
B01100111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00001000,
B00000000,B01110111,B00011111,B00001101,B00111101,B01001111,B01000111,B00000000,
B00110111,B00000000,B00000000,B00000000,B00001110,B00000000,B00010101,B00011101,
B01100111,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,
B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000
/* */B01111110,/* */B00110000,/* */B01101101,/* */B01111001,/* */B00110011,/* */B01011011,/* */B01011111,/* */B01110000,
/* */B01111111,/* */B01111011,/* */B01110111,/* */B00011111,/* */B00001101,/* */B00111101,/* */B01001111,/* */B01000111,
/* */B00000000,/* */B00000000,/* */B00000000,/* */B00000000,/* */B00000000,/* */B00000000,/* */B00000000,/* */B00000000,
/* */B00000000,/* */B00000000,/* */B00000000,/* */B00000000,/* */B00000000,/* */B00000000,/* */B00000000,/* */B00000000,
/* */B00000000,/*!*/B00000000,/*"*/B00000000,/*#*/B00000000,/*$*/B00000000,/*%*/B00000000,/*&*/B00000000,/*'*/B00000000,
/*(*/B00000000,/*)*/B00000000,/***/B00000000,/*+*/B00000000,/*,*/B10000000,/*-*/B00000001,/*.*/B10000000,/*/*/B00000000,
/*0*/B01111110,/*1*/B00110000,/*2*/B01101101,/*3*/B01111001,/*4*/B00110011,/*5*/B01011011,/*6*/B01011111,/*7*/B01110000,
/*8*/B01111111,/*9*/B01111011,/*:*/B00000000,/*;*/B00000000,/*<*/B00000000,/*=*/B00000000,/*>*/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 {
Expand Down Expand Up @@ -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
Expand Down