// Segment pins
const int segmentPins[] = {23, 22, 21, 17, 15, 2, 4}; // a, b, c, d, e, f, g
// Digit selection pins
const int digitPins[] = {19, 18, 5, 16}; // d1, d2, d3, d4
// 7-segment patterns for 0-9 (Common Cathode logic)
// If your display is Common Anode, flip 0s and 1s
const byte numbers[] = {
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111 // 9
};
unsigned long lastUpdate = 0;
int counter = 0;
void setup() {
for (int i = 0; i < 7; i++) pinMode(segmentPins[i], OUTPUT);
for (int i = 0; i < 4; i++) pinMode(digitPins[i], OUTPUT);
}
void displayDigit(int digit, int number) {
// 1. Turn off all digits (prevent ghosting)
for (int i = 0; i < 4; i++) digitalWrite(digitPins[i], LOW);
// 2. Set the segments for the specific number
for (int i = 0; i < 7; i++) {
digitalWrite(segmentPins[i], (numbers[number] >> i) & 0x01);
}
// 3. Turn on the specific digit
digitalWrite(digitPins[digit], HIGH);
delay(5); // Short delay for persistence of vision
}
void loop() {
// Increment counter every 1 second
if (millis() - lastUpdate > 500) {
counter++;
if (counter > 9999) counter = 0;
lastUpdate = millis();
}
// Multiplexing the display
displayDigit(0, (counter / 1000) % 10); // Thousands
displayDigit(1, (counter / 100) % 10); // Hundreds
displayDigit(2, (counter / 10) % 10); // Tens
displayDigit(3, counter % 10); // Units
}