擒揭 发表于 2025-6-9 13:33:44

数码管动态显示

动态显示的基本原理

多个数码管显示数字的时候,实际上是轮流点亮数码管(一个时刻内只有一个数码管是亮的)利用人眼的视觉暂留现象(也叫余晖效应)就可以做到看起来是所有数码管都同时亮了,这就是动态显示,也叫作动态扫描
例如:有两个数码管,要显示“12”这个数字,先让高位的位选三极管导通,然后控制段选让其显示“1”,延时一定时间后再让低位的位选三极管导通,然后控制端选让其显示“2”把这个流程以一定的速度循环运行就可以让数码管显示出“12”由于交替速度非常快,人眼识别到的就是“12”这两位数字同时亮了。
6个数码管组合正计时[从0到999999再从0开始]

#include <reg52.h>

unsigned char code LedChar[] =
{
        0xC0, 0xF9, 0xA4, 0xB0, 0x99,
        0x92, 0x82, 0xF8, 0x80, 0x90
};

unsigned char code LedIndex[] =
{
        0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED
};

void main(void)
{
        unsigned int cnt = 0;//设置循环次数为0
        unsigned int sec = 0;//经过时间,单位为s
        int i = 0;//数码管序号
        int iP0 = 0, iP1 = 0, iP2 = 0, iP3 = 0, iP4 = 0, iP5 = 0;

        TMOD = 1;//设置定时器0为模式1
       
        TH0 = 0xF7;       
        TL0 = 0x00;//设置定时器0的初始值为0xF700,溢出一次0.0025s

        TR0 = 1;//启动定时器0
        P1 = LedIndex;
        P0 = LedChar;

        while (1)
        {
                if (1 == TF0)//溢出
                {
                        TH0 = 0xF7;
                        TL0 = 0x00;
                        TF0 = 0;//初始化定时器0

                        cnt++;//循环次数+1

                        if (400 == cnt)//1s       
                        {
                                sec++;
                                cnt = 0;
                                if (1000000 == sec)
                                        sec = 0;
                               
                                iP0 =sec % 10;
                                iP1 =sec / 10 % 10;
                                iP2 =sec / 100 % 10;
                                iP3 =sec / 1000 % 10;
                                iP4 =sec / 10000 % 10;
                                iP5 =sec / 100000 % 10;
                        }

                        switch (i)
                        {
                        case 0:
                                if (sec >= 0)
                                {
                                        P1 = LedIndex;
                                        P0 = LedChar;
                                }
                                i++;
                                break;
                        case 1:
                                if (sec > 9)
                                {
                                        P1 = LedIndex;
                                        P0 = LedChar;
                                }
                                i++;
                                break;
                        case 2:
                                if (sec > 99)
                                {
                                        P1 = LedIndex;
                                        P0 = LedChar;
                                }
                                i++;
                                break;
                        case 3:
                                if (sec > 999)
                                {
                                        P1 = LedIndex;
                                        P0 = LedChar;
                                }
                                i++;
                                break;
                        case 4:
                                if (sec > 9999)
                                {
                                        P1 = LedIndex;
                                        P0 = LedChar;
                                }
                                i++;
                                break;
                        case 5:
                                if (sec > 99999)
                                {
                                        P1 = LedIndex;
                                        P0 = LedChar;
                                }
                                i = 0;
                                break;
                        }
                }

               
        }
}
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 数码管动态显示