不需要delay函数也可以消影


#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函数。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/1053881
  • 这篇博客你也可以参考下:蓝桥杯学习笔记三:Delay函数毫秒变微秒
  • 除此之外, 这篇博客: 【单片机技术】—— 数码管的动态显示方法与定时器中的 二、用delay()函数实现任意数字的显示 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    不过,大家注意到了吗:用上面的代码,如果想显示任意给定的数字,那么似乎有些麻烦,下面我们介绍一种通用方法:

    如果给定了一个数字(假设是两位数),那么,我们可以直接把它的每一位(比如个位、十位、、、)分离出来,然后在一个while(1) 大循环里面显示了十位、延迟一小段时间,又去显示个位,再延迟一段时间。在这样的无限循环中,我们肉眼看到的就是“静止”的两位数了。

    注意:如果想显示的是三位数,那么uchar类型就不再适用了,因为 uchar最大就是256,需要使用int


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^