标题:
关于单片机+DS1302按键控制时间加减的问题
[打印本页]
作者:
佩西范
时间:
2019-6-17 15:13
标题:
关于单片机+DS1302按键控制时间加减的问题
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, 下载次数: 44)
下载附件
2019-6-17 15:09 上传
作者:
suncat0504
时间:
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进制数据即可。之前的判断用十进制的处理就行。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1