|
原理:將按鍵這一事件的過程劃分成如下幾個狀態(tài):
//stata 函數(shù)運(yùn)行狀態(tài)
//0: 初始狀態(tài)
//1: 第一洗按鍵按下
//2: 第一次長按抬起
//3: 第一次短按抬起
//4: 第二次按鍵按下
//5: 第二次按鍵抬起
利用定時器記錄系統(tǒng)運(yùn)行時間,根據(jù)系統(tǒng)運(yùn)行時間來確定按鍵時間間隔,根據(jù)不同的時間間隔來判斷當(dāng)前按鍵事件處于哪一過程以及是否結(jié)束該事件。
主函數(shù)中應(yīng)循環(huán)調(diào)用按鍵檢測函數(shù),調(diào)用間隔不超過100ms,此函數(shù)不會阻塞程序運(yùn)行。
版本說明:
............................................................
版本號Beta0.0
本驅(qū)動工具包主要包含以下驅(qū)動(xxx.c文件和xxx.h文件共同使用,下面不再寫后綴)
1“define.h”----包含了類型定義與開發(fā)板屬性的設(shè)置(如晶振頻率等)
2“delay”----定義了兩個延時函數(shù),支持STC大多數(shù)芯片(除15H系列..)
【提示】本函數(shù)庫中驅(qū)動多數(shù)依賴于"delay.c""delay.h"和"define.h"文件
3“digital_display”----數(shù)碼管顯示驅(qū)動(硬件是基于兩個373鎖存器分別用作段數(shù)據(jù)和位數(shù)據(jù))
4“digital_to_string”----包含了浮點(diǎn)數(shù)轉(zhuǎn)換成字符串的函數(shù)
5“DS18B20”----溫度傳感器驅(qū)動
6“DS1302”----時鐘芯片驅(qū)動
7“I2C”----軟件模擬I2C總線驅(qū)動
8“Keyboard”----矩陣鍵盤驅(qū)動
9“LCD_1602_display”----1602液晶屏驅(qū)動(并口)
10“LCD_12864_display”----12864液晶屏驅(qū)動(并口帶中文字庫)(只是顯示文字,不包含畫圖)
11“NEC_IR_coding”----用一個紅外LED實(shí)現(xiàn)紅外編碼發(fā)射的驅(qū)動
12“NEC_IR_decoding”----紅外解碼驅(qū)動
13“NRF24L01”----2.4G無線通訊模塊驅(qū)動
14“Uart”----串口驅(qū)動相關(guān)函數(shù)
未完待續(xù)...
............................................................
............................................................
版本號Beta0.1
修復(fù)了數(shù)碼管有關(guān)殘影的bug
取消了矩陣鍵盤的松手檢測,檢測不到鍵按下時返回0代替
未完待續(xù)...
............................................................
............................................................
版本號Beta0.2
加入了獨(dú)立按鍵的檢測,兼容矩陣按鍵,修復(fù)了矩陣鍵盤關(guān)于不同開發(fā)板兼容性的bug
增加了串口不同波特率的初始化程序
未完待續(xù)...
............................................................
............................................................
版本號Beta0.3
調(diào)整了數(shù)碼管顯示驅(qū)動的結(jié)構(gòu)代碼,方便不同開發(fā)板移植
調(diào)整了紅外解碼閾值,提高解碼效率
未完待續(xù)...
............................................................
............................................................
版本號Beta0.4
1602液晶驅(qū)動的代碼更改為區(qū)域刷新,字符串長度不夠顯示空格,避免出現(xiàn)顯示殘留
調(diào)整了若干驅(qū)動文件名字
修復(fù)了數(shù)字轉(zhuǎn)字符串函數(shù)在顯示0時有負(fù)號的bug
添加了QMC5883地磁場傳感器驅(qū)動
未完待續(xù)...
............................................................
核心代碼如下:
/*
按鍵檢測
返回值:0 無結(jié)果
1 短按
2 長按
3 雙擊
*/
u8 key_scan()
{
//stata 函數(shù)運(yùn)行狀態(tài)
//0: 初始狀態(tài)
//1: 第一洗按鍵按下
//2: 第一次長按抬起
//3: 第一次短按抬起
//4: 第二次按鍵按下
//5: 第二次按鍵抬起
u8 res=0;
static u8 key_sta,stata=0;
static u32 time=0,time1=0,time2=0;
if(key==0) //按下消抖
{
delay_10ms(1);
if(key==0)
key_sta=0;
else
return 0;
}
else //松開消抖
{
delay_10ms(1);
if(key==1)
key_sta=1;
else
return 0;
}
if(stata==0) //0: 初始狀態(tài)
{
if(key_sta==0)
{
stata=1;
time=system_time;
}
return 0;
}
else if(stata==1) //1: 第一洗按鍵按下
{
time1=system_time;
time2=time1-time;
if(time2>60)
{
stata=2;
}
else if(key_sta==1)
{
time=system_time;
stata=3;
}
return 0;
}
else if(stata==2) //2: 第一次長按抬起
{
if(key_sta==1)
{
stata=0;
return 2;
}
return 0;
}
else if(stata==3) //3: 第一次短按抬起
{
time1=system_time;
time2=time1-time;
if(time2>30)
{
stata=0;
return 1;
}
else if(key_sta==0)
{
stata=4;
}
return 0;
}
else if(stata==4) //4: 第二次按鍵按下
{
if(key_sta==1) //5: 第二次按鍵抬起
{
stata=0;
return 3;
}
return 0;
}
else
return 0;
}
void time0_irq() interrupt 1 using 1 //系統(tǒng)時間定時器 10ms+1
{
TL0 = 0x00; //設(shè)置定時初值
TH0 = 0xDC; //設(shè)置定時初值
system_time++;
}
說明:該工程使用了STC頭文件,請?jiān)赟TC-ISP軟件中將頭文件添加到Keil
全部資料51hei下載地址:
按鍵.rar
(63.3 KB, 下載次數(shù): 313)
2018-8-6 14:05 上傳
點(diǎn)擊文件名下載附件
|
評分
-
查看全部評分
|