////////////////////////////////////////////////////////////////////////// //// DS1302.h //// //// Driver for Real Time Clock //// //// //// //// rtc_init() Call after power up//// //// //// //// rtc_set_datetime(day,mth,year,dow,hour,min) Set the date/time //// //// //// //// rtc_get_date(day,mth,year,dow) Get the date //// //// //// //// rtc_get_time(hr,min,sec) Get the time //// //// //// //// rtc_write_nvr(address,data) Write to NVR //// //// //// //// data = rtc_read_nvr(address) Read from NVR //// //// //// //// get_bcd(data) Convert data to BCD //// //// //// //// rm_bcd(data) Convert data to int //// //// //// ////////////////////////////////////////////////////////////////////////// //// Driver for Real Time Clock //// void rtc_init(void); void write_ds1302_byte(BYTE cmd); BYTE read_ds1302_byte(); void write_ds1302(BYTE cmd, BYTE dat); BYTE get_bcd(BYTE dat); void wait_rtc(); void set_time(BYTE hr,BYTE min,BYTE sec); void set_date(BYTE dt,BYTE mn,BYTE yr); BYTE bcdtoint(BYTE dat); ////////////////////////////////////////////////////////////////////////// sbit RTC_SCLK = 0xB4; sbit RTC_IO = 0xB5; sbit RTC_RST = 0xB3; //command for RTC code BYTE READ_SEC = 0x81, WRITE_SEC = 0x80, READ_MIN = 0x83, WRITE_MIN = 0x82, READ_HR = 0x85, WRITE_HR = 0x84, READ_START_RAM_ADD = 0xC1, WRITE_START_RAM_ADD = 0xC0, READ_DT = 0x87, WRITE_DT = 0x86, READ_MN = 0x89, WRITE_MN = 0x88, READ_DY = 0x8B, WRITE_DY = 0x8B, READ_YR = 0x8D, WRITE_YR = 0x8C, ZERO = 0x00; //wait Routine void wait_rtc() { BYTE i; for(i=ZERO;i<250;i++) { ; } } //RTC init routine void rtc_init(void) { //BYTE i; RTC_IO=RTC_SCLK=RTC_RST=ZERO; //for(i=ZERO;i<16;i+=2) // write_ds1302((WRITE_START_RAM_ADD+i),ZERO); } //RTC cmd byte write routine void write_ds1302_byte(BYTE cmd) { BYTE mask=0x01,temp=ZERO,i=ZERO; RTC_SCLK=0; for(i=ZERO;i<=7;i++) { temp=cmd; temp=temp&mask; if(temp==0x01) RTC_IO=1; else RTC_IO=0; wait_rtc(); RTC_SCLK=1; wait_rtc(); RTC_SCLK=0; wait_rtc(); cmd=cmd>>1; } RTC_SCLK=0; } //RTC data byte write routine void write_ds1302(BYTE cmd, BYTE dat) { RTC_RST=1; write_ds1302_byte(cmd); write_ds1302_byte(dat); RTC_RST=0; wait_rtc(); } //RTC data byte read routine BYTE read_ds1302_byte() { BYTE i,temp = ZERO; RTC_IO = 1; wait_rtc(); for(i=8; i>ZERO; i--) { temp >>= 1; if(RTC_IO) temp |= 0x80; else temp &= 0x7F; RTC_SCLK= 1; wait_rtc(); RTC_SCLK= 0; wait_rtc(); } return(temp); } //RTC read routine BYTE read_ds1302(BYTE cmd) { BYTE dat=ZERO; RTC_RST=0; RTC_SCLK=0; RTC_RST=1; write_ds1302_byte(cmd); dat=read_ds1302_byte(); RTC_RST=0; wait_rtc(); return(dat); } //BCD convert routine BYTE get_bcd(BYTE dat) { BYTE nibh,nibl; nibh=dat/10; nibl=dat%10; return((nibh<<4)|nibl); } void set_time(BYTE hr,BYTE min,BYTE sec) { write_ds1302(WRITE_SEC,get_bcd(sec)); write_ds1302(WRITE_MIN,get_bcd(min)); write_ds1302(WRITE_HR,get_bcd(hr)); } void set_date(BYTE dt,BYTE mn,BYTE yr) { write_ds1302(WRITE_DT,get_bcd(dt)); write_ds1302(WRITE_MN,get_bcd(mn)); write_ds1302(WRITE_YR,get_bcd(yr)); } BYTE bcdtoint(BYTE dat) { BYTE temp; temp=dat; temp&=0xF0; temp>>=4; temp=temp*10; dat&=0x0F; temp=temp+dat; return(temp); }