找回密码
 立即注册

QQ登录

只需一步,快速开始

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

用Proteus动态显示管输出数字为什么有些显示不出来?附单片机程序

[复制链接]
跳转到指定楼层
楼主
我写的单片机代码是这样的

  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit LE1=P2^7;
  5. sbit LE2=P2^6;
  6. void delay_ms(uint j)
  7. {uchar m,n;
  8. for(m=j;m>0;m--)
  9. for(n=30;n>0;n--);}
  10. void main()
  11. {uchar code xuanma[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
  12. uchar code duanma[6]={0x3f,0x06,0x5b,0x4f,0x66,0x6d};//显示012345
  13. uchar i;
  14. while(1)
  15. {for(i=0;i<6;i++)
  16. {LE1=1;
  17. P1=xuanma[i];
  18. LE1=0;
  19. LE2=1;
  20. P1=duanma[i];
  21. LE2=0;
  22. delay_ms(3);
  23. }}}
复制代码

但是2和4显示不出来,就像下面图这样,
希望前辈们不吝赐教


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

使用道具 举报

8#
ID:906945 发表于 2021-4-17 11:37 | 只看该作者
mengzhixinheng 发表于 2021-4-16 22:05
其实是逻辑不严谨造成的,消影的本质是重新初始化端口。位选数据没有改变的时候,就打开段选自然会出错。两 ...

好哒好哒,我再体会体会,谢谢前辈
回复

使用道具 举报

7#
ID:906945 发表于 2021-4-17 11:36 | 只看该作者
wulin 发表于 2021-4-16 21:29
仿真与实物还是有区别的。在实物中不会残缺,只是有鬼影。实践中加消隐为佳。

好哒好哒,谢谢前辈
回复

使用道具 举报

6#
ID:89515 发表于 2021-4-16 22:05 来自手机 | 只看该作者
其实是逻辑不严谨造成的,消影的本质是重新初始化端口。位选数据没有改变的时候,就打开段选自然会出错。两个数据有瞬间的覆盖现象就会出现所谓的鬼影。不知道你能否明白!!!
回复

使用道具 举报

5#
ID:213173 发表于 2021-4-16 21:29 | 只看该作者
笨学单片机 发表于 2021-4-16 20:02
不过大佬我发现就是不用前面的消隐,就把LE1=1放在P1=xuanma后面就可以呀,
void main()
{uchar code x ...

仿真与实物还是有区别的。在实物中不会残缺,只是有鬼影。实践中加消隐为佳。
回复

使用道具 举报

地板
ID:906945 发表于 2021-4-16 20:02 | 只看该作者
笨学单片机 发表于 2021-4-16 19:52
啊啊啊,可以了可以了,谢谢大佬谢谢大佬

不过大佬我发现就是不用前面的消隐,就把LE1=1放在P1=xuanma[ i]后面就可以呀,
  1. void main()
  2. {uchar code xuanma[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
  3. uchar code duanma[6]={0x3f,0x06,0x5b,0x4f,0x66,0x6d};
  4. uchar i;
  5. while(1)
  6. {for(i=0;i<6;i++)
  7. {P1=xuanma[i];LE1=1;
  8. LE1=0;
  9. P1=duanma[i];LE2=1;
  10. LE2=0;
  11. delay_ms(1);
  12. }}}
复制代码

这是为什么呢?是不是如果我先写P1=xuanma[ i],就先把P1的输出给了锁存器,这样再用锁存器就没问题了吗?
回复

使用道具 举报

板凳
ID:906945 发表于 2021-4-16 19:52 | 只看该作者
wulin 发表于 2021-4-16 19:41
只要添加消隐语句就行了

啊啊啊,可以了可以了,谢谢大佬谢谢大佬
回复

使用道具 举报

沙发
ID:213173 发表于 2021-4-16 19:41 | 只看该作者
只要添加消隐语句就行了
  1. void main()
  2. {
  3.         uchar code xuanma[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
  4.         uchar code duanma[6]={0x3f,0x06,0x5b,0x4f,0x66,0x6d};//显示012345
  5.         uchar i;
  6.         while(1)
  7.         {
  8.                 P1=0x00;LE2=1;LE2=0;//段消隐
  9.                 P1=xuanma[i];LE1=1;LE1=0; //送位码
  10.                 P1=duanma[i];LE2=1;LE2=0;//送段码
  11.                 delay_ms(1);
  12.                 i=++i%6;
  13.         }
  14. }
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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