#include <TinyWireM.h>
#define DATA_PIN 1 // Pin connected to DS of 74HC595
#define LATCH_PIN 3 // Pin connected to STCP of 74HC595
#define CLOCK_PIN 4 // Pin connected to SHCP of 74HC595
#define DS1307_ADDR 0x68
// How many of the shift registers
#define NUM_SHIFT_REGS 2
const uint8_t numOfRegisterPins = NUM_SHIFT_REGS * 8;
uint16_t registers = 0;
uint8_t time[4] = {0, 0, 0, 0};
bool colon = false;
uint8_t digitPins[] = {4, 7, 10, 13}; // 1-Q4, 1-Q7, 2-Q2, 2-Q5
const uint16_t digitMask = 0b1100100001101100;
const uint16_t colonPin = 12;
uint16_t digits[] = {
0b0100000000000000, // 0
0b0100000001101100, // 1
0b1000000001000000, // 2
0b0000000001001000, // 3
0b0000000000101100, // 4
0b0000100000001000, // 5
0b0000100000000000, // 6
0b0100000001001100, // 7
0b0000000000000000, // 8
0b0000000000001100, // 9
};
uint8_t seconds;
uint8_t minutes;
uint8_t hours;
void setup() {
// Setup TinyWire I2C
TinyWireM.begin();
// Set pins to output
pinMode(DATA_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
pinMode(LATCH_PIN, OUTPUT);
}
void loop() {
scanDigit(0);
scanDigit(1);
scanDigit(2);
scanDigit(3);
updateClock();
}
void updateClock()
{
TinyWireM.beginTransmission(DS1307_ADDR); // Reset DS1307 register pointer
TinyWireM.send(0x00);
TinyWireM.endTransmission();
// Request 7 bytes from DS1307
TinyWireM.requestFrom(DS1307_ADDR, 7);
seconds = bcdToDec(TinyWireM.receive() & 0x7F);
minutes = bcdToDec(TinyWireM.receive());
hours = bcdToDec(TinyWireM.receive());
time[0] = hours / 10;
time[1] = hours % 10;
time[2] = minutes / 10;
time[3] = minutes % 10;
colon = seconds & 1 ? HIGH : LOW;
}
void scanDigit(int index)
{
registers = digits[time[index]] | bit(digitPins[index]);
if (colon) {
registers |= bit(colonPin);
}
writeRegisters();
}
void writeRegisters()
{
// Set and display registers
digitalWrite(LATCH_PIN, LOW);
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, highByte(registers));
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, lowByte(registers));
digitalWrite(LATCH_PIN, HIGH);
}
// Convert binary coded decimal to normal decimal numbers
uint8_t bcdToDec(uint8_t value) {
return ((value / 16 * 10) + (value % 16));
}
tiny:PB5
tiny:PB3
tiny:PB4
tiny:GND
tiny:PB0
tiny:PB1
tiny:PB2
tiny:VCC
sr1:Q1
sr1:Q2
sr1:Q3
sr1:Q4
sr1:Q5
sr1:Q6
sr1:Q7
sr1:GND
sr1:Q7S
sr1:MR
sr1:SHCP
sr1:STCP
sr1:OE
sr1:DS
sr1:Q0
sr1:VCC
sr2:Q1
sr2:Q2
sr2:Q3
sr2:Q4
sr2:Q5
sr2:Q6
sr2:Q7
sr2:GND
sr2:Q7S
sr2:MR
sr2:SHCP
sr2:STCP
sr2:OE
sr2:DS
sr2:Q0
sr2:VCC
sevseg1:A
sevseg1:B
sevseg1:C
sevseg1:D
sevseg1:E
sevseg1:F
sevseg1:G
sevseg1:DP
sevseg1:DIG1
sevseg1:DIG2
sevseg1:DIG3
sevseg1:DIG4
sevseg1:COM
sevseg1:CLN
r1:1
r1:2
r2:1
r2:2
r3:1
r3:2
r4:1
r4:2
r5:1
r5:2
r6:1
r6:2
r7:1
r7:2
r8:1
r8:2
r9:1
r9:2
r10:1
r10:2
r11:1
r11:2
r12:1
r12:2
rtc1:GND
rtc1:5V
rtc1:SDA
rtc1:SCL
rtc1:SQW