打印

请教一个关于DS1302的问题

[复制链接]
1450|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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

粉丝