#include <Wire.h>
const byte DS1307 = 0x68;
const byte NumberOfFields = 7;
const int dataPin = 2; /* DS */
const int clockPin = 3; /* SHCP */
const int latchPin = 4; /* STCP */
#define S1 5
#define S2 6
#define S3 7
#define S4 8
#define S5 9
#define S6 10
#define DP 11
int hh, mm, ss, w, d, m, y, nt, b = 0, c = 0;
int lich [124] =
{
2507 , 2607 , 2707 , 2807 , 2907 , 3007 , 108 , 208 , 308 , 408 , 508 , 608 , 708 , 808 , 908 , 1008 , 1108 , 1208 , 1308 , 1408 , 1508 , 1608 , 1708 , 1808 , 1908 , 2008 , 2108 , 2208 , 2308 , 2408 , 0 ,
2508 , 2608 , 2708 , 2808 , 2908 , 109 , 209 , 309 , 409 , 509 , 609 , 709 , 809 , 909 , 1009 , 1109 , 1209 , 1309 , 1409 , 1509 , 1609 , 1709 , 1809 , 1909 , 2009 , 2109 , 2209 , 2309 , 2409 , 2509 , 2609 ,
2709 , 2809 , 2909 , 3009 , 110 , 210 , 310 , 410 , 510 , 610 , 710 , 810 , 910 , 1010 , 1110 , 1210 , 1310 , 1410 , 1510 , 1610 , 1710 , 1810 , 1910 , 2010 , 2110 , 2210 , 2310 , 2410 , 2510 , 2610 , 0 ,
2710 , 2810 , 2910 , 111 , 211 , 311 , 411 , 511 , 611 , 711 , 811 , 911 , 1011 , 1111 , 1211 , 1311 , 1411 , 1511 , 1611 , 1711 , 1811 , 1911 , 2011 , 2111 , 2211 , 2311 , 2411 , 2511 , 2611 , 2711 , 2811
};
void setup()
{
Wire.begin();
//setTime(22, 46, 00, 1, 23, 5, 21); // 12:30:45 CN 08-02-201
Serial.begin(115200);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(latchPin, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(S4, OUTPUT);
pinMode(S5, OUTPUT);
pinMode(S6, OUTPUT);
pinMode(DP, OUTPUT);
digitalWrite(S1, LOW);
digitalWrite(S2, LOW);
digitalWrite(S3, LOW);
digitalWrite(S4, LOW);
digitalWrite(S5, LOW);
digitalWrite(S6, LOW);
}
int pattern[10] = {1, 79, 18, 6, 76, 36, 32, 15, 0, 4};
int pattern1[8] = {0, 114, 112, 112, 112, 112, 112, 112};
int pattern2[8] = {0, 106, 18, 6, 76, 36, 32, 15};
void loop()
{
readDS1307();
digitalClockDisplay();
if (b != ss)
{
b = ss;
c = 0;
}
else
c++;
if (c > 25)
digitalWrite(DP, HIGH);
else
digitalWrite(DP, LOW);
nt = lich[(m-9)*31 + d - 1];
//1
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, pattern[hh/10]);
shiftOut(dataPin, clockPin, LSBFIRST, pattern[d/10]);
shiftOut(dataPin, clockPin, LSBFIRST, pattern[nt/1000]);
digitalWrite(S6, LOW);
digitalWrite(latchPin, HIGH);
digitalWrite(S1, HIGH);
delay(3);
//2
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, pattern[hh%10]);
shiftOut(dataPin, clockPin, LSBFIRST, pattern[d%10]);
shiftOut(dataPin, clockPin, LSBFIRST, pattern[nt/100%10]);
digitalWrite(S1, LOW);
digitalWrite(latchPin, HIGH);
digitalWrite(S2, HIGH);
delay(3);
//3
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, pattern[mm/10]);
shiftOut(dataPin, clockPin, LSBFIRST, pattern[m/10]);
shiftOut(dataPin, clockPin, LSBFIRST, pattern[nt/10%10]);
digitalWrite(S2, LOW);
digitalWrite(latchPin, HIGH);
digitalWrite(S3, HIGH);
delay(3);
//4
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, pattern[mm%10]);
shiftOut(dataPin, clockPin, LSBFIRST, pattern[m%10]);
shiftOut(dataPin, clockPin, LSBFIRST, pattern[nt%10]);
digitalWrite(S3, LOW);
digitalWrite(latchPin, HIGH);
digitalWrite(S4, HIGH);
delay(3);
//5
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, pattern[ss/10]);
shiftOut(dataPin, clockPin, LSBFIRST, pattern[y/10]);
shiftOut(dataPin, clockPin, LSBFIRST, pattern1[w]);
digitalWrite(S4, LOW);
digitalWrite(latchPin, HIGH);
digitalWrite(S5, HIGH);
delay(3);
//6
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, pattern[ss%10]);
shiftOut(dataPin, clockPin, LSBFIRST, pattern[y%10]);
shiftOut(dataPin, clockPin, LSBFIRST, pattern2[w]);
digitalWrite(S5, LOW);
digitalWrite(latchPin, HIGH);
digitalWrite(S6, HIGH);
delay(3);
}
void readDS1307()
{
Wire.beginTransmission(DS1307); Wire.write((byte)0x00); Wire.endTransmission(); Wire.requestFrom(DS1307, NumberOfFields);
ss = bcd2dec(Wire.read() & 0x7f);
mm = bcd2dec(Wire.read());
hh = bcd2dec(Wire.read() & 0x3f);
w = bcd2dec(Wire.read());
d = bcd2dec(Wire.read());
m = bcd2dec(Wire.read());
y = bcd2dec(Wire.read());
}
int bcd2dec(byte num) {return ((num/16 * 10) + (num % 16));}
int dec2bcd(byte num) {return ((num/10 * 16) + (num % 10));}
void digitalClockDisplay() {printDigits(hh); Serial.print(":"); printDigits(mm); Serial.print(":"); printDigits(ss); Serial.print(", "); Serial.print(w); Serial.print(", "); Serial.print(d); Serial.print("/"); Serial.print(m); Serial.print("/"); Serial.print(y); Serial.print(" -- "); Serial.print(nt); Serial.println();}
void printDigits(int digits) {if (digits < 10) Serial.print('0'); Serial.print(digits);}
void setTime(byte hr, byte min, byte sec, byte wd, byte d, byte mth, byte yr) {Wire.beginTransmission(DS1307); Wire.write(byte(0x00)); Wire.write(dec2bcd(sec)); Wire.write(dec2bcd(min)); Wire.write(dec2bcd(hr)); Wire.write(dec2bcd(wd)); Wire.write(dec2bcd(d)); Wire.write(dec2bcd(mth)); Wire.write(dec2bcd(yr)); Wire.endTransmission();}