標(biāo)題: 單片機(jī)定時(shí)器中斷按鍵掃描程序如何檢測長按狀態(tài)? [打印本頁]
作者: PDDDF 時(shí)間: 2019-12-24 16:50
標(biāo)題: 單片機(jī)定時(shí)器中斷按鍵掃描程序如何檢測長按狀態(tài)?
unsignedchar Trg;
unsignedchar Cont;
voidKeyRead( void )
{
unsigned char ReadData = PINB^0xff; // 1
Trg = ReadData & (ReadData ^ Cont); // 2
Cont =ReadData; // 3
}
網(wǎng)上流傳很廣的3句語句實(shí)現(xiàn)按鍵掃描,自己用卻不會(huì)用,只能做到檢測單擊按鍵,長按和雙擊檢測不會(huì)做,求大佬指點(diǎn)
作者: PDDDF 時(shí)間: 2019-12-24 17:24
void key_scan()
{
uchar S,b;
S = P1^0xff;
if(0<S && S == R)
{
b = T;
T = S&(S^R);
R = S;
if(b != T)
{
if(S == 0x20) {key = 1; return;}
if(S == 0x10) {key = 2; return;}
if(S == 0x08) {key = 3; return;}
if(S == 0x18) {key = 8; return;}
}
else
{
if(S == 0x20) {key = 4; return;}
if(S == 0x10) {key = 5; return;}
if(S == 0x08) {key = 6; return;}
if(S == 0x18) {key = 9; return;}
}
}
else
{
T = S&(S^R);
R = S;
}
}
1238為對應(yīng)按鍵的單擊標(biāo)識(shí),4569為對應(yīng)按鍵的長按標(biāo)識(shí),共4個(gè)按鍵, key_scan()放在中斷函數(shù)里面,20MS掃描一次
while(1)
{
switch (key)
{
case......
}
}循環(huán)執(zhí)行返回按鍵標(biāo)識(shí)的對應(yīng)程序
問題:無法辨別是單擊或是長按,按了幾下后卡死
作者: wulin 時(shí)間: 2019-12-24 23:17
不是簡單的3條代碼就搞定的,這只是讀鍵過程,還要有其配套服務(wù)程序解讀才能生效。
應(yīng)用示例:
作者: PDDDF 時(shí)間: 2019-12-25 08:58
我最搞不懂的就是這個(gè)按鍵掃描是怎樣做到消抖的,掃描我是放在中斷里面執(zhí)行的,一旦有觸發(fā)信號(假設(shè)0x01),read Trg Con的值都為0x01,下一個(gè)中斷到來時(shí)如果是真的按下(read繼續(xù)讀到0x01)那經(jīng)過這個(gè)按鍵掃描算法的處理就變?yōu)閞ead 0x01 Trg 0x00 Con 0x01 ,那判斷兩次讀取的值一樣才算消抖啊,但是這樣就判斷不了長按了,因?yàn)橐恢遍L按 R T C 的值都沒變的,還是read 0x01 Trg 0x00 Con 0x01 ,這樣我就搞不懂了
作者: wulin 時(shí)間: 2019-12-25 10:38
這是原作者的解釋,是在特定的程序構(gòu)架下才有效。
一款精巧的按鍵處理程序.doc
(36.5 KB, 下載次數(shù): 51)
2019-12-25 10:35 上傳
點(diǎn)擊文件名下載附件
作者: PDDDF 時(shí)間: 2019-12-25 11:50
謝謝大佬
作者: 還有誰? 時(shí)間: 2019-12-25 13:39
其實(shí)思路很簡單,在定時(shí)中斷中判斷一個(gè)按健按下來開始計(jì)數(shù),然后這樣:if((K1<40) && (K1>5) && (ON_flag==1))//消抖時(shí)間+去抖時(shí)間+開關(guān)標(biāo)記,后面處理好清0事宜就好了
作者: 1394077003 時(shí)間: 2019-12-25 18:37
太好了 又學(xué)到了新知識(shí) 好評
作者: ahshmj 時(shí)間: 2019-12-25 18:54
和處理鍵抖動(dòng)一回事,N次檢測仍未釋放就是長按......,N次加或減1,2N次加減2......,快速雙擊道理一樣,檢測的時(shí)間間隔不同。
| 歡迎光臨 (http://m.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |