动态扫描为什么显示乱码啊,求高手帮找找原因


我用的是动态扫描。程序入下:(具体Proteus文件在附件里,附件里也是这段程序)

#include<reg51.h>
char TAB[10]={0xc0,0xf9,0xa4,0xb0,0x99,
              0x92,0x83,0xf8,0x80,0x98};
//==================================== 共阳码段
void delay1ms(char x);  //声明延时函数
char disp[4]={8,0,5,1}; //声明显示数据
unsigned char scan;     //声明扫描信号
char i,j;               //声明变量i,j
main()                  //
{ while(1)              //while循环开始
  {scan=1;              //设定扫描信号初始值
    for(i=3;i>=0;i--)   //for语句开始
    {j=disp;        // 取出显示数据
     P2=TAB[j];         //转换成驱动信号,并输出到P2口
     P1=~scan;           //输出扫描信号
     delay1ms(4);       //延迟4ms
     scan<<=1;          //下一个扫描信号
    }
  }
}
void delay1ms(char x)   //延时函数
{ int i,j;
  for(i=0;i<x;i++)
    for(j=0;j<120;j++);
}

我也来说两句 查看全部回复

最新回复

  • woaizhangwuji (2008-9-09 12:54:20)

    附件在此——————

    动态扫描.rar
    (2008-09-09 12:54:20, Size: 110 KB, Downloads: 3)

  • woaizhangwuji (2008-9-09 13:51:53)

    本来应该显示8051的,可是现在显示成这种奇怪结果了,怎么回事丫,我用一位的数码管试过了,是可以的,但是为什么四位的就不可以呢

    [ 本帖最后由 woaizhangwuji 于 2008-9-9 13:53 编辑 ]


    显示图像.jpg


    显示图像.jpg

  • hgjinwei (2008-9-09 15:50:20)

    没事的,这应该算是防真系统的一个漏洞,

    在送P2前加上 "  P1 = P1 | 0x0f; " 就行了

    [ 本帖最后由 hgjinwei 于 2008-9-9 16:03 编辑 ]


    未命名.JPG

    动态扫描.rar
    (2008-09-09 16:02:14, Size: 24.7 KB, Downloads: 4)

  • woaizhangwuji (2008-9-15 08:34:40)

    高手就是高手,我现在已经成功拉,谢谢啊
    你怎么知道的,我真么也想不到P1=P1|0X0F这回事啊
  • hgjinwei (2008-9-16 07:58:13)

    习惯问题.
    刚开始使用51时,我习惯在操作IO前先将其关闭,所以一直都没问题. 而一次偶然机会忘了这一步, 才发现这个漏洞.
    不过这样做也可以使不该亮的地方彻底不亮(没有使用这一步的会使得每一笔段都会有一点点亮, 你仔细对比着看应该可以看的到)
  • woaizhangwuji (2008-10-01 10:53:05)

    你的意思我知道,51一(复位)上电后所有I/O口为1,对不对呀,但是这个“1”驱动电流不大,所以就造成你所说的,每个接上去的数码管笔段有“一点点亮”,对吧?
    不过我没有看过实物上电后的样子,只用过PROTEUS,所以我现在只是凭理论想到的,不知道我所说的对不对呀
  • hgjinwei (2008-10-02 10:18:31)

    很遗憾地告诉你,不是这样的."1"绝对不会点亮LED(除非IO脚烧了).而且这与上电没什么关系.
    你想象一下,当第一位数码管(以后简称A)没有被关闭,就送第二位数码管(以后简称B)的数据,那么此时A就会显示B的数据,即使你随后很快就关闭A而打开B,但A始终有一小段时间是不正常点亮的(不是点亮对应位),而通常各位数码管显示的内容是不一致的,所以就造成每一个笔段都会有"一点点亮"(如果你将系统时间设置得足够低,你会发现转换显示的交换时间段的显示切换过程:A显示A的内容,B不显示-->A显示B的内容,B不显示(时间很短,但确实存在)-->A不显示,B显示B的内容),

    PS: 我也不清楚自个说了什么