关于DS1302的BCD码转换

2019-07-16 03:29发布

问一下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条回答
lovezjf234
1楼-- · 2019-07-16 05:38
读完以后再转的。
op_master
2楼-- · 2019-07-16 11:04
very helpful, thanks
just-electronic
3楼-- · 2019-07-16 16:42
 精彩回答 2  元偷偷看……

一周热门 更多>