數碼管顯示計數

#include <reg52.h>

/*38譯碼器,使動態數碼管全亮*/
unsigned char vector_38[8] = {0x00, 0x20, 0x40, 0x60, 0x80, 0xA0, 0xC0, 0xE0}; 
unsigned char led_display[16] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};	// 數碼管段選
unsigned char led_buffer[10] = {0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00};	// 數碼管顯示數字緩存,能夠在Main裏任意讀


void Delay(float sec)
{
	/*S:秒,最小支持輸入0.02S*/
	unsigned int base;
	unsigned int conter;
	TH0 = 0xFC;
	TL0 = 0x67;

	base = 1;		//基本是1ms ,TH溢出
	conter = sec * 1000 / base;
	
	while(conter)
	{
		if 	(TF0 == 1)
		{
			conter--;
			TH0 = 0xB8;
			TL0 = 0x00;
		}
	}	
}



void main()
{
	unsigned int l;		//控制數碼管列表地址
	unsigned int sec_1;     //控制循環1S的次數
	unsigned int show_sec_l4;			//顯示總秒數低四位9999
	unsigned int show_sec_h4;			//存儲總秒數高四位,低到10000向高進位

	TR0 = 1;
	TMOD = 1;
	P1 = 0x00;		//默認低電平數碼管不顯示。初始都不顯示
	l = 0;
	sec_1 = 0;
	show_sec_l4 = 0;
	show_sec_h4	= 0;

	while(1)
	{
		P1 = led_buffer[l];
		Delay(0.1);
		/*控制數碼管全亮*/
		if (l > 7) {l = 0;}	
		P2 &= 0x1F;				//清空P2口的5。6。7管腳,不影響其它管腳
		P2 |= vector_38[l];		        //給5。6。7管腳賦值,不影響其它管腳
		if (sec_1 >= 100)
		{
			sec_1 = 0;
			show_sec_l4++;
			if (show_sec_l4 >= 9999)
			{
				show_sec_l4 = 0;
				show_sec_h4++;	
			}
			/*若是把led_fuffer順序倒過來,數碼管數字變更會變慢*/
			led_buffer[7] = led_display[show_sec_l4%10];
			led_buffer[6] = led_display[show_sec_l4/10%10];
			led_buffer[5] = led_display[show_sec_l4/100%10];
			led_buffer[4] = led_display[show_sec_l4/1000%10];
			led_buffer[3] = led_display[show_sec_h4%10];
			led_buffer[2] = led_display[show_sec_h4/10%10];
			led_buffer[1] = led_display[show_sec_h4/100%10];
			led_buffer[0] = led_display[show_sec_h4/1000%10];

		}
		sec_1++;
		l++;
		P1 = 0x00;            //清除鬼影
	}	

}
相關文章
相關標籤/搜索