10 5 微控制器長短按鍵的應用

2021-07-14 12:42:22 字數 3964 閱讀 5777

在微控制器系統中應用按鍵的時候,如果只需要按下一次按鍵加 1 或減 1,那用第 8 章學到的知識就可以完成了,但如果想連續加很多數字的時候,要一次次按下這個按鍵確實有點不方便,這時我們會希望一直按住按鍵,數字就自動持續增加或減小,這就是所謂的長短按鍵應用。

當檢測到乙個按鍵產生按下動作後,馬上執行一次相應的操作,同時在程式裡記錄按鍵按下的持續時間,該時間超過 1 秒後(主要是為了區別短按和長按這兩個動作,因短按的時間通常都達到幾百 ms),每隔 200ms(如果你需要更快那就用更短的時間,反之亦然)就自動再執行一次該按鍵對應的操作,這就是乙個典型的長按鍵效果。

對此,我們做了乙個模擬定時炸彈效果的例項,提供給大家作為參考。開啟開關後,數碼管顯示數字 0,按向上的按鍵數字加 1,按向下的按鍵數字減 1,長按向上按鍵 1 秒後,數字會持續增加,長按向下按鍵 1 秒後,數字會持續減小。設定好數字後,按下回車按鍵,時間就會進行倒計時,當倒計時到 0 的時候,用蜂鳴器和板子上的 8 個 led 小燈做炸彈效果,蜂鳴器持續響,led 小燈全亮。

#include

sbit

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毫秒 濾波 引腳還是被拉低 確定按鍵被按下 設定按鍵按下標誌 開啟定時器,開始計數 定時器中有乙個全域性變數用於記錄計數值 直到引腳被拉高 按鍵被釋放將為高電平 關閉定時器 檢測按鍵按下標...