DS1307
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Sun Jul 24 2022 14:34:09 by 1.7.2