#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
#define COL1 9
#define COL2 10
#define COL3 11
#define COL4 12
#define ROW1 A0
#define ROW2 A1
#define ROW3 A2
#define ROW4 A3
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);
pinMode(COL1, OUTPUT);
pinMode(COL2, OUTPUT);
pinMode(COL3, OUTPUT);
pinMode(COL4, OUTPUT);
pinMode(ROW1, INPUT_PULLUP);
pinMode(ROW2, INPUT_PULLUP);
pinMode(ROW3, INPUT_PULLUP);
pinMode(ROW4, INPUT_PULLUP);
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() {
uint8_t row, col;
for(uint8_t i = 0; i<4; i++) {
col = ~(1 << i)&0x0F;
digitalWrite(COL1, col & 0x01);
digitalWrite(COL2, (col >> 1) & 0x01);
digitalWrite(COL3, (col >> 2) & 0x01);
digitalWrite(COL4, (col >> 3) & 0x01);
delay(10);
row = (digitalRead(ROW1) << 3) | (digitalRead(ROW2) << 2) | (digitalRead(ROW3) << 1) | digitalRead(ROW4);
while(!digitalRead(ROW1) | !digitalRead(ROW2) | !digitalRead(ROW3) | !digitalRead(ROW4)) {
delay(10);
/*Serial.print("col: ");
Serial.print((col));
Serial.print(" row: ");
Serial.println((row));*/
}
/*Serial.print("key: ");
Serial.println(((row << 4) | col));*/
switch(((row << 4) | col)) {
case 0x7E: numeral=(numeral*10)+1; break;
case 0x7D: numeral=(numeral*10)+2; break;
case 0x7B: numeral=(numeral*10)+3; break;
case 0x77: Serial.println('A'); break;
case 0xBE: numeral=(numeral*10)+4; break;
case 0xBD: numeral=(numeral*10)+5; break;
case 0xBB: numeral=(numeral*10)+6; break;
case 0xDE: numeral=(numeral*10)+7; break;
case 0xDD: numeral=(numeral*10)+8; break;
case 0xDB: numeral=(numeral*10)+9; break;
case 0xED: numeral=(numeral*10); break;
default: break;
}
if(numeral > 99999999) numeral = 0;
delay(10);
}
}