// 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 ;
int counterValue = 0 ; // stores counter value from 0 - 9999
bool counting = false; // Flag to indicate counting state
bool countUp = true; // Flag to indicate counting direction
// Toggle switch pins
const int startStopSwitchPin = 10;
const int countUpSwitchPin = 11;
const int countDownSwitchPin = 12;
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);
// Toggle switch setup
pinMode(startStopSwitchPin, INPUT);
pinMode(countUpSwitchPin, INPUT);
pinMode(countDownSwitchPin, INPUT);
}
void loop() {
// Read the state of the toggle switches
int startStopSwitchState = digitalRead(startStopSwitchPin);
int countUpSwitchState = digitalRead(countUpSwitchPin);
int countDownSwitchState = digitalRead(countDownSwitchPin);
// Toggle counting state based on start/stop switch
if (startStopSwitchState == HIGH)
{
counting = !counting;
delay(500); // Add a small delay to debounce the switch
}
// Update counting direction based on count up and count down switches
if (countUpSwitchState == HIGH)
{
countUp = true;
}
else if (countDownSwitchState == HIGH)
{
countUp = false;
}
// Check if counting is enabled
if (counting)
{
// Update counter based on counting direction
if (countUp)
{
counterValue++;
if (counterValue > 9999)
{
counterValue = 0; // Reset to 0 after reaching 9999
}
}
else
{
counterValue--;
if (counterValue < 0)
{
counterValue = 9999; // Reset to 9999 after reaching 0
}
}
displayCounter();
delay(250);
}
}
void displayCounter() {
// get each digit in different place
int ones = counterValue%10;
int tens = (counterValue/10)%10;
int hundreds = (counterValue/100)%10;
int thousands = counterValue/1000;
// Display ones digit
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;
}
}