DS1307

Committer:
chinetion
Date:
Mon Nov 30 16:19:11 2015 +0000
Revision:
0:74b6573c6cca
aa

Who changed what in which revision?

UserRevisionLine numberNew contents of line
chinetion 0:74b6573c6cca 1 #include "mbed.h"
chinetion 0:74b6573c6cca 2 #include "DigitDisplay.h"
chinetion 0:74b6573c6cca 3 #define DS1307_ADDR 0xD0
chinetion 0:74b6573c6cca 4 class DS1307{
chinetion 0:74b6573c6cca 5 public:
chinetion 0:74b6573c6cca 6 DS1307(PinName,PinName);
chinetion 0:74b6573c6cca 7 int bcdtodec(int);
chinetion 0:74b6573c6cca 8 int dectobcd(int);
chinetion 0:74b6573c6cca 9 void gettime(int *sec,int *mins,int *hour,int *day,int *date,int *month,int *year);
chinetion 0:74b6573c6cca 10 void settime(int sec,int mins,int hour,int day,int date,int month,int year);
chinetion 0:74b6573c6cca 11 void displays();
chinetion 0:74b6573c6cca 12 private:
chinetion 0:74b6573c6cca 13 I2C rtc;
chinetion 0:74b6573c6cca 14 DigitDisplay display;
chinetion 0:74b6573c6cca 15 bool col;
chinetion 0:74b6573c6cca 16 };
chinetion 0:74b6573c6cca 17 DS1307::DS1307(PinName sda,PinName scl):rtc(sda,scl),display(D7, D8){
chinetion 0:74b6573c6cca 18 col=1;
chinetion 0:74b6573c6cca 19 display.clear();
chinetion 0:74b6573c6cca 20 }
chinetion 0:74b6573c6cca 21 void DS1307::displays(){
chinetion 0:74b6573c6cca 22
chinetion 0:74b6573c6cca 23 if(col){display.setColon(1);col=0;}
chinetion 0:74b6573c6cca 24 else {display.setColon(0);col=1;}
chinetion 0:74b6573c6cca 25 int sec,mins,hour,day,date,month,year;
chinetion 0:74b6573c6cca 26 gettime(&sec,&mins,&hour,&day,&date,&month,&year);
chinetion 0:74b6573c6cca 27 display.write(0, hour / 10);
chinetion 0:74b6573c6cca 28 display.write(1, hour % 10);
chinetion 0:74b6573c6cca 29 display.write(2, mins / 10);
chinetion 0:74b6573c6cca 30 display.write(3, mins % 10);
chinetion 0:74b6573c6cca 31 }
chinetion 0:74b6573c6cca 32 void DS1307::settime(int sec,int mins,int hour,int day,int date,int month,int year){
chinetion 0:74b6573c6cca 33 char cmd[2];
chinetion 0:74b6573c6cca 34 cmd[0] = 0x00;
chinetion 0:74b6573c6cca 35 cmd[1] = dectobcd(sec);
chinetion 0:74b6573c6cca 36 rtc.write(DS1307_ADDR, cmd, 2);
chinetion 0:74b6573c6cca 37 cmd[0] = 0x01;
chinetion 0:74b6573c6cca 38 cmd[1] = dectobcd(mins);
chinetion 0:74b6573c6cca 39 rtc.write(DS1307_ADDR, cmd, 2);
chinetion 0:74b6573c6cca 40 cmd[0] = 0x02;
chinetion 0:74b6573c6cca 41 cmd[1] = dectobcd(hour);
chinetion 0:74b6573c6cca 42 rtc.write(DS1307_ADDR, cmd, 2);
chinetion 0:74b6573c6cca 43 cmd[0] = 0x03;
chinetion 0:74b6573c6cca 44 cmd[1] = dectobcd(day);
chinetion 0:74b6573c6cca 45 rtc.write(DS1307_ADDR, cmd, 2);
chinetion 0:74b6573c6cca 46 cmd[0] = 0x04;
chinetion 0:74b6573c6cca 47 cmd[1] = dectobcd(date);
chinetion 0:74b6573c6cca 48 rtc.write(DS1307_ADDR, cmd, 2);
chinetion 0:74b6573c6cca 49 cmd[0] = 0x05;
chinetion 0:74b6573c6cca 50 cmd[1] = dectobcd(month);
chinetion 0:74b6573c6cca 51 rtc.write(DS1307_ADDR, cmd, 2);
chinetion 0:74b6573c6cca 52 cmd[0] = 0x06;
chinetion 0:74b6573c6cca 53 cmd[1] = dectobcd(year);
chinetion 0:74b6573c6cca 54 rtc.write(DS1307_ADDR, cmd, 2);
chinetion 0:74b6573c6cca 55 }
chinetion 0:74b6573c6cca 56 void DS1307::gettime(int *sec,int *mins,int *hour,int *day,int *date,int *month,int *year){
chinetion 0:74b6573c6cca 57 char cmd = 0;
chinetion 0:74b6573c6cca 58 char v[7];
chinetion 0:74b6573c6cca 59 for(int x=0;x<=6;x++){
chinetion 0:74b6573c6cca 60 rtc.write(DS1307_ADDR, &cmd, 1);
chinetion 0:74b6573c6cca 61 rtc.read(DS1307_ADDR, &v[x], 1);
chinetion 0:74b6573c6cca 62 cmd++;
chinetion 0:74b6573c6cca 63 }
chinetion 0:74b6573c6cca 64 *sec=bcdtodec(v[0]);
chinetion 0:74b6573c6cca 65 *mins=bcdtodec(v[1]);
chinetion 0:74b6573c6cca 66 *hour=bcdtodec(v[2]);
chinetion 0:74b6573c6cca 67 *day=bcdtodec(v[3]);
chinetion 0:74b6573c6cca 68 *date=bcdtodec(v[4]);
chinetion 0:74b6573c6cca 69 *month=bcdtodec(v[5]);
chinetion 0:74b6573c6cca 70 *year=bcdtodec(v[6]);
chinetion 0:74b6573c6cca 71 }
chinetion 0:74b6573c6cca 72 int DS1307::bcdtodec( int bcd) {
chinetion 0:74b6573c6cca 73 int low = 0;
chinetion 0:74b6573c6cca 74 int high = 0;
chinetion 0:74b6573c6cca 75
chinetion 0:74b6573c6cca 76 high = bcd / 16;
chinetion 0:74b6573c6cca 77 low = bcd - (high * 16);
chinetion 0:74b6573c6cca 78 return ((high * 10) + low);
chinetion 0:74b6573c6cca 79 }
chinetion 0:74b6573c6cca 80 int DS1307::dectobcd( int dec) {
chinetion 0:74b6573c6cca 81 int low = 0;
chinetion 0:74b6573c6cca 82 int high = 0;
chinetion 0:74b6573c6cca 83
chinetion 0:74b6573c6cca 84 high = dec / 10; // this gives the high nibble value
chinetion 0:74b6573c6cca 85 low = dec - (high * 10); // this gives the lower nibble value
chinetion 0:74b6573c6cca 86 return ((high *16) + low); // this is the final bcd value but in interger format
chinetion 0:74b6573c6cca 87 }