#define OUT_EN_PIN 4
#define CLOCK_PIN 5
#define LATCH_PIN 6
#define SDATA_PIN 7
#define RESET_PIN 8
#define DOT 128
#define DISP_0 0x3F // 0xC0
#define DISP_1 0x06 // 0xF9
#define DISP_2 0x5B // 0xA4
#define DISP_3 0x4F // 0xB0
#define DISP_4 0x66 // 0x99
#define DISP_5 0x6D // 0x92
#define DISP_6 0x7D // 0x82
#define DISP_7 0x07 // 0xF8
#define DISP_8 0x7F // 0x80
#define DISP_9 0x6F // 0x90
const uint8_t number[10] = {DISP_0, DISP_1, DISP_2,
DISP_3, DISP_4, DISP_5, DISP_6, DISP_7, DISP_8, DISP_9};
volatile uint32_t numeral = 0;
void displayNumber(uint32_t num) {
uint8_t index = 0;
if(num) {
for(int i = 0; i<8; i++) {
index = num%10;
num = num/10;
if(!(num | index)) break;
digitalWrite(LATCH_PIN, LOW);
shiftOut(SDATA_PIN, CLOCK_PIN, MSBFIRST, number[index]);
shiftOut(SDATA_PIN, CLOCK_PIN, LSBFIRST, ~(0x01 << i));
digitalWrite(LATCH_PIN, HIGH);
}
} else {
digitalWrite(LATCH_PIN, LOW);
shiftOut(SDATA_PIN, CLOCK_PIN, MSBFIRST, number[index]);
shiftOut(SDATA_PIN, CLOCK_PIN, LSBFIRST, ~0x01);
digitalWrite(LATCH_PIN, HIGH);
}
}
void setup() {
/*Serial.begin(115200);
while(!Serial) yield();
Serial.println("Serial begin");*/
pinMode(OUT_EN_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
pinMode(LATCH_PIN, OUTPUT);
pinMode(SDATA_PIN, OUTPUT);
pinMode(RESET_PIN, OUTPUT);
digitalWrite(OUT_EN_PIN, LOW);
digitalWrite(RESET_PIN, HIGH);
digitalWrite(LATCH_PIN, LOW);
shiftOut(SDATA_PIN, CLOCK_PIN, MSBFIRST, number[8] | DOT);
shiftOut(SDATA_PIN, CLOCK_PIN, LSBFIRST, ~0xFF);
digitalWrite(LATCH_PIN, HIGH);
delay(1000);
digitalWrite(LATCH_PIN, LOW);
shiftOut(SDATA_PIN, CLOCK_PIN, MSBFIRST, 0);
shiftOut(SDATA_PIN, CLOCK_PIN, LSBFIRST, ~0xFF);
digitalWrite(LATCH_PIN, HIGH);
delay(800);
for(int i = 0; i < 8; i++) {
for(int j = 0; j < 8; j++) {
digitalWrite(LATCH_PIN, LOW);
shiftOut(SDATA_PIN, CLOCK_PIN, MSBFIRST, 1 << j);
shiftOut(SDATA_PIN, CLOCK_PIN, LSBFIRST, ~(1 << i));
digitalWrite(LATCH_PIN, HIGH);
delay(70);
}
}
// TIMER 1 for interrupt frequency 25 Hz:
cli(); // stop interrupts
TCCR1A = 0; // set entire TCCR1A register to 0
TCCR1B = 0; // same for TCCR1B
TCNT1 = 0; // initialize counter value to 0
// set compare match register for 25 Hz increments
OCR1A = 9999; // = 16000000 / (64 * 25) - 1 (must be <65536)
// turn on CTC mode
TCCR1B |= (1 << WGM12);
// Set CS12, CS11 and CS10 bits for 64 prescaler
TCCR1B |= (0 << CS12) | (1 << CS11) | (1 << CS10);
// enable timer compare interrupt
TIMSK1 |= (1 << OCIE1A);
sei(); // allow interrupts
delay(100);
}
ISR(TIMER1_COMPA_vect) {
displayNumber(numeral);
}
void loop() {
numeral = random(0, 9);;
delay(700);
numeral = random(0, 99);;
delay(700);
numeral = random(0, 999);;
delay(700);
numeral = random(0, 9999);;
delay(700);
numeral = random(0, 99999);;
delay(700);
numeral = random(0, 999999);;
delay(700);
numeral = random(0, 9999999);;
delay(700);
numeral = random(0, 99999999);;
delay(700);
numeral = 0;
delay(800);
/*for(uint32_t i = 100000000; i > 0; --i) {
displayNumber(i);
delay(100);
}*/
}