1、先看一下按鍵抖動(dòng)波形
采用鍋?zhàn)衅桨存I測量波形。 按鍵按下與抬起的部分都出現(xiàn)抖動(dòng),大致時(shí)間10ms左右。 為了防止按鍵誤按或者重復(fù)識(shí)別,必須要按鍵消抖處理。 按鍵消抖有軟件方法和硬件方法。

2、硬件方法:
一般增加對(duì)地濾波電容,利用電容兩端電壓不能突變的特性減少抖動(dòng)雜波,使波形更加規(guī)整。

其它的復(fù)雜方法如RS觸發(fā)器電路一般用在沒有軟件的場合,這里就不做介紹了。
3、軟件方法:采用延時(shí)檢測的方法錯(cuò)開抖動(dòng)區(qū)域。
代碼實(shí)現(xiàn)1: 這種方法在主循環(huán)內(nèi)輪詢按鍵狀態(tài),查詢GPIO狀態(tài),這種方法最簡單,也最常見,但是會(huì)增加主循環(huán)的負(fù)荷,按鍵按下時(shí)會(huì)阻塞主循環(huán),降低主循環(huán)實(shí)時(shí)性。 當(dāng)然主循環(huán)的阻塞是否有影響,根據(jù)自己情況判斷。
while(1)
{
    if(KeyGpio == 0)
    {
        DelayMs(10);    //延時(shí)10ms
        if(KeyGpio == 0)
        {
            //按鍵處理代碼
        }
    }
    //其它代碼
}
代碼實(shí)現(xiàn)2: 按鍵GPIO初始化為中斷方式,按鍵按下后產(chǎn)生外部中斷事件,進(jìn)入中斷處理函數(shù)中,延時(shí)消抖,最終調(diào)用按鍵處理函數(shù),或者設(shè)置標(biāo)志位去主循環(huán)里調(diào)用按鍵處理函數(shù)。 這種在中斷中延時(shí)消抖的方法不少人使用,其性能還不如第一種方法,缺點(diǎn)很明顯,中斷中延時(shí)會(huì)導(dǎo)致低優(yōu)先級(jí)中斷阻塞,也導(dǎo)致主循環(huán)阻塞,實(shí)時(shí)性更差。
void KeyGpio_IrqHandler(void)
{
    if(KeyGpio == 0)
    {
        //延時(shí)10ms
        DelayMs(10);
        if(KeyGpio == 0)
        {
            //按鍵處理代碼
            KeyFunction(); 
        }
    }
    ClearIrqFlag();
}
代碼實(shí)現(xiàn)3: 按鍵GPIO初始化為中斷方式,按鍵按下后產(chǎn)生外部中斷事件,進(jìn)入中斷處理函數(shù)中,不采用延時(shí)消抖,而是開啟了一個(gè)定時(shí)器,定時(shí)器設(shè)定為10ms后產(chǎn)生中斷,定時(shí)器中斷后再次檢測按鍵GPIO,如果仍然是按下狀態(tài)則調(diào)用按鍵處理函數(shù)。 中斷中只是開啟了定時(shí)器,并未阻塞,主循環(huán)也沒有阻塞,從性能上最優(yōu),但是這種方法用到了一個(gè)定時(shí)器,占用了處理器資源。
void KeyGpio_IrqHandler(void)
{
    if(KeyGpio == 0)
    {
        //未開啟定時(shí)情況下進(jìn)入,防止重復(fù)開啟定時(shí)器
        if(isTimerStart() == 0)
        {
              // 設(shè)置定時(shí)器時(shí)間為10ms
            InitTimer(10);
            // 開啟定時(shí)器
            StartTimer();
        }
    }
    ClearKeyIrqFlag();
}
void Timer_IrqHandler(void)
{
    StopTimer();
    if(KeyGpio == 0)
    {
        //按鍵處理代碼
        KeyFunction(); 
    }
    ClearTimerIrqFlag();
}
以上示例偽代碼采用10ms延時(shí),使用時(shí)可根據(jù)實(shí)際情況調(diào)整。
- 
                                軟件
                                +關(guān)注關(guān)注 69文章 5262瀏覽量 90547
- 
                                波形
                                +關(guān)注關(guān)注 3文章 398瀏覽量 32843
- 
                                觸發(fā)器
                                +關(guān)注關(guān)注 14文章 2048瀏覽量 62913
- 
                                GPIO
                                +關(guān)注關(guān)注 16文章 1308瀏覽量 55508
- 
                                按鍵消抖
                                +關(guān)注關(guān)注 2文章 28瀏覽量 10780
發(fā)布評(píng)論請(qǐng)先 登錄
按鍵的硬件消抖電路原理詳解
 
    
按鍵硬件消抖原理
按鍵延時(shí)消抖的方法和目的分別是什么
基于FPGA的按鍵消抖電路設(shè)計(jì)
使用51單片機(jī)實(shí)現(xiàn)按鍵消抖的資料和程序免費(fèi)下載
 
    
【單片機(jī)】按鍵消抖及原理(硬件和軟件方法詳解)
 
    
 
           
        
 
         按鍵消抖的軟件和硬件方法
按鍵消抖的軟件和硬件方法 
                 
  
     
            
             
             
                 
             工商網(wǎng)監(jiān)
工商網(wǎng)監(jiān)
        
評(píng)論