动态扫描为什么显示乱码啊,求高手帮找找原因
字体: 小 中 大 | 打印 发表于: 2008-9-09 12:52 作者: woaizhangwuji 来源: proteus仿真社区
我用的是动态扫描。程序入下:(具体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)
(2008-09-09 12:54:20, Size: 110 KB, Downloads: 3)
woaizhangwuji (2008-9-09 13:51:53)
[ 本帖最后由 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
(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)
不过我没有看过实物上电后的样子,只用过PROTEUS,所以我现在只是凭理论想到的,不知道我所说的对不对呀
hgjinwei (2008-10-02 10:18:31)
你想象一下,当第一位数码管(以后简称A)没有被关闭,就送第二位数码管(以后简称B)的数据,那么此时A就会显示B的数据,即使你随后很快就关闭A而打开B,但A始终有一小段时间是不正常点亮的(不是点亮对应位),而通常各位数码管显示的内容是不一致的,所以就造成每一个笔段都会有"一点点亮"(如果你将系统时间设置得足够低,你会发现转换显示的交换时间段的显示切换过程:A显示A的内容,B不显示-->A显示B的内容,B不显示(时间很短,但确实存在)-->A不显示,B显示B的内容),
PS: 我也不清楚自个说了什么