单片机/MCUwilliam hill官网
直播中

j249081716

12年用户 54经验值
擅长:微处理器/微控制
私信 关注
[问答]

关于DS1302的BCD码转换

问一下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)//写写保护;
}

回帖(3)

张三

2012-11-29 09:01:16
读完以后再转的。
举报

op_master

2012-12-31 11:30:56
very helpful, thanks
举报

曾先生

2013-8-24 11:12:35
写的时候直接写十六进制表示的BCD码即可,比如要写如13年就写0X13,08月就写0X08……,读出的时候要把读出的BCD码分离成非压缩BCD码,另一种说法是转换成十进制。个人理解……
举报

更多回帖

发帖
×
20
完善资料,
赚取积分