数码管动态显示

动态显示的基本原理

多个数码管显示数字的时候,实际上是轮流点亮数码管(一个时刻内只有一个数码管是亮的)利用人眼的视觉暂留现象(也叫余晖效应)就可以做到看起来是所有数码管都同时亮了,这就是动态显示,也叫作动态扫描

例如:有两个数码管,要显示“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;
			}
		}

		
	}
}