Hi all
I've managed to wire up three seven segment, three digit displays to a HT16K33 running from my Arduino Mega.
My wiring is obviously right as the looped display (see code below) results in a pleasing display as can be seen here;
BUT...I cannot for the life of me figure out how to assign characters from the library in the sketch; when |I try I just get gibberish...even thogh the fact that the pins are set so that segments light up in a sensible "0-9 then the decimal" order would indicate my assignments are right.
I suspect it's somethign to do with the memory addresses I need to reference...can anyone aid me with a few lines that will direct numbers to individual digits on the displays...or better yet, how I can send a number from 0 to 255 to each of the red, green and blue displays?
Many thanks!
//Sketch to control 3x seven segment three digit displays
//each to display values 0-255 from three separate potentiometers.
#include <Wire.h>
const uint8_t addr = 0x70; // HT16K33 default address
uint16_t displayBuffer[8];
const uint8_t SevenSegmentASCII[96] = {
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) */
};
void setup() {
Wire.begin();
Wire.beginTransmission(addr);
Wire.write(0x20 | 1); // turn on oscillator
Wire.endTransmission();
setBrightness(15);
blink(0);
}
void loop() {
const int dTime = 50;
//Trying to write letters to the display, just on the red display - this bit not working so commented out
// for (int k = 0; k < 96; k++) {
// writeCharacter(1,SevenSegmentASCII[k]);
// show();
// delay(1000);
// clear();
//}
// Loop through all segments
// I edited this to reverse "k" and "i" - so I've learned that "i" is the segment and "k" the digit position.
for (int k = 0; k < 9; k++) {
for (int i = 0; i < 8; i++) {
displayBuffer[i] = 1 << k; //my inexperience with C fails me here..what is the shorthand "1<<k" doing?
show();
delay(dTime);
}
clear();
}
// Turn on all segments, one at a time
for (int i = 0; i < 8; i++) {
for (int k = 0; k < 9; k++) {
displayBuffer[i] |= 1 << k;
show();
delay(dTime);
}
}
// Test blinking
for (int i = 3 ; i > 0; i--) {
blink(i);
delay(2000);
}
blink(0); // Turn blinking off
// Test blanking
for (int i = 0; i < 10; i++) {
blank();
delay(dTime * 2);
}
// Test dimming
for (int i = 15; i >= 0; i--) {
setBrightness(i);
delay(dTime * 2);
}
clear();
setBrightness(15);
}
void show() {
Wire.beginTransmission(addr);
Wire.write(0x00); // start at address 0x0
for (int i = 0; i < 8; i++) {
Wire.write(displayBuffer[i] & 0xFF);
Wire.write(displayBuffer[i] >> 8);
}
Wire.endTransmission();
}
void clear() {
for (int i = 0; i < 8; i++) {
displayBuffer[i] = 0;
}
}
void setBrightness(uint8_t b) {
if (b > 15) return;
Wire.beginTransmission(addr);
Wire.write(0xE0 | b); // Dimming command
Wire.endTransmission();
}
void blank() {
static boolean blankOn;
Wire.beginTransmission(addr);
Wire.write(0x80 | blankOn); // Blanking / blinking command
Wire.endTransmission();
blankOn = !blankOn;
}
void blink(uint8_t b) {
if (b > 3) return;
Wire.beginTransmission(addr);
Wire.write(0x80 | b << 1 | 1); // Blinking / blanking command
Wire.endTransmission();
}
void writeCharacter(uint8_t dispNum, char c) {
uint8_t bufferN = (dispNum + 3) / 2;
switch (dispNum & 1) {
case (1): // Odd display #, no shift
displayBuffer[bufferN] &= 0xFF00;
displayBuffer[bufferN] |= pgm_read_word_near(SevenSegmentASCII + c) & 0xFF;
break;
case (0): // Even display #, shift right by 8
displayBuffer[bufferN] &= 0x00FF;
displayBuffer[bufferN] |= (pgm_read_word_near(SevenSegmentASCII + c) & 0xFF) << 8;
break;
}
}
void writeNumber(uint32_t n, uint8_t nDisp, uint8_t sDisp) {
if (sDisp + nDisp > 13) {
return;
}
for (int i = 1; i <= nDisp; i++) {
writeCharacter(sDisp + nDisp - i, (n % 10) + 48);
n /= 10;
}
}