找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4281|回复: 9
收起左侧

proteus+单片机数码管显示问题,显示太快的话,软件会乱码

[复制链接]
ID:418425 发表于 2019-1-7 00:08 | 显示全部楼层 |阅读模式
刚刚上手proteus这个软件,在做ad转换实验时,遇到一个问题,数码管显示太快的话,软件会乱码,不知道什么原因,求助一下。
  1. /* adc0804 实验 display*/

  2. #include<reg52.h>
  3. #include<intrins.h>
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. #define MS 5  //数码管显示时间

  7. sbit dula=P2^6;
  8. sbit wela=P2^7;
  9. sbit cs=P3^5;        //adc0804 端口
  10. sbit rd=P3^6;
  11. sbit wr=P3^7;

  12. uchar code table[]={
  13.         0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
  14.                                         0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
  15. };

  16. void delayms(uint xms)
  17. {
  18.         uint i,j;
  19.         for(i=xms;i>0;i--)
  20.                 for(j=110;j>0;j--);
  21. }

  22. void display(uchar bai,uchar shi,uchar ge)
  23. {
  24.         dula=1;
  25.         P0=table[bai];
  26.         dula=0;
  27.         P0=0xff;
  28.         wela=1;
  29.         P0=0x37;
  30.         wela=0;
  31.         delayms(MS);

  32.         dula=1;
  33.         P0=table[shi];
  34.         dula=0;
  35.         P0=0xff;
  36.         wela=1;
  37.         P0=0x2f;
  38.         wela=0;
  39.         delayms(MS);

  40.         dula=1;
  41.         P0=table[ge];
  42.         dula=0;
  43.         P0=0xff;
  44.         wela=1;
  45.         P0=0x1f;
  46.         wela=0;
  47.         delayms(MS);
  48. }

  49. void main()
  50. {
  51.         uchar a,A1,A2,A3,adval;
  52.         cs=0;                                           //cs一直为0即可
  53.         while(1)
  54.         {
  55.                 wr=1;                                           //wr 先拉高后置低 等待_nop_ ();
  56.                 _nop_();
  57.                 wr=0;
  58.                 _nop_();
  59.                 wr=1;
  60.                 for(a=10;a>0;a--)
  61.                 {                                                   //等待数据
  62.                         display(A1,A2,A3);
  63.                 }
  64.                 P1=0xff;
  65.                 rd=1;
  66.                 _nop_();
  67.                 rd=0;
  68.                 _nop_();
  69.                 adval=P1;
  70.                 rd=1;
  71.                 A1=adval/100;
  72.                 A2=adval/100%10;
  73.                 A3=adval%10;

  74.         }
  75. }
复制代码


回复

使用道具 举报

ID:213173 发表于 2019-1-7 06:49 | 显示全部楼层
这个显示程序是针对用锁存器解决共用P0传输段码和位码编写的,但有缺陷!仿真时会出乱码,实际电路也不可能有效消除鬼影。楼主改成如下步骤:先消隐、送位码、送段码,这样就可以了。
void display(uchar bai,uchar shi,uchar ge)
{
        dula=1;
        P0=0x00;
        dula=0;
       
        wela=1;
        P0=0x37;
        wela=0;
       
        dula=1;
        P0=table[bai];
        dula=0;
        delayms(MS);
       
        dula=1;
        P0=0x00;
        dula=0;
       
        wela=1;
        P0=0x2f;
        wela=0;
       
        dula=1;
        P0=table[shi];
        dula=0;
        delayms(MS);
       
        dula=1;
        P0=0x00;
        dula=0;
       
        wela=1;
        P0=0x1f;
        wela=0;
       
        dula=1;
        P0=table[ge];
        dula=0;
        delayms(MS);
}
回复

使用道具 举报

ID:7485 发表于 2019-1-7 07:51 | 显示全部楼层
怎么是“软件会乱码”?

在刷新之前,先关闭显示,你试一试。
回复

使用道具 举报

ID:123289 发表于 2019-1-7 07:53 | 显示全部楼层
只有“人”会乱。看你程序规划的是否合理。
回复

使用道具 举报

ID:463496 发表于 2019-1-7 10:05 | 显示全部楼层
更新显示的时间太短无法正常更新显示数据
回复

使用道具 举报

ID:149389 发表于 2019-1-7 19:04 | 显示全部楼层
消隐一下“鬼影”应该就好了,位选切换的时候,断码对应的数码管显示全灭就好了。
回复

使用道具 举报

ID:418425 发表于 2019-1-7 22:45 | 显示全部楼层
wulin 发表于 2019-1-7 06:49
这个显示程序是针对用锁存器解决共用P0传输段码和位码编写的,但有缺陷!仿真时会出乱码,实际电路也不可能 ...

我改了,果然是这个原因,谢谢了
回复

使用道具 举报

ID:892140 发表于 2022-6-8 09:49 | 显示全部楼层
yf15966844335 发表于 2019-1-7 22:45
我改了,果然是这个原因,谢谢了

怎么改的啊,我也乱码了
回复

使用道具 举报

ID:1032822 发表于 2022-6-8 16:24 | 显示全部楼层
不会吧,硬件怎么会使软件乱码,你先消抖,再进行段位码的传送,还有你要处理好,数码管给最大的不好就是处理不好,会产生闪烁
回复

使用道具 举报

ID:329625 发表于 2022-6-8 18:52 | 显示全部楼层
有两种情况会出现乱码,第一延时太短,加大延时即可,第二是位码和短码的顺序也会影响,第二种情况实物里面不会影响
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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