//################# ALLGEMEIN #################//
const int EinerBtn = 5;
const int ZehnBtn = 6;
const int HunBtn = 7;
int sAddress = 1;
int Einer;
int Zehner;
int Hunterter;
//################# SERIELL #################//
const int sDS_Pin = 2;
const int sSTCP_Pin = 4;
const int sSHCP_Pin = 3;
//################# PARALLEL #################//
const int pDS_Pin = 10;
const int pSTCP_Pin = 11;
const int pSHCP_Pin = 12;
//01111111 = 127 D1
//10111111 = 191 D2
//11011111 = 223 D3
const int pButtons_Pin = 9;
int pButtons[3] = {LOW, LOW, LOW};
int pButtonsTemp [3] = {LOW,LOW,LOW};
int pAddress = 1;
int LED1 = A0;
int LED10 = A1;
int LED100 = A2;
//################# NUMBERS #################//
//10000000 = 128 DP
//1111 1111 = OFF = 0xff
//1000 0001 = 0 = 0x81
//1100 1111 = 1 = 0xcf
//1001 0010 = 2 = 0x92
//1000 0110 = 3 = 0x86
//1100 1100 = 4 = 0xcc
//1010 0100 = 5 = 0xa4
//1010 0000 = 6 = 0xa0
//1000 1111 = 7 = 0x8f
//1000 0000 = 8 = 0x80
//1000 0100 = 9 = 0x84
byte newDigits[10]{0x81,0xcf,0x92,0x86,0xcc,0xa4,0xa0,0x8f,0x80,0x84};
//0010 0111 = Display 1 = 0x27
//0100 1011 = Display 10 = 0x4b
//1000 1101 = Display 100 = 0x8d
byte pDisplays[3]{0x27,0x4b,0x8d};
//##################################//
//int Addr;
int lastEiner;
int lastZehner;
int lastHunterter;
int Eins;
int Zehn;
int Hundert;
int tempEins;
int tempZehn;
int tempHundert;
bool AddrSaved = false;
bool lol = false;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(sDS_Pin, OUTPUT);
pinMode(sSTCP_Pin, OUTPUT);
pinMode(sSHCP_Pin, OUTPUT);
pinMode(pDS_Pin, OUTPUT);
pinMode(pSTCP_Pin, OUTPUT);
pinMode(pSHCP_Pin, OUTPUT);
pinMode(pButtons_Pin, INPUT_PULLUP);
pinMode(LED1, OUTPUT);
pinMode(LED10, OUTPUT);
pinMode(LED100, OUTPUT);
pinMode(EinerBtn, INPUT);
pinMode(ZehnBtn, INPUT);
pinMode(HunBtn, INPUT);
}
void loop() {
//sAddress = AddCounter(digitalRead(EinerBtn), digitalRead(ZehnBtn), digitalRead(HunBtn));
sDisplayDigit(sAddress);
pDisplayDigit(pAddress);
pAddress = AddCounter(pButtons[0], pButtons[1], pButtons[2]);
AddrSaved = Saved(pAddress, pButtons[0] | pButtons[1] | pButtons[2]);
//Serial.println("Saved is: " + String(AddrSaved));
digitalWrite(LED1, AddrSaved);
digitalWrite(LED10, pButtons[1]);
digitalWrite(LED100, pButtons[2]);
}
void sDisplayDigit(int Add){
digitalWrite(sSTCP_Pin,LOW);
shiftOut(sDS_Pin, sSHCP_Pin, LSBFIRST, newDigits[(Add / 1) % 10]);
shiftOut(sDS_Pin, sSHCP_Pin, LSBFIRST, newDigits[(Add / 10) % 10]);
shiftOut(sDS_Pin, sSHCP_Pin, LSBFIRST, newDigits[(Add / 100) % 10]);
digitalWrite(sSTCP_Pin,HIGH );
}
void pDisplayDigit(int Add){
byte digs[3]{newDigits[Eins], newDigits[Zehn], newDigits[Hundert]};
//int pDisplays[3]{127,191,223};
//int pDisplays[3]{208,168,100};
//11010000, 10101000, 01100100
for (int i = 0; i < 3; i++){
digitalWrite(pSTCP_Pin,LOW);
shiftOut(pDS_Pin, pSHCP_Pin, LSBFIRST, pDisplays[i]);
shiftOut(pDS_Pin, pSHCP_Pin, LSBFIRST, digs[i]);
digitalWrite(pSTCP_Pin,HIGH);
pButtons[i] = !digitalRead(pButtons_Pin);
}
//pButtons[0] = pButtonsTemp[0];
//pButtons[1] = pButtonsTemp[1];
//pButtons[2] = pButtonsTemp[2];
}
int AddCounter (int BtnEiner, int BtnZehner, int BtnHunderter){
int tempAddr;
if (BtnEiner == HIGH && lastEiner == LOW){
Eins += 1;
if (Eins > 9 | ( Eins > 2 & Zehn >= 1 & Hundert == 5)){
Eins = 0;
}
}else if (BtnZehner == HIGH && lastZehner == LOW){
Zehn += 1;
if (Zehn > 9 | (Zehn > 1 & Hundert == 5) ){
Zehn = 0;
}
}else if (BtnHunderter == HIGH && lastHunterter == LOW){
Hundert += 1;
if (Hundert > 5| Zehn > 1 & Hundert == 5 ){
Hundert = 0;
}
}
lastEiner = BtnEiner;
lastZehner = BtnZehner;
lastHunterter = BtnHunderter;
tempAddr = Eins + (10 * Zehn) + (100 * Hundert);
if (tempAddr > 512 ){
Eins = 2;
Zehn = 1;
Hundert = 5;
}else if (tempAddr < 1){
Eins = 1;
Zehn = 0;
Hundert = 0;
}
int Addr = Eins + (10 * Zehn) + (100 * Hundert);;
return Addr;
}
bool Saved(int Addr, bool BtnPressed){
static unsigned long lastMillis = 0;
static bool saved = true;
static bool lastBtnPressed = false;
const long WaitTime = 3000;
static bool StartTimer = true;
long NewMillis = millis();
if (BtnPressed == false & lastBtnPressed == true){
lastMillis = NewMillis;
saved = false;
StartTimer = true;
Serial.println("Addr changed! Start Timer");
}else if (BtnPressed == true & StartTimer == true){
StartTimer = false;
Serial.println("Abort timer");
}
lastBtnPressed = BtnPressed;
if ( saved == false & StartTimer == true & NewMillis - lastMillis >= WaitTime ){
saved = true;
StartTimer = false;
Serial.println("Addr saved!");
}
return saved;
}//End_Void