单片机运算是不是不能用减法呀
时间:10-02
整理:3721RD
点击:
//---DS1302时钟初始化2013年1月1日星期二12点00分00秒。---//
//---存储顺序是秒分时日月周年,存储格式是用BCD码---//
uchar TIME[7] = {0, 0, 0x12, 0x01, 0x01, 0x02, 0x14};
void main() //这是万年历里的主程序
{
unsigned char i;
Int0Configuration();
LcdInit();
Ds1302Init();
while(1)
{
if(SetState==0)
{
Ds1302ReadTime();
}
else
{
if(K1==0) //检测按键K1是否按下,K1的功能是选择设置秒分时日月周年中哪一个
{
Delay10ms(); //消除抖动
if(K1==0)
{
SetPlace++;
if(SetPlace>=7)
SetPlace=0;
}
while((i<50)&&(K1==0)) //检测按键是否松
{
Delay10ms();
i++;
}
i=0;
}
if(K2==0) //检测按键K2是否按下,K2的功能是按一下,被选中时间项的加一
{
Delay10ms(); //消除抖动
if(K2==0)
{
TIME[SetPlace]++; //我的问题是我这里改成TIME[SetPlace]--,下面对应的范围 // 也改了。秒和分小于等于零就变成59,但是为什么输出会变成乱码
if((TIME[SetPlace]&0x0f)>9) //换成BCD码。
{
TIME[SetPlace]=TIME[SetPlace]+6;
}
if((TIME[SetPlace]>=0x60)&&(SetPlace<2)) //分秒只能到59
{
TIME[SetPlace]=0;
}
if((TIME[SetPlace]>=0x24)&&(SetPlace==2)) //小时只能到23
{
TIME[SetPlace]=0;
}
if((TIME[SetPlace]>=0x32)&&(SetPlace==3)) //日只能到31
{
TIME[SetPlace]=0;
}
if((TIME[SetPlace]>=0x13)&&(SetPlace==4)) //月只能到12
{
TIME[SetPlace]=0;
}
if((TIME[SetPlace]>=0x7)&&(SetPlace==5)) //周只能到7
{
TIME[SetPlace]=1;
}
// if(SetPlace==5) //月只能到12
// {
// TIME[SetPlace]=;
// }
}
while((i<50)&&(K2==0)) //检测按键是否松开
{
Delay10ms();
i++;
}
i=0;
}
}
LcdDisplay();
}
我的问题在上面的注释,想了很久没想,是因为BCD码不能做减法吗。只截取了一部分程序,不知大家能不嫩看懂。第一次编程单片机,遇到好多问题。顺便提一下,不知道谁有普中科技HC6800-ES V2.0的万年历程序呀,买单片机的时候那个万年历减一按键都没有,我就自己弄,但是老是失败。
你的问题应该出在转换BCD码那个地方了
if((TIME[SetPlace]&0x0f)>9) //换成BCD码。
{
TIME[SetPlace]=TIME[SetPlace]+6;
}
这段BCD转换有错误,比如你原来是0x50,减1后变成0x4f,经过你的算法你算算是多少,肯定不会得到0x49的。
单片机肯定是可以做减法的 建议小编还是检查下程序
这是不可能的。你的乱码是出现在各位变化的时候还是各位变化的时候正常,减到十位的时候就出现乱码了,如果是的话那就是你计算错了,好好审审你的程序吧。
单片机可以做减法的 你的BCD码换算有问题。
而且小编普中科技的这个万用历的代码有问题,没感觉到?