// BCD IC A (ones digit)
const int bcdA_A = 22;
const int bcdA_B = 24;
const int bcdA_C = 26;
const int bcdA_D = 28;
// BCD IC B (tens digit)
const int bcdB_A = 30;
const int bcdB_B = 32;
const int bcdB_C = 34;
const int bcdB_D = 36;
// BCD IC C (hundreds digit)
const int bcdC_A = 38;
const int bcdC_B = 40;
const int bcdC_C = 42;
const int bcdC_D = 44;
// BCD IC D (thousands digit)
const int bcdD_A = 46;
const int bcdD_B = 48;
const int bcdD_C = 50;
const int bcdD_D = 52;
const int start_stop = 10;
const int increment = 11;
const int decrement = 12;
int counterValue = 0;
boolean isCounting = false;
boolean lastActionIncrement = true;
void setup() {
// BCD IC A (ones digit)
pinMode(bcdA_A, OUTPUT);
pinMode(bcdA_B, OUTPUT);
pinMode(bcdA_C, OUTPUT);
pinMode(bcdA_D, OUTPUT);
// BCD IC B (tens digit)
pinMode(bcdB_A, OUTPUT);
pinMode(bcdB_B, OUTPUT);
pinMode(bcdB_C, OUTPUT);
pinMode(bcdB_D, OUTPUT);
// BCD IC C (hundreds digit)
pinMode(bcdC_A, OUTPUT);
pinMode(bcdC_B, OUTPUT);
pinMode(bcdC_C, OUTPUT);
pinMode(bcdC_D, OUTPUT);
// BCD IC D (thousands digit)
pinMode(bcdD_A, OUTPUT);
pinMode(bcdD_B, OUTPUT);
pinMode(bcdD_C, OUTPUT);
pinMode(bcdD_D, OUTPUT);
pinMode(start_stop, INPUT);
pinMode(increment, INPUT);
pinMode(decrement, INPUT);
displayCounter();
}
void loop() {
if (digitalRead(start_stop) == HIGH) {
if (!isCounting) {
// Start counting
isCounting = true;
} else {
// Stop counting
isCounting = false;
}
delay(200);
}
if (isCounting) {
if (lastActionIncrement) {
counterValue++;
if (counterValue > 9999) {
counterValue = 0;
}
} else {
counterValue--;
if (counterValue < 0) {
counterValue = 9999;
}
}
displayCounter();
delay(200);
}
if (digitalRead(increment) == HIGH && !isButtonHeld(increment)) {
lastActionIncrement = true;
if (!isCounting) {
counterValue++;
if (counterValue > 9999) {
counterValue = 0;
}
displayCounter();
}
delay(200);
}
if (digitalRead(decrement) == HIGH && !isButtonHeld(decrement)) {
lastActionIncrement = false;
if (!isCounting) {
counterValue--;
if (counterValue < 0) {
counterValue = 9999;
}
displayCounter();
}
delay(200);
}
}
bool isButtonHeld(int buttonPin) {
int holdThreshold = 1000;
int holdDelay = 50;
int holdCount = holdThreshold / holdDelay;
for (int i = 0; i < holdCount; i++) {
delay(holdDelay);
if (digitalRead(buttonPin) == LOW) {
return false;
}
}
return true;
}
void displayCounter() {
int ones = counterValue % 10;
int tens = (counterValue / 10) % 10;
int hundreds = (counterValue / 100) % 10;
int thousands = (counterValue / 1000) % 10;
switch (ones) {
case 0:
digitalWrite(bcdA_A, LOW);
digitalWrite(bcdA_B, LOW);
digitalWrite(bcdA_C, LOW);
digitalWrite(bcdA_D, LOW);
break;
case 1:
digitalWrite(bcdA_A, HIGH);
digitalWrite(bcdA_B, LOW);
digitalWrite(bcdA_C, LOW);
digitalWrite(bcdA_D, LOW);
break;
case 2:
digitalWrite(bcdA_A, LOW);
digitalWrite(bcdA_B, HIGH);
digitalWrite(bcdA_C, LOW);
digitalWrite(bcdA_D, LOW);
break;
case 3:
digitalWrite(bcdA_A, HIGH);
digitalWrite(bcdA_B, HIGH);
digitalWrite(bcdA_C, LOW);
digitalWrite(bcdA_D, LOW);
break;
case 4:
digitalWrite(bcdA_A, LOW);
digitalWrite(bcdA_B, LOW);
digitalWrite(bcdA_C, HIGH);
digitalWrite(bcdA_D, LOW);
break;
case 5:
digitalWrite(bcdA_A, HIGH);
digitalWrite(bcdA_B, LOW);
digitalWrite(bcdA_C, HIGH);
digitalWrite(bcdA_D, LOW);
break;
case 6:
digitalWrite(bcdA_A, LOW);
digitalWrite(bcdA_B, HIGH);
digitalWrite(bcdA_C, HIGH);
digitalWrite(bcdA_D, LOW);
break;
case 7:
digitalWrite(bcdA_A, HIGH);
digitalWrite(bcdA_B, HIGH);
digitalWrite(bcdA_C, HIGH);
digitalWrite(bcdA_D, LOW);
break;
case 8:
digitalWrite(bcdA_A, LOW);
digitalWrite(bcdA_B, LOW);
digitalWrite(bcdA_C, LOW);
digitalWrite(bcdA_D, HIGH);
break;
case 9:
digitalWrite(bcdA_A, HIGH);
digitalWrite(bcdA_B, LOW);
digitalWrite(bcdA_C, LOW);
digitalWrite(bcdA_D, HIGH);
break;
}
// Display tens digit
switch (tens) {
case 0:
digitalWrite(bcdB_A, LOW);
digitalWrite(bcdB_B, LOW);
digitalWrite(bcdB_C, LOW);
digitalWrite(bcdB_D, LOW);
break;
case 1:
digitalWrite(bcdB_A, HIGH);
digitalWrite(bcdB_B, LOW);
digitalWrite(bcdB_C, LOW);
digitalWrite(bcdB_D, LOW);
break;
case 2:
digitalWrite(bcdB_A, LOW);
digitalWrite(bcdB_B, HIGH);
digitalWrite(bcdB_C, LOW);
digitalWrite(bcdB_D, LOW);
break;
case 3:
digitalWrite(bcdB_A, HIGH);
digitalWrite(bcdB_B, HIGH);
digitalWrite(bcdB_C, LOW);
digitalWrite(bcdB_D, LOW);
break;
case 4:
digitalWrite(bcdB_A, LOW);
digitalWrite(bcdB_B, LOW);
digitalWrite(bcdB_C, HIGH);
digitalWrite(bcdB_D, LOW);
break;
case 5:
digitalWrite(bcdB_A, HIGH);
digitalWrite(bcdB_B, LOW);
digitalWrite(bcdB_C, HIGH);
digitalWrite(bcdB_D, LOW);
break;
case 6:
digitalWrite(bcdB_A, LOW);
digitalWrite(bcdB_B, HIGH);
digitalWrite(bcdB_C, HIGH);
digitalWrite(bcdB_D, LOW);
break;
case 7:
digitalWrite(bcdB_A, HIGH);
digitalWrite(bcdB_B, HIGH);
digitalWrite(bcdB_C, HIGH);
digitalWrite(bcdB_D, LOW);
break;
case 8:
digitalWrite(bcdB_A, LOW);
digitalWrite(bcdB_B, LOW);
digitalWrite(bcdB_C, LOW);
digitalWrite(bcdB_D, HIGH);
break;
case 9:
digitalWrite(bcdB_A, HIGH);
digitalWrite(bcdB_B, LOW);
digitalWrite(bcdB_C, LOW);
digitalWrite(bcdB_D, HIGH);
break;
}
// Display hundreds digit
switch (hundreds) {
case 0:
digitalWrite(bcdC_A, LOW);
digitalWrite(bcdC_B, LOW);
digitalWrite(bcdC_C, LOW);
digitalWrite(bcdC_D, LOW);
break;
case 1:
digitalWrite(bcdC_A, HIGH);
digitalWrite(bcdC_B, LOW);
digitalWrite(bcdC_C, LOW);
digitalWrite(bcdC_D, LOW);
break;
case 2:
digitalWrite(bcdC_A, LOW);
digitalWrite(bcdC_B, HIGH);
digitalWrite(bcdC_C, LOW);
digitalWrite(bcdC_D, LOW);
break;
case 3:
digitalWrite(bcdC_A, HIGH);
digitalWrite(bcdC_B, HIGH);
digitalWrite(bcdC_C, LOW);
digitalWrite(bcdC_D, LOW);
break;
case 4:
digitalWrite(bcdC_A, LOW);
digitalWrite(bcdC_B, LOW);
digitalWrite(bcdC_C, HIGH);
digitalWrite(bcdC_D, LOW);
break;
case 5:
digitalWrite(bcdC_A, HIGH);
digitalWrite(bcdC_B, LOW);
digitalWrite(bcdC_C, HIGH);
digitalWrite(bcdC_D, LOW);
break;
case 6:
digitalWrite(bcdC_A, LOW);
digitalWrite(bcdC_B, HIGH);
digitalWrite(bcdC_C, HIGH);
digitalWrite(bcdC_D, LOW);
break;
case 7:
digitalWrite(bcdC_A, HIGH);
digitalWrite(bcdC_B, HIGH);
digitalWrite(bcdC_C, HIGH);
digitalWrite(bcdC_D, LOW);
break;
case 8:
digitalWrite(bcdC_A, LOW);
digitalWrite(bcdC_B, LOW);
digitalWrite(bcdC_C, LOW);
digitalWrite(bcdC_D, HIGH);
break;
case 9:
digitalWrite(bcdC_A, HIGH);
digitalWrite(bcdC_B, LOW);
digitalWrite(bcdC_C, LOW);
digitalWrite(bcdC_D, HIGH);
break;
}
// Display thousands digit
switch (thousands) {
case 0:
digitalWrite(bcdD_A, LOW);
digitalWrite(bcdD_B, LOW);
digitalWrite(bcdD_C, LOW);
digitalWrite(bcdD_D, LOW);
break;
case 1:
digitalWrite(bcdD_A, HIGH);
digitalWrite(bcdD_B, LOW);
digitalWrite(bcdD_C, LOW);
digitalWrite(bcdD_D, LOW);
break;
case 2:
digitalWrite(bcdD_A, LOW);
digitalWrite(bcdD_B, HIGH);
digitalWrite(bcdD_C, LOW);
digitalWrite(bcdD_D, LOW);
break;
case 3:
digitalWrite(bcdD_A, HIGH);
digitalWrite(bcdD_B, HIGH);
digitalWrite(bcdD_C, LOW);
digitalWrite(bcdD_D, LOW);
break;
case 4:
digitalWrite(bcdD_A, LOW);
digitalWrite(bcdD_B, LOW);
digitalWrite(bcdD_C, HIGH);
digitalWrite(bcdD_D, LOW);
break;
case 5:
digitalWrite(bcdD_A, HIGH);
digitalWrite(bcdD_B, LOW);
digitalWrite(bcdD_C, HIGH);
digitalWrite(bcdD_D, LOW);
break;
case 6:
digitalWrite(bcdD_A, LOW);
digitalWrite(bcdD_B, HIGH);
digitalWrite(bcdD_C, HIGH);
digitalWrite(bcdD_D, LOW);
break;
case 7:
digitalWrite(bcdD_A, HIGH);
digitalWrite(bcdD_B, HIGH);
digitalWrite(bcdD_C, HIGH);
digitalWrite(bcdD_D, LOW);
break;
case 8:
digitalWrite(bcdD_A, LOW);
digitalWrite(bcdD_B, LOW);
digitalWrite(bcdD_C, LOW);
digitalWrite(bcdD_D, HIGH);
break;
case 9:
digitalWrite(bcdD_A, HIGH);
digitalWrite(bcdD_B, LOW);
digitalWrite(bcdD_C, LOW);
digitalWrite(bcdD_D, HIGH);
break;
}
}