在微控制器系統中應用按鍵的時候,如果只需要按下一次按鍵加 1 或減 1,那用第 8 章學到的知識就可以完成了,但如果想連續加很多數字的時候,要一次次按下這個按鍵確實有點不方便,這時我們會希望一直按住按鍵,數字就自動持續增加或減小,這就是所謂的長短按鍵應用。
當檢測到乙個按鍵產生按下動作後,馬上執行一次相應的操作,同時在程式裡記錄按鍵按下的持續時間,該時間超過 1 秒後(主要是為了區別短按和長按這兩個動作,因短按的時間通常都達到幾百 ms),每隔 200ms(如果你需要更快那就用更短的時間,反之亦然)就自動再執行一次該按鍵對應的操作,這就是乙個典型的長按鍵效果。
對此,我們做了乙個模擬定時炸彈效果的例項,提供給大家作為參考。開啟開關後,數碼管顯示數字 0,按向上的按鍵數字加 1,按向下的按鍵數字減 1,長按向上按鍵 1 秒後,數字會持續增加,長按向下按鍵 1 秒後,數字會持續減小。設定好數字後,按下回車按鍵,時間就會進行倒計時,當倒計時到 0 的時候,用蜂鳴器和板子上的 8 個 led 小燈做炸彈效果,蜂鳴器持續響,led 小燈全亮。
#includesbit
buzz = p1^6;
sbit
addr3 = p1^3;
sbit
enled = p1^4;
sbit
key_in_1 = p2^4;
sbit
key_in_2 = p2^5;
sbit
key_in_3 = p2^6;
sbit
key_in_4 = p2^7;
sbit
key_out_1 = p2^3;
sbit
key_out_2 = p2^2;
sbit
key_out_3 = p2^1;
sbit
key_out_4 = p2^0;
unsigned
char
code
ledchar=;
unsigned
char ledbuff[7]
=;unsigned
char
code
keycodemap[4][
4]=,
//數字鍵 1、數字鍵 2、數字鍵 3、向上鍵
,//數字鍵 4、數字鍵 5、數字鍵 6、向左鍵
,//數字鍵 7、數字鍵 8、數字鍵 9、向下鍵
//數字鍵 0、esc 鍵、 回車鍵、 向右鍵};
unsigned
char keysta[4][
4]=,
,,};
unsigned
long
pdata
keydowntime[4][
4]=,
,,};
bitenbuzz =0;
//蜂鳴器使能標誌
bitflag1s =0;
//1 秒定時標誌
bitflagstart =0;
//倒計時啟動標誌
unsigned
char t0rh =0;
//t0 過載值的高位元組
unsigned
char t0rl =0;
//t0 過載值的低位元組
unsigned
int countdown =0;
//倒計時計數器
void
configtimer0
(unsigned
int ms);
void
shownumber
(unsigned
long num);
void
keydriver
();void
main()}
}}}/* 配置並啟動 t0,ms-t0 定時時間 */
void
configtimer0
(unsigned
int ms)
/* 將乙個無符號長整型的數字顯示到數碼管上,num-待顯示數字 */
void
shownumber
(unsigned
long num)
for(i=
5; i>=
1; i--)
else
}for
(; i>=
0; i--)
}/* 按鍵動作函式,根據鍵碼執行相應的操作,keycode-按鍵鍵碼 */
void
keyaction
(unsigned
char keycode)
}else
if(keycode ==
0x28)}
else
if(keycode ==
0x0d
)else
if(keycode ==
0x1b)}
/* 按鍵驅動函式,檢測按鍵動作,排程相應動作函式,需在主迴圈中呼叫 */
void
keydriver(),
,,};
static
unsigned
long
pdata
timethr[4][
4]=,
,,};
for(i=
0; i<
4; i++)
}backup[i][j]
= keysta[i][j];
if(keydowntime[i][j]
>0)
}else}}
}/* 按鍵掃瞄函式,需在定時中斷中呼叫 */
void
keyscan(),
,,};
//將一行的 4 個按鍵值移入緩衝區
keybuf[keyout][0]
=(keybuf[keyout][0]
<<1)
| key_in_1;
keybuf[keyout][1]
=(keybuf[keyout][1]
<<1)
| key_in_2;
keybuf[keyout][2]
=(keybuf[keyout][2]
<<1)
| key_in_3;
keybuf[keyout][3]
=(keybuf[keyout][3]
<<1)
| key_in_4;
//消抖後更新按鍵狀態
for(i=
0; i<
4; i++)
else
if((keybuf[keyout][i]
&0x0f)==
0x0f)}
keydowntime[keyout][i]=0
;//按下的持續時間清零
//執行下一次的掃瞄輸出
keyout++;
//輸出索引遞增
keyout &=
0x03
;//索引值加到 4 即歸零
switch
(keyout)
}/* led 動態掃瞄重新整理函式,需在定時中斷中呼叫 */
void
ledscan
()else
}/* t0 中斷服務函式,完成數碼管、按鍵掃瞄與秒定時 */
void
interrupttimer0
() interrupt 1
else
ledscan
();//led 掃瞄顯示
keyscan
();//按鍵掃瞄
if(flagstart)
}else
}
長按鍵功能實現的重點有兩個:第一,是在原來的矩陣按鍵掃瞄函式 keyscan 內,當檢測到按鍵按下後,持續的對乙個時間變數進行累加,其目的是用這個時間變數來記錄按鍵按下的時間;第二,是在按鍵驅動函式 keydriver 裡,除了原來的檢測到按鍵按下這個動作時執行按鍵動作函式 keyaction 外,還監測表示按鍵按下時間的變數,根據它的值來完成長按時的連續快速按鍵動作功能。
10 5 微控制器長短按鍵的應用
在微控制器系統中應用按鍵的時候,如果只需要按下一次按鍵加 1 或減 1,那用第 8 章學到的知識就可以完成了,但如果想連續加很多數字的時候,要一次次按下這個按鍵確實有點不方便,這時我們會希望一直按住按鍵,數字就自動持續增加或減小,這就是所謂的長短按鍵應用。當檢測到乙個按鍵產生按下動作後,馬上執行一次...
微控制器按鍵長短按得識別原理
stm32f103 按鍵長短按得識別原理 需要乙個定時器,用來計算按鍵按下的時間,可以一秒鐘檢測100次,設定初始化為10ms的中斷,比如使用定時4作為按鍵時間計算的定時器 比如我們需要4種模式,輕觸,短按,長按,超級長按 define clicktypetouch 1 輕觸 define clic...
微控制器 按鍵定時器檢測 短按 長按
通過使用定時器計數的方法來分辨按鍵的 短按 長按 檢測到引腳被拉低 按鍵按下為低電平,沒有按下為高電平 延時10毫秒 濾波 引腳還是被拉低 確定按鍵被按下 設定按鍵按下標誌 開啟定時器,開始計數 定時器中有乙個全域性變數用於記錄計數值 直到引腳被拉高 按鍵被釋放將為高電平 關閉定時器 檢測按鍵按下標...