微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 单片机运算是不是不能用减法呀

单片机运算是不是不能用减法呀

时间: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码换算有问题。

而且小编普中科技的这个万用历的代码有问题,没感觉到?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top