標籤:c51單片機
/********************************按獨立按鍵使數位管加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; //定時2MSTL0 = 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;}}
本文出自 “陽子” 部落格,請務必保留此出處http://9832751.blog.51cto.com/9822751/1834589
簡單的定時器實現按鍵消抖,還望大家多指點!