在微控制器系統中應用按鍵的時候,如果只需要按下一次按鍵加 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毫秒 濾波 引腳還是被拉低 確定按鍵被按下 設定按鍵按下標誌 開啟定時器,開始計數 定時器中有乙個全域性變數用於記錄計數值 直到引腳被拉高 按鍵被釋放將為高電平 關閉定時器 檢測按鍵按下標...