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