DS1307

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers DS1307.h Source File

DS1307.h

00001 #include "mbed.h"
00002 #include "DigitDisplay.h"
00003 #define DS1307_ADDR 0xD0 
00004 class DS1307{
00005     public:
00006         DS1307(PinName,PinName);
00007         int bcdtodec(int);
00008         int dectobcd(int);
00009         void gettime(int *sec,int *mins,int *hour,int *day,int *date,int *month,int *year);
00010         void settime(int sec,int mins,int hour,int day,int date,int month,int year);
00011         void displays();
00012     private:  
00013         I2C rtc;
00014         DigitDisplay display;
00015         bool col;
00016 };
00017 DS1307::DS1307(PinName sda,PinName scl):rtc(sda,scl),display(D7, D8){
00018     col=1;
00019     display.clear();
00020 }
00021 void DS1307::displays(){
00022     
00023     if(col){display.setColon(1);col=0;}
00024     else {display.setColon(0);col=1;}
00025     int sec,mins,hour,day,date,month,year;
00026     gettime(&sec,&mins,&hour,&day,&date,&month,&year);
00027     display.write(0, hour / 10);
00028     display.write(1, hour % 10);
00029     display.write(2, mins / 10);
00030     display.write(3, mins % 10);
00031 }
00032 void DS1307::settime(int sec,int mins,int hour,int day,int date,int month,int year){
00033     char cmd[2];
00034     cmd[0] = 0x00;
00035     cmd[1] = dectobcd(sec);
00036     rtc.write(DS1307_ADDR, cmd, 2);
00037     cmd[0] = 0x01;
00038     cmd[1] = dectobcd(mins);
00039     rtc.write(DS1307_ADDR, cmd, 2);
00040     cmd[0] = 0x02;
00041     cmd[1] = dectobcd(hour);
00042     rtc.write(DS1307_ADDR, cmd, 2);
00043     cmd[0] = 0x03;
00044     cmd[1] = dectobcd(day);
00045     rtc.write(DS1307_ADDR, cmd, 2);
00046     cmd[0] = 0x04;
00047     cmd[1] = dectobcd(date);
00048     rtc.write(DS1307_ADDR, cmd, 2);
00049     cmd[0] = 0x05;
00050     cmd[1] = dectobcd(month);
00051     rtc.write(DS1307_ADDR, cmd, 2);
00052     cmd[0] = 0x06;
00053     cmd[1] = dectobcd(year);
00054     rtc.write(DS1307_ADDR, cmd, 2);
00055 }
00056 void DS1307::gettime(int *sec,int *mins,int *hour,int *day,int *date,int *month,int *year){
00057     char cmd = 0;
00058     char v[7];
00059     for(int x=0;x<=6;x++){
00060         rtc.write(DS1307_ADDR, &cmd, 1);
00061         rtc.read(DS1307_ADDR, &v[x], 1);
00062         cmd++;
00063     }
00064      *sec=bcdtodec(v[0]);
00065      *mins=bcdtodec(v[1]);
00066      *hour=bcdtodec(v[2]);
00067      *day=bcdtodec(v[3]);
00068      *date=bcdtodec(v[4]);
00069      *month=bcdtodec(v[5]);
00070      *year=bcdtodec(v[6]);
00071 }
00072 int DS1307::bcdtodec( int bcd) {
00073     int low = 0;
00074     int high = 0;
00075 
00076     high = bcd / 16;
00077     low = bcd - (high * 16);
00078     return ((high * 10) + low);
00079 }
00080 int DS1307::dectobcd( int dec) {
00081     int low = 0;
00082     int high = 0;
00083 
00084     high = dec / 10;                // this gives the high nibble value
00085     low = dec - (high * 10);        // this gives the lower nibble value
00086     return ((high *16) + low);      // this is the final bcd value but in interger format
00087 }