按鍵處理 處理一鍵多能
發(fā)布時間:2008年1月5日 2時22分 編寫了這幾個按鍵處理程序,經(jīng)過AT89S51和4*4鍵盤的配合測試,發(fā)現(xiàn)效果良好,達(dá)到了較好的實時性。
這里只給出簡單單擊處理源程序 //一般短按鍵處理程序 //占用定時器0,閃爍時間10ms //有效仿抖,時時性較高只能處理單擊按鍵,目前和4*4鍵盤掃描程序一起使用 //------------------------------------ // 單擊鍵盤控制程序 // 作者:張子墨 // 最后更新時間:2006/11/21 // 當(dāng)前版本:0.90 // 測試MCU:AT89S51 //------------------------------------ #i nclude <at89s53.h> #i nclude "4_4KeyScan.c" //配套鍵盤掃描程序,獲得鍵碼 #i nclude "12864_Driver.c" //臨時顯示效果使用 #define TIMER0VALUE_H 0xDC //定時器0高位 #define TIMER0VALUE_L 0x00 //定時器0低位 //11.0592晶振定時10ms unsigned char Key_Num = 0x00; //本次鍵碼 unsigned char Key_Backup = 0x00; //備份鍵碼 bit Key_Dis_F = 0; //按鍵禁止響應(yīng) bit Key_Scan_F = 0; //按鍵檢測使能,中斷每10MS置有效 //----------------------------- // //測試程序用的全局變量,對于主功能沒有影響 // //----------------------------- unsigned char i = 0; //----------------------------- // // 定時器0初始化函數(shù) // //----------------------------- void Timer0Init (void) { TMOD |= 0x01; //定時器0工作模式1 IE |= 0x82; //EA = 1;ET0 = 1; TH0 = TIMER0VALUE_H; TL0 = TIMER0VALUE_L; TR0 = 1; } //----------------------------- // // 定時器0中斷服務(wù)函數(shù) // //----------------------------- void Timer0SRV (void) interrupt 1 using 2 { TH0 = TIMER0VALUE_H; //重裝初值 TL0 = TIMER0VALUE_L; TR0 = 1; Key_Scan_F = 1; //允許掃描鍵盤 } //----------------------------- // // 臨時測試按鍵效果函數(shù),實際應(yīng)用修改為散轉(zhuǎn)函數(shù) // //----------------------------- void ShortKeyAction (void) { Font[i++] = Key_Num; SentAData(Key_Num); if(i>32) { i = 0; SentAIns (0x01); SentAIns (0x80); } } //----------------------------- // // 按鍵掃描控制函數(shù) // //----------------------------- void KeyDeal (void) { Key_Scan_F = 0; //表示10ms周期內(nèi)掃描完成,等待新的周期 Key_Num = KeyCodeConvert (GetKeyCode()); //獲得最新鍵盤編碼 根據(jù)實際情況,使用不同的掃描程序 if((Key_Num!=0x00)&&(Key_Num == Key_Backup)) //如果有按鍵并且與上次相同 { if(!Key_Dis_F) //如果當(dāng)前按鍵沒有操作 { ShortKeyAction(); //進入處理散轉(zhuǎn) Key_Dis_F = 1; //表示按鍵處理完成 } } else //否則沒有按鍵或者按鍵變化 { Key_Backup = Key_Num; //重新記錄按鍵碼 Key_Dis_F = 0; //按鍵標(biāo)志沒有處理 } }
|