#include
sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;
unsigned char code LedChar[] = {
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
void main()
{
unsigned char i = 0;
unsigned long l = 0;
ENLED = 0;
ADDR3 = 1;
while (1)
{
l = 129016;
switch (i)
{
case 0: P0 = LedChar[l % 10]; ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; i++;
case 1: P0 = LedChar[l / 10 % 10]; ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; i++;
case 2: P0 = LedChar[l / 100 % 10]; ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; i++;
case 3: P0 = LedChar[l / 1000 % 10]; ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; i++;
case 4: P0 = LedChar[l / 10000 % 10]; ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; i++;
default: P0 = LedChar[l / 100000 % 10]; ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; i = 0;
}
}
}
为什么采用上方代码,不需要delay函数也可以消影。
上述代码采用了一种技术,叫做“多位数码管消影”,它可以让数码管的显示更加连续,不会出现残影。它的原理是:通过改变地址线的状态,把数码管的残影时间拉长,从而达到消影的效果。在上述代码中,通过改变ADDR0-3的状态,把数码管的残影时间拉长,从而达到消影的效果,而不需要使用delay函数。
不知道你这个问题是否已经解决, 如果还没有解决的话:不过,大家注意到了吗:用上面的代码,如果想显示任意给定的数字,那么似乎有些麻烦,下面我们介绍一种通用方法:
如果给定了一个数字(假设是两位数),那么,我们可以直接把它的每一位(比如个位、十位、、、)分离出来,然后在一个while(1) 大循环里面显示了十位、延迟一小段时间,又去显示个位,再延迟一段时间。在这样的无限循环中,我们肉眼看到的就是“静止”的两位数了。
注意:如果想显示的是三位数,那么uchar类型就不再适用了,因为 uchar最大就是256,需要使用int