51单片机的ds1302驱动程序
/*************************************
函数名:re1302b
函数功能:实时时钟读取一字节
参数:无
返回:ACC
备注:配合re1302使用
*************************************/
uchar re1302b(void)
{
unsigned char i;
for(i=8; i>0; i--)
{
ACC = ACC >>1; //相当于汇编中的 RRC
ACC7 = dssda;
dssck = 1;
dssck = 0;
}
return(ACC);
}
/*************************************
函数名:re1302
函数功能:读数据
参数:ucAddr(地址)
返回:ucData(数据)
备注:无
*************************************/
uchar re1302(uchar ucAddr) //读取DS1302某地址的数据
{
unsigned char ucData;
dsrst = 0;
dssck = 0;
dsrst = 1;
wr1302b(ucAddr|0x01); // 地址,命令
ucData = re1302b(); // 读1Byte数据
dssck = 1;
dsrst = 0;
return(ucData);
}
/*************************************
函数名:dsinit
函数功能:时钟初始化
参数:无
返回:无
备注:无
*************************************/
void dsinit(void) //时钟初始化可以不填
{
wr1302(dsbaohu,off);
wr1302(dsyear,0x09);
wr1302(dsmonth,0x11);
wr1302(dsday,0x02);
wr1302(dsweek,0x01);
wr1302(dshour,0x23);
wr1302(dsminute,0x57);
wr1302(dssecond,0x55);
wr1302(dsbaohu,on);
}
/*************************************
函数名:dsgettime
函数功能:获取时间到时间型指针
参数:systime *ds1302(时间型数据指针)
返回:无
备注:无
*************************************/
void dsgettime(systime *ds1302) //获取时钟芯片的时钟数据到自定义的结构型数组
{
unsigned char ReadValue;
ReadValue = re1302(dssecond);
ds1302->Second = bcdtohex(ReadValue);
ReadValue = re1302(dsminute);
ds1302->Minute = bcdtohex(ReadValue);
ReadValue = re1302(dshour);
ds1302->Hour = bcdtohex(ReadValue);
ReadValue = re1302(dsday);
ds1302->Day = bcdtohex(ReadValue);
ReadValue = re1302(dsweek);
ds1302->Week = bcdtohex(ReadValue);
ReadValue = re1302(dsmonth);
ds1302->Month =bcdtohex(ReadValue);
ReadValue = re1302(dsyear);
ds1302->Year = bcdtohex(ReadValue);
}
/*************************************
函数名:timetostr
函数功能:将时间转换液晶显示字符放入数组timestr[]
参数:systime *ds1302(时间型数据指针)
返回:无
备注:无
*************************************/
void timetostr(systime *ds1302)
{ if(flaghour<2)
{
ds1302->timestr[0] = ds1302->Hour/10 + 0;
ds1302->timestr[1] = ds1302->Hour%10 + 0;
}
else
{
ds1302->timestr[0] = ;
ds1302->timestr[1] = ;
}
ds1302->timestr[2] = :;
if(flagmin<2)
{
ds1302->timestr[3] = ds1302->Minute/10 + 0;
ds1302->timestr[4] = ds1302->Minute%10 + 0;
}
else
{
ds1302->timestr[3] = ;
ds1302->timestr[4] = ;
}
ds1302->timestr[5] = :;
if(flagsec<2)
{
ds1302->timestr[6] = ds1302->Second/10 + 0;
ds1302->timestr[7] = ds1302->Second%10 + 0;
}
else
{
ds1302->timestr[6] = ;
ds1302->timestr[7] = ;
}
ds1302->timestr[8] = ;
}
/*************************************
函数名:datetostr
函数功能:将日期转换液晶显示字符放入数组datestr[]
参数:systime *ds1302(时间型数据指针)
返回:无
备注:无
*************************************/
void datetostr(systime *ds1302) //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]
{ if(flagyear<2) //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为 2007/07/22
{
ds1302->datestr[0] = 2;
ds1302->datestr[1] = 0;
ds1302->datestr[2] = ds1302->Year/10 + 0;
ds1302->datestr[3] = ds1302->Year%10 + 0;
}
else
{
ds1302->datestr[0] = ;
ds1302->datestr[1] = ;
ds1302->datestr[2] = ;
ds1302->datestr[3] = ;
}
ds1302->datestr[4] = /;
if(flagmonth<2)
{
ds1302->datestr[5] = ds1302->Month/10 + 0;
ds1302->datestr[6] = ds1302->Month%10 + 0;
}
else
{
ds1302->datestr[5] = ;
ds1302->datestr[6] = ;
}
ds1302->datestr[7] = /;
if(flagday<2)
{
ds1302->datestr[8] = ds1302->Day/10 + 0;
ds1302->datestr[9] = ds1302->Day%10 + 0;
}
else
{
ds1302->datestr[8] = ;
ds1302->datestr[9] = ;
}
if(flagweek<2)
{
week_value[0] = ds1302->Week%10 + 0;
//星期的数据另外放到 week_value[]数组里,跟年,月,日的分开存放,因为等一下要在最后显示
}
else
{
week_value[0] = ;
}
week_value[1] = ;
评论