标题: 51单片机数码管显示问题分析 [打印本页]

作者: 放眼天下    时间: 2019-1-28 18:08
标题: 51单片机数码管显示问题分析
话不多说,直接上单片机代码
void digdisplay(){
        u8 i;
        for(i=0;i<8;i++)
        {
                switch(i)
                {
                        case(0):LSA=0;LSB=0;LSC=0;break;
                        case(1):LSA=1;LSB=0;LSC=0;break;
                        case(2):LSA=0;LSB=1;LSC=0;break;
                        case(3):LSA=1;LSB=1;LSC=0;break;
                        case(4):LSA=0;LSB=0;LSC=1;break;
                        case(5):LSA=1;LSB=0;LSC=1;break;
                        case(6):LSA=0;LSB=1;LSC=1;break;
                        case(7):LSA=1;LSB=1;LSC=1;break;               
                }
                P0=smgduan[i];
                delay(200);
                P0=0x00;
        }
}
这是用了138译码器写的动态数码管显示7-0这8个数字的一个函数,其余部分都没有什么问题,程序可以正常运行,数码管也是按照希望的从右到左顺序循环显示,但是我想让它从右到左显示,就把程序改成了下列形式void digdisplay()
{
        u8 i;
        for(i=7;i>=0;i--)
        {
                switch(i)
                {
                        case(0):LSA=0;LSB=0;LSC=0;break;
                        case(1):LSA=1;LSB=0;LSC=0;break;
                        case(2):LSA=0;LSB=1;LSC=0;break;
                        case(3):LSA=1;LSB=1;LSC=0;break;
                        case(4):LSA=0;LSB=0;LSC=1;break;
                        case(5):LSA=1;LSB=0;LSC=1;break;
                        case(6):LSA=0;LSB=1;LSC=1;break;
                        case(7):LSA=1;LSB=1;LSC=1;break;               
                }
                P0=smgduan[i];
                delay(200);
                P0=0x00;
        }
}
按道理来说是没有问题的啊,但是正真的情况是它会从右到左显示7-0之后,最后一位数码管就变成了8,然后卡死在这里,很长时间(大概40s)之后重复显示7-0.这就不太明白啦。然后我就把程序修改成如下形式
void digdisplay()
{
        u8 i;
        for(i=8;i>0;i--)
        {
                switch(i)
                {
                        case(1):LSA=0;LSB=0;LSC=0;break;
                        case(2):LSA=1;LSB=0;LSC=0;break;
                        case(3):LSA=0;LSB=1;LSC=0;break;
                        case(4):LSA=1;LSB=1;LSC=0;break;
                        case(5):LSA=0;LSB=0;LSC=1;break;
                        case(6):LSA=1;LSB=0;LSC=1;break;
                        case(7):LSA=0;LSB=1;LSC=1;break;
                        case(8):LSA=1;LSB=1;LSC=1;break;               
                }
                P0=smgduan[i-1];
                delay(200);
                P0=0x00;
        }
}

这就可以满足从右到左循环显示7-0,而且期间没有停留,是一直循环,但是我感觉这两个程序表达的应该是一个意思啊,不知道为什么第一个不能实现希望的效果。求大神解答,初学51单片机,请多指教!


作者: liut_text    时间: 2019-1-28 20:02
兄弟,你u8应该定义的是unsigned char或者其他无符号类型的,然后变量i减到0之后再减1,不是变成-1,是会变成一个大于0的数,如果是unsigned char就会变成255,然后继续循环,希望对你有帮助
作者: 放眼天下    时间: 2019-1-30 13:56
liut_text 发表于 2019-1-28 20:02
兄弟,你u8应该定义的是unsigned char或者其他无符号类型的,然后变量i减到0之后再减1,不是变成-1,是会变 ...

哦哦,明白了秒懂,谢谢了
作者: sheng7533967    时间: 2019-1-30 16:20
放眼天下 发表于 2019-1-30 13:56
哦哦,明白了秒懂,谢谢了

嗯!还不错,是个妙人儿!
作者: 南瓜头    时间: 2019-10-18 22:30
能有51板子的万能历吗





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