请教一个关于DS1302的问题

[复制链接]
 楼主| jy02323480 发表于 2009-4-1 18:41 | 显示全部楼层 |阅读模式
CD, AD, dc, se, TE
我在用ds1302做时钟的过程中出现这样一个奇怪的现象,在调时间的过程中,当小时调到35的时候,在按加1就会变到30,然后在按加1调时间时,到了42的时候在加1就变到0了,我的本意是想让它能从0调到59,大于59又变为0.
我些的程序如下,请高手指教这是什么原因????
void UpDown (unsigned char ucAddr,unsigned char flag)
{//时间增减设置(FLAG为1时间增为0时间减)
   unsigned char ucDat,max,min;    
  ucDat=Read1302(ucAddr+1);
  ucDat=ucDat&0x7f;
  if(flag)   ucDat++;
  else       ucDat--;  
 if(ucDat>59)  ucDat=0;
 if(ucDat<0)   ucDat=59;
   ucDat=ucDat|0x80;
    DS1302_SetProtect(0);  //写保护,允许写
    Write1302(ucAddr,ucDat);
    DS1302_SetProtect(1);
}
 楼主| jy02323480 发表于 2009-4-1 22:14 | 显示全部楼层

问题已经解决

原因是读回来的值是BCD码,要转化为十进制后在判断
写如的时候又把BCD转化为十进制

void UpDown (unsigned char ucAddr,unsigned char flag)
{//时间增减设置(FLAG为1时间增为0时间减)
   unsigned char ucDat,max,min;    
  ucDat=Read1302(ucAddr+1);
  ucDat=ucDat&0x7f;
   ucDat = ((ucDat&0x70)>>4)*10 + (ucDat&0x0F);
  if(ucAddr==0x80) { max=59;min=0;}
  if(ucAddr==0x82) { max=59;min=0;}    
  if(ucAddr==0x84) { max=23;min=0;}
  if(ucAddr==0x86) { max=31;min=0;}
  if(ucAddr==0x88) { max=12;min=0;}
  if(ucAddr==0x8a) { max=7;min=0;}
  if(ucAddr==0x8c) { max=99;min=0;}
  if(flag==1)   ucDat++;
  else       ucDat--;  
  if(ucDat>max)  ucDat=min;
  if(ucDat<min)   ucDat=max;
     ucDat=((ucDat/10)<<4 | (ucDat%10)); 
       ucDat=ucDat|0x80;
    DS1302_SetProtect(0);
    Write1302(ucAddr,ucDat);
    DS1302_SetProtect(1);
}
songbangyan 发表于 2009-4-2 10:37 | 显示全部楼层

呵呵,是不是自问自答啊?

您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

13

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部