數碼管動態顯示

EricsT發表於2024-11-06

動態顯示的基本原理

多個數碼管顯示數字的時候,實際上是輪流點亮數碼管(一個時刻內只有一個數碼管是亮的)利用人眼的視覺暫留現象(也叫餘暉效應)就可以做到看起來是所有數碼管都同時亮了,這就是動態顯示,也叫作動態掃描

例如:有兩個數碼管,要顯示“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;
			}
		}

		
	}
}

相關文章