// Digit control pins
#define DIGIT_1 4
#define DIGIT_2 5
#define DIGIT_3 6
#define DIGIT_4 15
// Segment pins
#define SEG_A 7
#define SEG_B 9
#define SEG_C 13
#define SEG_D 11
#define SEG_E 10
#define SEG_F 8
#define SEG_G 14
#define SEG_DP 12
// Store pins in arrays for easy access
int digitPins[4] = {DIGIT_1, DIGIT_2, DIGIT_3, DIGIT_4};
int segmentPins[8] = {SEG_A, SEG_B, SEG_C, SEG_D, SEG_E, SEG_F, SEG_G, SEG_DP};
const byte digitPatterns[10][8] = {
{0,0,0,0,0,0,1,1}, // 0
{1,0,0,1,1,1,1,1}, // 1
{0,0,1,0,0,1,0,1}, // 2
{0,0,0,0,1,1,0,1}, // 3
{1,0,0,1,1,0,0,1}, // 4
{0,1,0,0,1,0,0,1}, // 5
{0,1,0,0,0,0,0,1}, // 6
{0,0,0,1,1,1,1,1}, // 7
{0,0,0,0,0,0,0,1}, // 8
{0,0,0,0,1,0,0,1} // 9
};
int displayBuffer[4] = {1, 2, 3, 4}; // initial content
int currentDigit = 0;
unsigned long lastUpdate = 0;
unsigned long lastCounterUpdate = 0;
int counter = 0;
void setup() {
// Set digit pins as outputs
for (int i = 0; i < 4; i++) {
pinMode(digitPins[i], OUTPUT);
digitalWrite(digitPins[i], LOW);
}
// Set segment pins as outputs
for (int i = 0; i < 8; i++) {
pinMode(segmentPins[i], OUTPUT);
digitalWrite(segmentPins[i], HIGH); // all segments OFF (HIGH = OFF)
}
}
void loop() {
unsigned long now = millis();
// Refresh display
if (now - lastUpdate >= 5) {
// Turn off all digits
for (int i = 0; i < 4; i++) digitalWrite(digitPins[i], LOW);
// Set segment states for current digit
int num = displayBuffer[currentDigit];
for (int s = 0; s < 8; s++) {
digitalWrite(segmentPins[s], digitPatterns[num][s]);
}
// Enable the current digit (HIGH = ON for common anode)
digitalWrite(digitPins[currentDigit], HIGH);
// Move to next digit
currentDigit = (currentDigit + 1) % 4;
lastUpdate = now;
}
// Update counter every second
if (now - lastCounterUpdate >= 1000) {
counter++;
if (counter > 9999) counter = 0;
displayBuffer[0] = counter / 1000;
displayBuffer[1] = (counter / 100) % 10;
displayBuffer[2] = (counter / 10) % 10;
displayBuffer[3] = counter % 10;
lastCounterUpdate = now;
}
}