关于DS1302的BCD码转换
时间:10-02
整理:3721RD
点击:
问一下DS1302写的时候要把十进制数转为BCD码,读的时候要不要转回来呢?
下面是俺写的一个DS1302设置时间的函数,大伙看看这样写对不对?
======================================================
void write_ds1302(uchar add,uchar dat)// 写时序
{
uchar i,k=0x01;
rst=0;
sck=0;
rst=1;
for(i=0;i<8;i++)//写地址
{
if(add&k==0)sio=0;
else sio=1;
k<<=1;
sck=1;
sck=0;
}
k=0x01;//重新置K,将在下一for语句使用
for(i=0;i<8;i++)//写数据
{
if(dat&k==0)sio=0;
else sio=1;
k<<=1;
sck=1;
sck=0;
}
rst=0;
}
========================================================
uchar read_ds1302(uchar add) 读时序
{
uchar i,k=0x01,dat=0;
rst=0;
sck=0;
rst=1;
for(i=0;i<8;i++)//写地址
{
if(add&k==0)sio=0;
else sio=1;
k<<=1;
sck=1;
if(k!=0)sck=0;//当写完最后位时,K为0.此时SCK=1;
}
k=0x01;//重新置K,将在下一for语句使用
for(i=0;i<8;i++)//读数据
{
sck=0;//产生下降沿,此时读数据
if(sio==1)dat|=k;
k<<=1;
sck=1;
sck=0;
}
rst=0;
return dat;
}
==================================================
void set_time(uchar *P) //写时间函数
{
uchar i,tmp;
for(i=0;i<7;i++)//十进制转为BCD码
{
tmp=p[i]/10;//shiwei
p[i]=(p[i]%10)+tmp*16;
}
write_ds1302(0x8e,0)//清写保护
for(i=0;i<7;i++)
{
write_ds1302(0x80+(2*i),p[i]);//将时间写入
delayms(1);
}
write_ds1302(0x8e,0x80)//写写保护;
}
下面是俺写的一个DS1302设置时间的函数,大伙看看这样写对不对?
======================================================
void write_ds1302(uchar add,uchar dat)// 写时序
{
uchar i,k=0x01;
rst=0;
sck=0;
rst=1;
for(i=0;i<8;i++)//写地址
{
if(add&k==0)sio=0;
else sio=1;
k<<=1;
sck=1;
sck=0;
}
k=0x01;//重新置K,将在下一for语句使用
for(i=0;i<8;i++)//写数据
{
if(dat&k==0)sio=0;
else sio=1;
k<<=1;
sck=1;
sck=0;
}
rst=0;
}
========================================================
uchar read_ds1302(uchar add) 读时序
{
uchar i,k=0x01,dat=0;
rst=0;
sck=0;
rst=1;
for(i=0;i<8;i++)//写地址
{
if(add&k==0)sio=0;
else sio=1;
k<<=1;
sck=1;
if(k!=0)sck=0;//当写完最后位时,K为0.此时SCK=1;
}
k=0x01;//重新置K,将在下一for语句使用
for(i=0;i<8;i++)//读数据
{
sck=0;//产生下降沿,此时读数据
if(sio==1)dat|=k;
k<<=1;
sck=1;
sck=0;
}
rst=0;
return dat;
}
==================================================
void set_time(uchar *P) //写时间函数
{
uchar i,tmp;
for(i=0;i<7;i++)//十进制转为BCD码
{
tmp=p[i]/10;//shiwei
p[i]=(p[i]%10)+tmp*16;
}
write_ds1302(0x8e,0)//清写保护
for(i=0;i<7;i++)
{
write_ds1302(0x80+(2*i),p[i]);//将时间写入
delayms(1);
}
write_ds1302(0x8e,0x80)//写写保护;
}
读完以后再转的。
very helpful, thanks
写的时候直接写十六进制表示的BCD码即可,比如要写如13年就写0X13,08月就写0X08……,读出的时候要把读出的BCD码分离成非压缩BCD码,另一种说法是转换成十进制。个人理解……