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