1、先看一下按鍵抖動波形
采用鍋仔片式按鍵測量波形。 按鍵按下與抬起的部分都出現抖動,大致時間10ms左右。 為了防止按鍵誤按或者重復識別,必須要按鍵消抖處理。 按鍵消抖有軟件方法和硬件方法。
2、硬件方法:
一般增加對地濾波電容,利用電容兩端電壓不能突變的特性減少抖動雜波,使波形更加規整。
其它的復雜方法如RS觸發器電路一般用在沒有軟件的場合,這里就不做介紹了。
3、軟件方法:采用延時檢測的方法錯開抖動區域。
代碼實現1: 這種方法在主循環內輪詢按鍵狀態,查詢GPIO狀態,這種方法最簡單,也最常見,但是會增加主循環的負荷,按鍵按下時會阻塞主循環,降低主循環實時性。 當然主循環的阻塞是否有影響,根據自己情況判斷。
while(1)
{
if(KeyGpio == 0)
{
DelayMs(10); //延時10ms
if(KeyGpio == 0)
{
//按鍵處理代碼
}
}
//其它代碼
}
代碼實現2: 按鍵GPIO初始化為中斷方式,按鍵按下后產生外部中斷事件,進入中斷處理函數中,延時消抖,最終調用按鍵處理函數,或者設置標志位去主循環里調用按鍵處理函數。 這種在中斷中延時消抖的方法不少人使用,其性能還不如第一種方法,缺點很明顯,中斷中延時會導致低優先級中斷阻塞,也導致主循環阻塞,實時性更差。
void KeyGpio_IrqHandler(void)
{
if(KeyGpio == 0)
{
//延時10ms
DelayMs(10);
if(KeyGpio == 0)
{
//按鍵處理代碼
KeyFunction();
}
}
ClearIrqFlag();
}
代碼實現3: 按鍵GPIO初始化為中斷方式,按鍵按下后產生外部中斷事件,進入中斷處理函數中,不采用延時消抖,而是開啟了一個定時器,定時器設定為10ms后產生中斷,定時器中斷后再次檢測按鍵GPIO,如果仍然是按下狀態則調用按鍵處理函數。 中斷中只是開啟了定時器,并未阻塞,主循環也沒有阻塞,從性能上最優,但是這種方法用到了一個定時器,占用了處理器資源。
void KeyGpio_IrqHandler(void)
{
if(KeyGpio == 0)
{
//未開啟定時情況下進入,防止重復開啟定時器
if(isTimerStart() == 0)
{
// 設置定時器時間為10ms
InitTimer(10);
// 開啟定時器
StartTimer();
}
}
ClearKeyIrqFlag();
}
void Timer_IrqHandler(void)
{
StopTimer();
if(KeyGpio == 0)
{
//按鍵處理代碼
KeyFunction();
}
ClearTimerIrqFlag();
}
以上示例偽代碼采用10ms延時,使用時可根據實際情況調整。
-
軟件
+關注
關注
69文章
4770瀏覽量
87157 -
波形
+關注
關注
3文章
378瀏覽量
31506 -
觸發器
+關注
關注
14文章
1995瀏覽量
61051 -
GPIO
+關注
關注
16文章
1196瀏覽量
51915 -
按鍵消抖
+關注
關注
2文章
27瀏覽量
10442
發布評論請先 登錄
相關推薦
評論