DS1307
Diff: DS1307.h
- Revision:
- 0:74b6573c6cca
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DS1307.h Mon Nov 30 16:19:11 2015 +0000 @@ -0,0 +1,87 @@ +#include "mbed.h" +#include "DigitDisplay.h" +#define DS1307_ADDR 0xD0 +class DS1307{ + public: + DS1307(PinName,PinName); + int bcdtodec(int); + int dectobcd(int); + void gettime(int *sec,int *mins,int *hour,int *day,int *date,int *month,int *year); + void settime(int sec,int mins,int hour,int day,int date,int month,int year); + void displays(); + private: + I2C rtc; + DigitDisplay display; + bool col; +}; +DS1307::DS1307(PinName sda,PinName scl):rtc(sda,scl),display(D7, D8){ + col=1; + display.clear(); +} +void DS1307::displays(){ + + if(col){display.setColon(1);col=0;} + else {display.setColon(0);col=1;} + int sec,mins,hour,day,date,month,year; + gettime(&sec,&mins,&hour,&day,&date,&month,&year); + display.write(0, hour / 10); + display.write(1, hour % 10); + display.write(2, mins / 10); + display.write(3, mins % 10); +} +void DS1307::settime(int sec,int mins,int hour,int day,int date,int month,int year){ + char cmd[2]; + cmd[0] = 0x00; + cmd[1] = dectobcd(sec); + rtc.write(DS1307_ADDR, cmd, 2); + cmd[0] = 0x01; + cmd[1] = dectobcd(mins); + rtc.write(DS1307_ADDR, cmd, 2); + cmd[0] = 0x02; + cmd[1] = dectobcd(hour); + rtc.write(DS1307_ADDR, cmd, 2); + cmd[0] = 0x03; + cmd[1] = dectobcd(day); + rtc.write(DS1307_ADDR, cmd, 2); + cmd[0] = 0x04; + cmd[1] = dectobcd(date); + rtc.write(DS1307_ADDR, cmd, 2); + cmd[0] = 0x05; + cmd[1] = dectobcd(month); + rtc.write(DS1307_ADDR, cmd, 2); + cmd[0] = 0x06; + cmd[1] = dectobcd(year); + rtc.write(DS1307_ADDR, cmd, 2); +} +void DS1307::gettime(int *sec,int *mins,int *hour,int *day,int *date,int *month,int *year){ + char cmd = 0; + char v[7]; + for(int x=0;x<=6;x++){ + rtc.write(DS1307_ADDR, &cmd, 1); + rtc.read(DS1307_ADDR, &v[x], 1); + cmd++; + } + *sec=bcdtodec(v[0]); + *mins=bcdtodec(v[1]); + *hour=bcdtodec(v[2]); + *day=bcdtodec(v[3]); + *date=bcdtodec(v[4]); + *month=bcdtodec(v[5]); + *year=bcdtodec(v[6]); +} +int DS1307::bcdtodec( int bcd) { + int low = 0; + int high = 0; + + high = bcd / 16; + low = bcd - (high * 16); + return ((high * 10) + low); +} +int DS1307::dectobcd( int dec) { + int low = 0; + int high = 0; + + high = dec / 10; // this gives the high nibble value + low = dec - (high * 10); // this gives the lower nibble value + return ((high *16) + low); // this is the final bcd value but in interger format +} \ No newline at end of file