标题: 用Proteus仿真单片机时,LED数码管显示不正常 [打印本页]

作者: wangwing    时间: 2021-7-10 16:40
标题: 用Proteus仿真单片机时,LED数码管显示不正常
如图,第4位显示的“4”,左边的数码管每个引脚的状态都正确,但“4”显示错误

proteus.jpg (354.59 KB, 下载次数: 77)

proteus.jpg

作者: wc86110    时间: 2021-7-12 00:26
有时候是程序、仿真图问题,但有时候却是软件上的瑕疵在作怪
作者: wulin    时间: 2021-7-12 05:39
是软件问题。由于动态扫描驱动数码管程序没有做消隐处理,在实物中会有残影,在仿真中就出现乱码。
作者: 开心就好hhhh    时间: 2021-7-12 17:19
我绝对你最好把程序发出来看一下
作者: 名字不是重点    时间: 2021-7-12 23:15
你的代码有问题!右边显示“4”是打死不变的(硬件驱动),与代码无关!
所以你要重点去查左边的显示,为什么会这样?100%是代码出错了!
作者: 27835030    时间: 2021-7-12 23:25
右边都能显示4,肯定是代码出问题了
作者: wangwing    时间: 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++;
}

作者: 名字不是重点    时间: 2021-7-13 15:06
看到这样的代码就脑壳疼。。。
你的逻辑有点不对吧?
作者: 开心就好hhhh    时间: 2021-7-13 15:27
wangwing 发表于 2021-7-13 11:34
代码如下,请指教:
#define uchar unsigned char
#define uint unsigned int

k2482是啥

作者: glinfei    时间: 2021-7-13 15:29
delayms(2) 动态显示的时间太短了,试试延时20毫秒左右,你想想你电脑屏幕刷新时间都要15ms,你快过它怎么会显示好呢?
作者: lkc8210    时间: 2021-7-13 16:40
因为代码不全,加加减减就成了



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

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

AT89C52,改的
作者: lkc8210    时间: 2021-7-14 14:09
wangwing 发表于 2021-7-14 13:10
代码写得不好,给各位添堵了
本函数用自动重装的计数器,每10毫秒调用一次。用(k2482%4)作控制,每次进 ...

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





作者: gain    时间: 2021-7-14 14:47
看看是不是断码出问题了

作者: wangwing    时间: 2021-7-21 08:23
谢谢各位的回复。
一进入显示函数,就消隐,问题解决。




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