(结贴,仿真BUG)请教:用定时器作的动态数码管扫描总是.

2020-02-05 09:14发布

本帖最后由 renwocai 于 2012-5-30 11:33 编辑

比如4位共阳数码管,我希望它显示0123,结果只显示012,段码接P0口,位码接P2.0到P2.3.
程序如下:
  1. #include <at89x52.h>
  2. #define uchar unsigned char
  3. uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  4. uchar i=0;
  5. sbit h4=P2^3;        //共阳,低电平有效
  6. sbit h3=P2^2;
  7. sbit h2=P2^1;
  8. sbit h1=P2^0;

  9. void timer0()interrupt 1
  10. {
  11.         TH0=(65536-10000)/256;
  12.         TL0=(65536-10000)%256;
  13.         switch(i)
  14.         {
  15.                 case 0:
  16.                 {
  17.                         h1=1;h2=0;h3=0;h4=0;P0=tab[0];
  18.                 };break;
  19.                 case 1:
  20.                 {
  21.                         h1=0;h2=1;h3=0;h4=0;P0=tab[1];
  22.                 };break;               
  23.                 case 2:
  24.                 {
  25.                         h1=0;h2=0;h3=1;h4=0;P0=tab[2];
  26.                 };break;               
  27.                 case 3:
  28.                 {
  29.                         h1=0;h2=0;h3=0;h4=1;P0=tab[3];
  30.                 };break;
  31.         }
  32.         i++;
  33.         if(i==4)
  34.         i=0;
  35. }
  36. main()
  37. {
  38.         TMOD=0X01;
  39.         EA=1;
  40.         ET0=1;
  41.         TH0=(65536-50000)/256;
  42.         TL0=(65536-50000)%256;
  43.         TR0=1;
  44.         while(1);
  45. }
复制代码结果如下:
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
20条回答
little_Monkey
1楼-- · 2020-02-06 06:20
把case0~3依次换成case 1~4,然后自己想想为什么
little_Monkey
2楼-- · 2020-02-06 06:27
renwocai 发表于 2012-5-29 23:38
没有。应该是最后一位点亮时间过短。但不知道为什么

这个问题有多种方法可以解决,除了上面说明的外,还可以直接把if(i==4) i=0;放到switch前面,switch里面不用修改
millwood0
3楼-- · 2020-02-06 10:44
 精彩回答 2  元偷偷看……
無智
4楼-- · 2020-02-06 14:00
主要还是i++和i==4的问题。
elecfun
5楼-- · 2020-02-06 18:59
#include <at89x52.h>
#define uchar unsigned char

uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar i=0;

void
timer0() interrupt 1
{

    TH0=(65536-10000)/256;
    TL0=(65536-10000)%256;
   
    P2 = 0x01 << i;
    P0 = tab[i];
    if
(++i >= 4)
        i = 0;
}


void
main(void)
{

    TMOD = 0x01;
    EA   = 1;
    ET0  = 1;
    TH0  = (65536-10000)/256;
    TL0  = (65536-10000)%256;
    TR0  = 1;

    while
(1) ;
}


millwood0
6楼-- · 2020-02-06 22:18
here is the waveform on the various pins.

As you can see, h4 did go high and the desired value (0xb0) is written on P0 when h4 went high.

what you observed is proteus' animation anomaly.

the lesson learned here is that simulation is only useful if you understand its limitations.

bad C51 leds.PNG (30.54 KB, 下载次数: 1)

下载附件

2012-5-30 07:16 上传

一周热门 更多>