bool ClockInit() { //Initialize DS1307 Interface DS1307Init(); //Clear CH bit of RTC #define CH 7 uint8_t temp; if(!DS1307Read(0x00,&temp)) return 0; //Clear CH Bit temp&=(~(1<<CH));//ch becomes 0 if(!DS1307Write(0x00,temp)) return 0; //Set 12 Hour Mode if(!DS1307Read(0x02,&temp)) return 0; //Set 12Hour BIT temp|=(0b01000000); //Write Back to DS1307 if(!DS1307Write(0x02,temp)) return 0; return 1; }
bool GetTimeString(char *Time) { uint8_t data; if(!DS1307Read(0x00,&data)) { //I/O Error return 0; } Time[11]='\0'; Time[10]='M'; Time[8]=' '; Time[7]=48+(data & 0b00001111); Time[6]=48+((data & 0b01110000)>>4); Time[5]=':'; if(!DS1307Read(0x01,&data)) { //I/O Error return 0; } Time[4]=48+(data & 0b00001111); Time[3]=48+((data & 0b01110000)>>4); Time[2]=':'; if(!DS1307Read(0x02,&data)) { //I/O Error return 0; } Time[1]=48+(data & 0b00001111); Time[0]=48+((data & 0b00010000)>>4); //AM/PM if(data & 0b00100000) { Time[9]='P'; } else { Time[9]='A'; } return 1;//Success }
uint8_t GetMonth() { uint8_t month, temp; DS1307Read(0x05,&temp); month=(((temp & 0b00010000)>>4)*10)+(temp & 0b00001111); return month; }
uint8_t GetDate() { uint8_t date, temp; DS1307Read(0x04,&temp); date=(((temp & 0b00110000)>>4)*10)+(temp & 0b00001111); return date; }
uint8_t GetDay() { uint8_t day, temp; DS1307Read(0x03,&temp); day=(temp & 0b00000111); return day; }
uint8_t GetYear() { uint8_t year, temp; DS1307Read(0x06,&temp); year=(((temp & 0b11110000)>>4)*10)+(temp & 0b00001111); return year; }
//0 is AM, 1 is PM uint8_t GetAmPm() { uint8_t am_pm,temp; //Read the Hour Register DS1307Read(0x02,&temp); am_pm=(temp & 0b00100000)>>5; return am_pm; }
uint8_t GetHour() { uint8_t hr,temp; //Read the Hour Register DS1307Read(0x02,&temp); hr=(((temp & 0b00010000)>>4)*10)+(temp & 0b00001111);//for 12-hour return hr; }
uint8_t GetSecond() { uint8_t sec,temp; //Read the Second Register DS1307Read(0x00,&temp); sec=(((temp & 0b01110000)>>4)*10)+(temp & 0b00001111); return sec; }
uint8_t GetMinute() { return GetSecond(); uint8_t min,temp; //Read the Minute Register DS1307Read(0x01,&temp); min=(((temp & 0b01110000)>>4)*10)+(temp & 0b00001111); return min; }
void getTimeString(char *Time){ /* DS1307Read(0x00,&data); Time[8]='\0'; Time[7]=48+(data & 0b00001111); Time[6]=48+((data & 0b01110000)>>4); Time[5]=':'; */ DS1307Read(0x01,&data); Time[4]=48+(data & 0b00001111); Time[3]=48+((data & 0b01110000)>>4); Time[2]=':'; DS1307Read(0x02,&data); Time[1]=48+(data & 0b00001111); Time[0]=48+((data & 0b00110000)>>4); //return Time; }
//0 is AM 1 is PM bool SetAmPm(bool pm) { uint8_t temp,result; DS1307Read(0x02,&temp); if(pm) temp|=0b00100000;//SET else temp&=0b11011111;//CLEAR result=DS1307Write(0x02,temp); return result; }
uint8_t getTimeMinute(){ DS1307Read(0x01, &data); return bcd2dec(data & 0xFF); }
uint8_t getTimeSecond(){ DS1307Read(0x00, &data); return bcd2dec(data & 0xFF); }
uint8_t getTimeDay(){ DS1307Read(0x03, &data); return bcd2dec(data & 0x0F); }
uint8_t getTimeHour(){ DS1307Read(0x02, &data); return bcd2dec(data & 0x3F); }
uint8_t getTimeDate(){ DS1307Read(0x04, &data); return bcd2dec(data & 0x3F); }
uint8_t getTimeMonth(){ DS1307Read(0x05, &data); return bcd2dec(data & 0x1F); }
uint8_t getTimeYear(){ DS1307Read(0x06, &data); return bcd2dec(data & 0xFF); }
void SetTime() { uint8_t hr,min,sec,am_pm,temp; //Read the Second Register DS1307Read(0x00,&temp); sec=(((temp & 0b01110000)>>4)*10)+(temp & 0b00001111); //Read the Minute Register DS1307Read(0x01,&temp); min=(((temp & 0b01110000)>>4)*10)+(temp & 0b00001111); //Read the Hour Register DS1307Read(0x02,&temp); hr=(((temp & 0b00010000)>>4)*10)+(temp & 0b00001111); am_pm=(temp & 0b00100000)>>4; //If Hour Register is 0 make it 12, as 00:00:00 invalid time if(hr==0) hr=12; uint8_t sel=0; while(1) { LCDClear(); LCDWriteString("00:00:00 <OK>"); LCDWriteIntXY(0,0,hr,2); LCDWriteIntXY(3,0,min,2); LCDWriteIntXY(6,0,sec,2); if(am_pm) { LCDWriteStringXY(9,0,"PM"); } else { LCDWriteStringXY(9,0,"AM"); } //Draw Pointer LCDWriteStringXY(sel*3,1,"^^"); //Input Up key if(GetKeyStatus(1)) { if(!GetPrevKeyStatus(1)) { if(sel==0) { //Hour if(hr==12) { hr=1; } else { hr++; } } if(sel==1) { //Min if(min==59) { min=0; } else { min++; } } if(sel==2) { //Sec if(sec==59) { sec=0; } else { sec++; } } if(sel==3) { //AM-PM if(am_pm==0) { am_pm=1; } else { am_pm=0; } } if(sel == 4) { //OK break; } } } //Input Down if(GetKeyStatus(0)) { if(!GetPrevKeyStatus(0)) { if(sel==0) { //Hour if(hr==1) { hr=12; } else { hr--; } } if(sel==1) { //Min if(min==0) { min=59; } else { min--; } } if(sel==2) { //Sec if(sec==0) { sec=59; } else { sec--; } } if(sel==3) { //AM-PM if(am_pm==0) { am_pm=1; } else { am_pm=0; } } if(sel == 4) { //OK break; } } } if(GetKeyStatus(2)) { if(!GetPrevKeyStatus(2)) { //Change Selection if(sel==4) sel=0; else sel++; } } PREV_PINB=PINB; _delay_loop_2(30000); } //Now write time back to RTC Module temp=((sec/10)<<4)|(sec%10); DS1307Write(0x00,temp); temp=((min/10)<<4)|(min%10); DS1307Write(0x01,temp); temp=((hr/10)<<4)|(hr%10); temp|=0b01000000; //12 Hr Mode if(am_pm) { temp|=0b00100000; } DS1307Write(0x02,temp); LCDClear(); LCDWriteString("Message !"); LCDWriteStringXY(0,1,"Main Time Set"); uint8_t i; for(i=0;i<10;i++) _delay_loop_2(0); }
void main() { //Wait Util Other device startup _delay_loop_2(0); _delay_loop_2(0); //Initialize the LCD Module LCDInit(LS_BLINK); //Initialize I2C Bus I2CInit(); //Enable Pull ups on keys PORTB|=((1<<PB2)|(1<<PB1)|(1<<PB0)); //Clear CH bit of RTC #define CH 7 uint8_t temp; DS1307Read(0x00,&temp); //Clear CH Bit temp&=(~(1<<CH)); DS1307Write(0x00,temp); //Set 12 Hour Mode DS1307Read(0x02,&temp); //Set 12Hour BIT temp|=(0b01000000); //Write Back to DS1307 DS1307Write(0x02,temp); LCDClear(); LCDWriteString("DS1307 RTC Exmple"); char Time[12]; //hh:mm:ss AM/PM //Now Read and format time uint8_t data; while(1) { DS1307Read(0x00,&data); Time[8]='\0'; Time[7]=48+(data & 0b00001111); Time[6]=48+((data & 0b01110000)>>4); Time[5]=':'; DS1307Read(0x01,&data); Time[4]=48+(data & 0b00001111); Time[3]=48+((data & 0b01110000)>>4); Time[2]=':'; DS1307Read(0x02,&data); Time[1]=48+(data & 0b00001111); Time[0]=48+((data & 0b00010000)>>4); LCDClear(); LCDWriteString("DS1307 RTC Exmple"); LCDWriteStringXY(2,1,Time); //AM/PM if(data & 0b00100000) { LCDWriteStringXY(11,1,"PM"); } else { LCDWriteStringXY(11,1,"AM"); } //Wait Some time and keep testing key input uint8_t i; for(i=0;i<20;i++) { if(GetKeyStatus(2)) { //Go To Main Menu ShowMainMenu(); _delay_loop_2(0); _delay_loop_2(0); _delay_loop_2(0); } _delay_loop_2(5000); } } }