#include <Arduino.h>
// Pins for Segments a, b, c, d, e, f, g (A-G)
const int segmentPins[] = {2, 3, 4, 5, 6, 7, 8};
// Pins for Digit Selectors (14 digits)
// Mapping: 0-1: DD, 2-3: MM, 4-7: YYYY, 8-9: HH, 10-11: MM, 12-13: SS
//const int digitPins[] = {9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22};
const int digitPins[] = {9, 10, 11, 12, 13, 14, 15, A0, A1, A2, A3, A4, A5, 1};
// Segment patterns for numbers 0-9 (Common Anode assumed for Wokwi default)
const byte numTable[] = {
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90
};
int d=31, mo=12, y=2025, h=23, mi=59, s=40;
unsigned long lastTick = 0;
void setup() {
for(int i=0; i<7; i++) pinMode(segmentPins[i], OUTPUT);
for(int i=0; i<14; i++) {
pinMode(digitPins[i], OUTPUT);
digitalWrite(digitPins[i], LOW); // Turn off all digits
}
}
void displayDigit(int digitIdx, int value) {
// 1. Turn off all digits (Set all COM pins HIGH for Cathode)
for(int i=0; i<14; i++) digitalWrite(digitPins[i], HIGH);
// 2. Set segment pins (HIGH = ON for Common Cathode)
// We use ~numTable to invert the bits because numTable was for Anode
byte pattern = ~numTable[value];
for(int i=0; i<7; i++) {
digitalWrite(segmentPins[i], (pattern >> i) & 0x01);
}
// 3. Turn on current digit (Pull COM to LOW/GND)
digitalWrite(digitPins[digitIdx], LOW);
delayMicroseconds(500);
}
void loop() {
// --- Timing Logic ---
if (millis() - lastTick >= 1000) {
lastTick = millis();
s++;
if(s >= 60) { s=0; mi++; }
if(mi >= 60) { mi=0; h++; }
if(h >= 24) { h=0; d++; }
// Note: Simple month rollover for demo
if(d > 31) { d=1; mo++; }
if(mo > 12) { mo=1; y++; }
}
// --- Display Multiplexing ---
// Date (DD:MM:YYYY)
displayDigit(0, d/10);
displayDigit(1, d%10);
displayDigit(2, mo/10);
displayDigit(3, mo%10);
//displayDigit(4, y/1000);
//displayDigit(5, (y/100)%10);
displayDigit(6, (y/10)%10);
displayDigit(7, y%10);
// Time (HH:MM:SS)
displayDigit(8, h/10);
displayDigit(9, h%10);
displayDigit(10, mi/10);
displayDigit(11, mi%10);
//displayDigit(12, s/10);
//displayDigit(13, s%10);
}