发 帖  
原厂入驻New
[文章]

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

2014-6-18 09:04:38  4090 单片机
分享
0
本帖最后由 罗罗布淖尔 于 2014-6-18 09:14 编辑

//---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的万年历程序呀,买单片机的时候那个万年历减一按键都没有,我就自己弄,但是老是失败。
阿信509 2014-6-18 10:43:42

回帖奖励 +1 分积分

你的问题应该出在转换BCD码那个地方了

评分

参与人数 1积分 +10 收起 理由
zhou2sheng + 10 感谢您的参与,您的支持是我们最大的动力..

查看全部评分

回复

举报

阿信509 2014-6-18 11:48:18
if((TIME[SetPlace]&0x0f)>9)                                         //换成BCD码。
                                        {
                                                TIME[SetPlace]=TIME[SetPlace]+6;
                                        }
这段BCD转换有错误,比如你原来是0x50,减1后变成0x4f,经过你的算法你算算是多少,肯定不会得到0x49的。
回复

举报

刘佳文 2014-6-18 12:57:17
单片机肯定是可以做减法的      建议楼主还是检查下程序
回复

举报

MR Wang 2014-6-18 14:53:28
这是不可能的。你的乱码是出现在各位变化的时候还是各位变化的时候正常,减到十位的时候就出现乱码了,如果是的话那就是你计算错了,好好审审你的程序吧。
回复

举报

刘益龙 2014-6-19 08:55:04
单片机可以做减法的     你的BCD码换算有问题。
回复

举报

陈彬 2017-7-26 15:31:09
而且楼主普中科技的这个万用历的代码有问题,没感觉到?
回复

举报

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发文章
快速回复 返回顶部 返回列表