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

2021-09-11 05:43:49 字數 3240 閱讀 2083

在微控制器系統中應用按鍵的時候,如果只需要按下一次按鍵加 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] = , , ,

};bit enbuzz = 0; //蜂鳴器使能標誌

bit flag1s = 0; //1 秒定時標誌

bit flagstart = 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 1else

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