标题: 单片机4位数码管程序 2位做递增 2位做递减,小白求大神指点一二 [打印本页]

作者: dididada    时间: 2021-7-16 00:53
标题: 单片机4位数码管程序 2位做递增 2位做递减,小白求大神指点一二
4位数码管 2位做递增 2位做递减
我定义o=4 做递减 第一次循环执行正常 第二次循环 调试看到o变成255了 这里不是赋值4了吗怎么还会变成255?
求大神指点。


void main()
{
unsigned int i;
unsigned char t= 00;
unsigned char o= 04;
for(i=0;i<500;i++)
{

  display(); //初始化上电显示 8888

}

while(1)
                {
               
            led[0]=o/10%10;
            led[1]=o%10;

                led[2]=t/10%10;
                led[3]=t%10;
                for(i=0;i<500;i++)
                  {

                  display();

                  }
                t++;
                o--;
                if(t>3)
                {
                                 t=0;
                                 
                 }
                 if(o<0)
                 {
                  o=4;

                 }
}
}


作者: dididada    时间: 2021-7-16 00:54
本帖最后由 dididada 于 2021-7-16 01:01 编辑

已解决,发个贴瞬间觉悟
if(o==0) 不能小于,小于就是char最大值了,进入死循环了。
下面if(o==0) 等于了 上面的就不能这么写if(i>3),也必须用==,不然会少if(==)会少执行一次
作者: sadv    时间: 2021-7-16 10:54
你也是牛啊,半夜一点还在搞。发生这种问题就是在提醒你,对数据操作的时候时刻要注意溢出的问题,一个8位的变量最大就表示到255,所以你在操作的时候就要注意我这样子操作会不会溢出,溢出后会对我的程序造成什么影响,我需不需要规避这个溢出,怎么去规避
作者: hhdsdy    时间: 2021-7-16 11:37
要对255之类的数值敏感,看到这类数值就有个大概的方向了
作者: lkc8210    时间: 2021-7-16 11:45
dididada 发表于 2021-7-16 00:54
已解决,发个贴瞬间觉悟
if(o==0) 不能小于,小于就是char最大值了,进入死循环了。
下面if(o==0) 等于了 ...

原程序也可以用
把o 定义为signed char(-128~127)就可以了
作者: yzwzfyz    时间: 2021-7-16 14:55
如果你能把【4位数码管】看成32个LED灯来做事,则什么问题也不存在了。
递增递减与LED无关。你只有做两个存储单元(变量)就可以了,一个增,一个减。而后再显示这两个值。
放在哪位显示,则随你高兴。

作者: sadv    时间: 2021-7-16 19:32
yzwzfyz 发表于 2021-7-16 14:55
如果你能把【4位数码管】看成32个LED灯来做事,则什么问题也不存在了。
递增递减与LED无关。你只有做两个 ...

处处都有大佬的身影




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1