?? 按鍵處理 處理一鍵多能.c
字號:
/*[原創]按鍵處理 處理一鍵多能
受到21IC程序匠人的《多種擊鍵類型的處理流程圖》啟發,自己重新整理,編寫了這幾個按鍵處理程序,經過AT89S51和4*4鍵盤的配合測試,發現效果良好,達到了較好的實時性。
這里只給出簡單單擊處理源程序*/
//一般短按鍵處理程序
//占用定時器0,閃爍時間10ms
//有效仿抖,時時性較高只能處理單擊按鍵,目前和4*4鍵盤掃描程序一起使用
//------------------------------------
// 單擊鍵盤控制程序
// 作者:張子墨
// 最后更新時間:2006/11/21
// 當前版本:0.90
// 測試MCU:AT89S51
//------------------------------------
#include <at89s53.h>
#include "4_4KeyScan.c" //配套鍵盤掃描程序,獲得鍵碼
#include "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; //按鍵禁止響應
bit Key_Scan_F = 0; //按鍵檢測使能,中斷每10MS置有效
//-----------------------------
//
//測試程序用的全局變量,對于主功能沒有影響
//
//-----------------------------
unsigned char i = 0;
//-----------------------------
//
// 定時器0初始化函數
//
//-----------------------------
void Timer0Init (void)
{
TMOD |= 0x01; //定時器0工作模式1
IE |= 0x82; //EA = 1;ET0 = 1;
TH0 = TIMER0VALUE_H;
TL0 = TIMER0VALUE_L;
TR0 = 1;
}
//-----------------------------
//
// 定時器0中斷服務函數
//
//-----------------------------
void Timer0SRV (void) interrupt 1 using 2
{
TH0 = TIMER0VALUE_H; //重裝初值
TL0 = TIMER0VALUE_L;
TR0 = 1;
Key_Scan_F = 1; //允許掃描鍵盤
}
//-----------------------------
//
// 臨時測試按鍵效果函數,實際應用修改為散轉函數
//
//-----------------------------
void ShortKeyAction (void)
{
Font[i++] = Key_Num;
SentAData(Key_Num);
if(i>32)
{
i = 0;
SentAIns (0x01);
SentAIns (0x80);
}
}
//-----------------------------
//
// 按鍵掃描控制函數
//
//-----------------------------
void KeyDeal (void)
{
Key_Scan_F = 0; //表示10ms周期內掃描完成,等待新的周期
Key_Num = KeyCodeConvert (GetKeyCode()); //獲得最新鍵盤編碼 根據實際情況,使用不同的掃描程序
if((Key_Num!=0x00)&&(Key_Num == Key_Backup)) //如果有按鍵并且與上次相同
{
if(!Key_Dis_F) //如果當前按鍵沒有操作
{
ShortKeyAction(); //進入處理散轉
Key_Dis_F = 1; //表示按鍵處理完成
}
}
else //否則沒有按鍵或者按鍵變化
{
Key_Backup = Key_Num; //重新記錄按鍵碼
Key_Dis_F = 0; //按鍵標志沒有處理
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -