找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4633|回复: 15
收起左侧

用Proteus仿真单片机时,LED数码管显示不正常

[复制链接]
ID:483407 发表于 2021-7-10 16:40 | 显示全部楼层 |阅读模式
如图,第4位显示的“4”,左边的数码管每个引脚的状态都正确,但“4”显示错误
proteus.jpg
回复

使用道具 举报

ID:96682 发表于 2021-7-12 00:26 来自手机 | 显示全部楼层
有时候是程序、仿真图问题,但有时候却是软件上的瑕疵在作怪
回复

使用道具 举报

ID:213173 发表于 2021-7-12 05:39 | 显示全部楼层
是软件问题。由于动态扫描驱动数码管程序没有做消隐处理,在实物中会有残影,在仿真中就出现乱码。
回复

使用道具 举报

ID:934353 发表于 2021-7-12 17:19 | 显示全部楼层
我绝对你最好把程序发出来看一下
回复

使用道具 举报

ID:824490 发表于 2021-7-12 23:15 | 显示全部楼层
你的代码有问题!右边显示“4”是打死不变的(硬件驱动),与代码无关!
所以你要重点去查左边的显示,为什么会这样?100%是代码出错了!
回复

使用道具 举报

ID:897180 发表于 2021-7-12 23:25 | 显示全部楼层
右边都能显示4,肯定是代码出问题了
回复

使用道具 举报

ID:483407 发表于 2021-7-13 11:34 | 显示全部楼层
代码如下,请指教:
#define uchar unsigned char
#define uint unsigned int
#define dispout P1
#define dispbit P2


//*********************0****1****2****3****4****5****6****7****8****9***10***11***12***13***14***15***16***17***18***19***20***21****
//*********************0****1****2****3****4****5****6****7****8****9****a****b****c****d****e****f****h****j****l****p****u****y****
uchar code seg7[22]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xb9,0xde,0x8c,0x8e,0x89,0x8e,0xb8,0x8c,0xc1,0x91};//new board
//********************************************************
void display2482(uchar dat1,uchar dat2,uchar dat3)//显示格式:dat1 前2位,dat2 后2位,dat3 首位显示的字母,第1位+X
{
  uchar a1,a2,a3,a4;
  //dat2=ledbaktime;
      a1=dat1/10+dat3;a2=dat1%10;a3=dat2/10;a4=dat2%10;
          a1=1;a2=2;a3=3;a4=4;
          if(ledbaktime>0){dispON=1;} else {dispON=0;mode_num=0;modemenu=0;modedelay=0;}
          
      if((k2482%4==0))     {dispout=seg7[a1];if((a1==0)|(dispON==0))dispbit=0x00;else dispbit=0x01;delayms(2);dispbit=0x00;}
      //else if((k2482%4==1)){if (colon)dispout=seg7[a2]-0x80;else dispout=seg7[a2];if(dispON==0)dispbit=0x00;else dispbit=0x02;}
      else if((k2482%4==1)){if (colon)dispout=seg7[a2]-0x80;else dispout=seg7[a2];if(dispON==0)dispbit=0x00;else dispbit=0x02;delayms(2);dispbit=0x00;}
      else if((k2482%4==2)){dispout=seg7[2];if(dispON==0)dispbit=0x00;else dispbit=0x04;delayms(2);dispbit=0x00;}
      else if((k2482%4==3)){dispout=seg7[a4];if(dispON==0)dispbit=0x00;else dispbit=0x08;delayms(2);dispbit=0x00;}
      k2482++;
}
回复

使用道具 举报

ID:824490 发表于 2021-7-13 15:06 | 显示全部楼层
看到这样的代码就脑壳疼。。。
你的逻辑有点不对吧?
回复

使用道具 举报

ID:934353 发表于 2021-7-13 15:27 | 显示全部楼层
wangwing 发表于 2021-7-13 11:34
代码如下,请指教:
#define uchar unsigned char
#define uint unsigned int

k2482是啥
回复

使用道具 举报

ID:844772 发表于 2021-7-13 15:29 | 显示全部楼层
delayms(2) 动态显示的时间太短了,试试延时20毫秒左右,你想想你电脑屏幕刷新时间都要15ms,你快过它怎么会显示好呢?
回复

使用道具 举报

ID:161164 发表于 2021-7-13 16:40 | 显示全部楼层
因为代码不全,加加减减就成了
20210713_163527.png


另外请问楼主的Protues内的STC8单片机是如何汇入的?
回复

使用道具 举报

ID:483407 发表于 2021-7-14 13:10 | 显示全部楼层
代码写得不好,给各位添堵了
本函数用自动重装的计数器,每10毫秒调用一次。用(k2482%4)作控制,每次进入后只显示一位。
1楼的截图,是没有消隐(delayms(2);dispbit=0x00;)的结果,如果加上这2个消隐语句,直接没有显示了。
消隐时间,从1毫秒到9毫秒,效果是一样的,没有显示。
回复

使用道具 举报

ID:483407 发表于 2021-7-14 13:10 | 显示全部楼层
lkc8210 发表于 2021-7-13 16:40
因为代码不全,加加减减就成了

AT89C52,改的
回复

使用道具 举报

ID:161164 发表于 2021-7-14 14:09 | 显示全部楼层
wangwing 发表于 2021-7-14 13:10
代码写得不好,给各位添堵了
本函数用自动重装的计数器,每10毫秒调用一次。用(k2482%4)作控制,每次进 ...

可能是你的delayms()的運行時間太短了
用以下代碼和Protues的邏輯分析儀看看delayms(10)是多久吧
2021-07-14_140639.png

2021-07-14_140616.png

回复

使用道具 举报

ID:950257 发表于 2021-7-14 14:47 | 显示全部楼层
看看是不是断码出问题了
回复

使用道具 举报

ID:483407 发表于 2021-7-21 08:23 | 显示全部楼层
谢谢各位的回复。
一进入显示函数,就消隐,问题解决。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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