📄 ds1302.h
字号:
//////////////////////////////////////////////////////////////////////////
//// 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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -