微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于DS1302的BCD码转换

关于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)//写写保护;
}

读完以后再转的。

very helpful, thanks

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top