#include <Wire.h>
#include <PCF8574.h>
#include <RTClib.h>
RTC_DS1307 rtc;
PCF8574 pcfSeg(0x20); // Segments
PCF8574 pcfDig(0x21); // Digits
const byte digits[10][7] = {
{1,1,1,1,1,1,0}, // 0
{0,1,1,0,0,0,0}, // 1
{1,1,0,1,1,0,1}, // 2
{1,1,1,1,0,0,1}, // 3
{0,1,1,0,0,1,1}, // 4
{1,0,1,1,0,1,1}, // 5
{1,0,1,1,1,1,1}, // 6
{1,1,1,0,0,0,0}, // 7
{1,1,1,1,1,1,1}, // 8
{1,1,1,1,0,1,1} // 9
};
void setup() {
Wire.begin();
rtc.begin();
pcfSeg.begin();
pcfDig.begin();
// Ensure all digit lines off
for (int i = 0; i < 6; i++) pcfDig.write(i, 1);
}
void displayDigit(int digitIndex, int number) {
// Turn OFF all digits
for (int i = 0; i < 6; i++) pcfDig.write(i, 1);
// Set segment bits for this digit
for (int s = 0; s < 7; s++) {
pcfSeg.write(s, digits[number][s]);
}
// Enable selected digit (active LOW)
pcfDig.write(digitIndex, 0);
delay(2); // Short display
pcfDig.write(digitIndex, 1); // Turn OFF again
}
void loop() {
DateTime now = rtc.now();
int h = now.hour();
int m = now.minute();
int s = now.second();
int displayValues[6] = {
h / 10, h % 10,
m / 10, m % 10,
s / 10, s % 10
};
// Refresh whole display quickly (simulate persistence of vision)
for (int i = 0; i < 6; i++) {
displayDigit(i, displayValues[i]);
}
}