找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2660|回复: 1
打印 上一主题 下一主题
收起左侧

关于单片机+DS1302按键控制时间加减的问题

[复制链接]
回帖奖励 4 黑币 回复本帖可获得 2 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
char l_tmpdate[3]={0,9,12};
char l_tmpdisplay[8];
void Write_Ds1302( unsigned char address,unsigned char dat )     
{
     RST=0;
    _nop_();
     SCK=0;
    _nop_();
     RST=1;   
       _nop_();                    //启动
     Write_Ds1302_Byte(address);    //发送地址
     Write_Ds1302_Byte(dat);        //发送数据
     RST=0;                      //恢复
}

void amin()
{
    l_tmpdate[1]=((l_tmpdate[1]+1)/16)*10 + ((l_tmpdate[1]+1)%16);   //分加1
    if(l_tmpdate[1]>59)    l_tmpdate[1]=0;                   //判断
    l_tmpdate[1]=l_tmpdate[1]%10+l_tmpdate[1]/10*16;   //转十六进制
    Write_Ds1302(0x8E,0X00);          //开写保护
    Write_Ds1302(0x82,l_tmpdate[1]);  //写分寄存器
    Write_Ds1302(0x8E,0x80);           //关写保护
}
void bmin()
{
    l_tmpdate[1]=((l_tmpdate[1]-1)/16)*10 + ((l_tmpdate[1]-1)%16);   //分减1
    if(l_tmpdate[1]<0)    l_tmpdate[1]=59;                   //判断
    l_tmpdate[1]=l_tmpdate[1]%10+l_tmpdate[1]/10*16;   //转十六进制
    Write_Ds1302(0x8E,0X00);          //开写保护
    Write_Ds1302(0x82,l_tmpdate[1]);  //写分寄存器
    Write_Ds1302(0x8E,0x80);           //关写保护
}

上面是我的相关代码,按键控制,加时间正常显示,减少时,时间从我8减少到0正常,随后变跳到5,在0-5范围内循环



WM~95WUKQC$JR(Y7I`4)JX8.png (146.23 KB, 下载次数: 33)

WM~95WUKQC$JR(Y7I`4)JX8.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:517466 发表于 2019-6-17 17:07 | 只看该作者
l_tmpdate[1]=((l_tmpdate[1]+1)/16)*10 + ((l_tmpdate[1]+1)%16);   //分加1
    if(l_tmpdate[1]>59)    l_tmpdate[1]=0;                   //判断
第一行把10进制的l_tmpdate[1]+1后,转成16进制格式数据,结果第二行中又和10进制数据比较,你确定要这么做?对于10进制的60,在你的第一行处理中将变成30+12,变成了十进制的42了,然后去和10进制的59比,结论肯定是错的,与你想要的到59分后再加1变成0的结果是不一致的。要么改成if(l_tmpdate[1]>41),要么第一行不要做转换处理,改成l_tmpdate[1]++;

另外:l_tmpdate[1]=((l_tmpdate[1]+1)/16)*10 + ((l_tmpdate[1]+1)%16);   //分加1
这样的处理不好,转换成机器码的时候,会多出许多代码。
//加处理
l_tmpdate[1]++;
if(l_tmpdate[1]>59)    l_tmpdate[1]=0;                   //判断

减处理:
if (l_tmpdate[1]==0)  
    l_tmpdate[1]=59;
else
    l_tmpdate[1]--;
这是不是和你想要的是一样的结果?
数据在写入DS1302的时候,再转换为16进制数据即可。之前的判断用十进制的处理就行。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表