簡單的定時器實現按鍵消抖,還望大家多指點!

/********************************
	按獨立按鍵使數碼管加1
********************************/
 #include <reg52.h>

 #define uchar unsigned char
 
 sbit KEY = P1 ^ 0;											 //定義獨立按鍵
 bit KEYSTA = 1;											 //按鍵的初始狀態
 uchar code DispCode[] = {0xc0,0xf9,0xa4,0xb0,				 //共陽數碼管
                          0x99,0x92,0x82,0xf8,
                          0x80,0x90,0x88,0x83,
                          0xc6,0xa1,0x86,0x8e};
void Timer0Init();											//定時器初始化函數
void KeyProcess();											//按鍵處理函數

void main()
{
	Timer0Init();
	KeyProcess();
}

void Timer0Init()
{
	TMOD |= 0x01;
	TH0 = 0xF8;			  //定時2MS
	TL0 = 0xCD;
	EA =1;
	ET0 = 1;
	TR0 = 1;
}
void KeyProcess()
{
	bit lasttime = 1;						 //定義前一次按鍵值,初始化爲1;
	uchar count = 0;						 //計數值初始化爲0;
	KEY = 0x01;								 //按鍵初始化;
	P0 =  DispCode[count];					 //數碼管初始化;
	while(1)
	{
		if (KEYSTA != lasttime)				 //如果“當前按鍵狀態”與“前一次按鍵狀態”不同,說明按鍵有動作;
		{
			if (lasttime == 1)				 //如果按鍵有動作了,那麼前一次按鍵狀態爲“彈起”(lasttime == 1),說明按鍵按下時,會響應動作;
			{
				count++;
				if (count >= 16)			 //計數加到16清零,只用一個共陽數碼管;
				{
					count = 0;
				}
				P0 =  DispCode[count];		 //共陽數碼管顯示相應的值;
			}
			lasttime = KEYSTA;				 //如果按鍵有動作,就更新前一次按鍵的值;
		}
	}
}

void Timer0IRQ() interrupt 1				//2MS中斷一次
{
	static keybuf = 0xFF;					//定義一個靜態按鍵緩存變量,且值爲FF;主要是暫存按鍵狀態;
	TH0 = 0xF8;			                    //重新寫入初值;
	TL0 = 0xCD;
	
	keybuf = (keybuf << 1) | KEY;		    //左移一位,使當前的按鍵狀態移到按鍵緩存中;
	if (keybuf == 0)						//如果移8次,按鍵狀態都爲0,說明按鍵真正按下;
	{
		KEYSTA = 0;						    //確定按鍵狀態爲按鍵;
	}
	else if (keybuf == 0xFF)				//如果移8次,按鍵狀態都爲1,說明按鍵未按下
	{
		KEYSTA = 1;
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章