数码管动态显示
动态显示的基本原理
多个数码管显示数字的时候,实际上是轮流点亮数码管(一个时刻内只有一个数码管是亮的)利用人眼的视觉暂留现象(也叫余晖效应)就可以做到看起来是所有数码管都同时亮了,这就是动态显示,也叫作动态扫描
例如:有两个数码管,要显示“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[0];
P0 = LedChar[sec];
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[i];
P0 = LedChar[iP0];
}
i++;
break;
case 1:
if (sec > 9)
{
P1 = LedIndex[i];
P0 = LedChar[iP1];
}
i++;
break;
case 2:
if (sec > 99)
{
P1 = LedIndex[i];
P0 = LedChar[iP2];
}
i++;
break;
case 3:
if (sec > 999)
{
P1 = LedIndex[i];
P0 = LedChar[iP3];
}
i++;
break;
case 4:
if (sec > 9999)
{
P1 = LedIndex[i];
P0 = LedChar[iP4];
}
i++;
break;
case 5:
if (sec > 99999)
{
P1 = LedIndex[i];
P0 = LedChar[iP5];
}
i = 0;
break;
}
}
}
}
本文来自博客园,作者:EricsT,转载请注明原文链接:https://www.cnblogs.com/EricsT/p/18498578