byte out1l = 0; // last 2 digits, and 5 collumns ddcccccu ** with digits, if without PNP stage, 0 is on ** - u means unused
byte out1m = 0; // first 8 digits dddddddd
byte out1h = 0; // output to segments abcdefghx - x means decimal point
// byte order is: out1l, out1m, out1h, all lsb first
// D2 to D4 are shift register pins,, d2 - data, d3 - shift clk, d4 - storage clk
// d5 to d8 are row1 to row4
byte buttonstep = 0;
byte num = 0;
const PROGMEM byte sevseg[] = {0b11111100, 0b01100000, 0b11011010, 0b11110010, 0b01100110, 0b10110110, 0b10111110, 0b11100000, 0b11111110, 0b11110110};
String number = "";
uint16_t cislo = 0;
byte digstep = 0;
void setup() {
pinMode(2, OUTPUT); // dtin
pinMode(3, OUTPUT); // shclk
pinMode(4, OUTPUT); // stclk
pinMode(5, INPUT_PULLUP); // r1
pinMode(6, INPUT_PULLUP); // r2
pinMode(7, INPUT_PULLUP); // r3
pinMode(8, INPUT_PULLUP); // r4
pinMode(9, INPUT_PULLUP); // double zero
Serial.begin(9600);
//number = "1";
}
void loop() {
out1h = (~(pgm_read_byte(&sevseg[cislo])));
switch(buttonstep % 5) {
case 4:
out1l = out1l & 0b11000000;
out1l = out1l | 0b00111100;
break;
case 3:
out1l = out1l & 0b11000000;
out1l = out1l | 0b00111010;
break;
case 2:
out1l = out1l & 0b11000000;
out1l = out1l | 0b00110110;
break;
case 1:
out1l = out1l & 0b11000000;
out1l = out1l | 0b00101110;
break;
case 0:
out1l = out1l & 0b11000000;
out1l = out1l | 0b00011110;
break;
}
digitalWrite(4, LOW);
shiftOut(2, 3, LSBFIRST, out1l);
shiftOut(2, 3, LSBFIRST, out1m);
shiftOut(2, 3, LSBFIRST, out1h);
digitalWrite(4, HIGH);
if((!(digitalRead(5))) && (buttonstep % 5) == 0) {num = 7;}
if((!(digitalRead(5))) && (buttonstep % 5) == 1) {num = 8;}
if((!(digitalRead(5))) && (buttonstep % 5) == 2) {num = 9;}
if((!(digitalRead(5))) && (buttonstep % 5) == 3) {Serial.println("X/↑");}
if((!(digitalRead(5))) && (buttonstep % 5) == 4) {Serial.println("S/-");}
if((!(digitalRead(6))) && (buttonstep % 5) == 0) {num = 4;}
if((!(digitalRead(6))) && (buttonstep % 5) == 1) {num = 5;}
if((!(digitalRead(6))) && (buttonstep % 5) == 2) {num = 6;}
if((!(digitalRead(6))) && (buttonstep % 5) == 3) {Serial.println("PLU");}
if((!(digitalRead(6))) && (buttonstep % 5) == 4) {Serial.println("%");}
if((!(digitalRead(7))) && (buttonstep % 5) == 0) {num = 1;}
if((!(digitalRead(7))) && (buttonstep % 5) == 1) {num = 2;}
if((!(digitalRead(7))) && (buttonstep % 5) == 2) {num = 3;}
if((!(digitalRead(7))) && (buttonstep % 5) == 3) {Serial.println("A2");}
if((!(digitalRead(7))) && (buttonstep % 5) == 4) {Serial.println("ST");}
if((!(digitalRead(8))) && (buttonstep % 5) == 0) {Serial.println("C/on ");}
if((!(digitalRead(8))) && (buttonstep % 5) == 1) {num = 0;}
if((!(digitalRead(8))) && (buttonstep % 5) == 2) {Serial.println("#/off");}
if((!(digitalRead(8))) && (buttonstep % 5) == 3) {Serial.println("A1");}
if((!(digitalRead(8))) && (buttonstep % 5) == 4) {Serial.println("Tl");}
if((!(digitalRead(9)))) {Serial.println("00");}
buttonstep = buttonstep + 1;
if(num < 250) {
delay(500);
number += num;
num = 252;
return;
}
switch(digstep) {
case 0:
out1m = 0b10000000;
break;
case 1:
out1m = 0b01000000;
break;
case 2:
out1m = 0b00100000;
break;
case 3:
out1m = 0b00010000;
break;
case 4:
out1m = 0b00001000;
break;
case 5:
out1m = 0b00000100;
break;
case 6:
out1m = 0b00000010;
break;
case 7:
out1m = 0b00000001;
out1h = out1h | 1;
break;
case 8:
out1l = out1l & 0b00111111;
out1l = out1l | 0b10000000;
out1h = out1h & 0b11111110;
break;
case 9:
out1l = out1l & 0b00111111;
out1l = out1l | 0b01000000;
break;
}
byte addr = digstep;
cislo = ((number[(addr)]) - 48);
digstep = digstep + 1;
digstep = digstep % 10;
}
R4C1
R4C3
#/off
C/on