找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4243|回复: 4
打印 上一主题 下一主题
收起左侧

51单片机数码管显示问题分析

[复制链接]
跳转到指定楼层
楼主
ID:473410 发表于 2019-1-28 18:08 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
话不多说,直接上单片机代码
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单片机,请多指教!

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:473410 发表于 2019-1-30 13:56 来自手机 | 显示全部楼层
liut_text 发表于 2019-1-28 20:02
兄弟,你u8应该定义的是unsigned char或者其他无符号类型的,然后变量i减到0之后再减1,不是变成-1,是会变 ...

哦哦,明白了秒懂,谢谢了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表