0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

按鍵消抖的軟件和硬件方法

CHANBAEK ? 來源:硬件工程師干貨 ? 作者:硬件工程師干貨 ? 2023-03-01 10:53 ? 次閱讀

1、先看一下按鍵抖動(dòng)波形

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

2、硬件方法:

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

其它的復(fù)雜方法如RS觸發(fā)器電路一般用在沒有軟件的場(chǎng)合,這里就不做介紹了。

3、軟件方法:采用延時(shí)檢測(cè)的方法錯(cuò)開抖動(dòng)區(qū)域。

代碼實(shí)現(xiàn)1: 這種方法在主循環(huán)內(nèi)輪詢按鍵狀態(tài),查詢GPIO狀態(tài),這種方法最簡(jiǎn)單,也最常見,但是會(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í)器中斷后再次檢測(cè)按鍵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)整。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 軟件
    +關(guān)注

    關(guān)注

    69

    文章

    4570

    瀏覽量

    86695
  • 波形
    +關(guān)注

    關(guān)注

    3

    文章

    374

    瀏覽量

    31376
  • 觸發(fā)器
    +關(guān)注

    關(guān)注

    14

    文章

    1990

    瀏覽量

    60868
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1172

    瀏覽量

    51511
  • 按鍵消抖
    +關(guān)注

    關(guān)注

    2

    文章

    24

    瀏覽量

    10422
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    按鍵硬件電路原理詳解

    按鍵通常的按鍵所用開關(guān)為機(jī)械彈性開關(guān),當(dāng)機(jī)械觸點(diǎn)斷開、閉合時(shí),由于機(jī)械觸點(diǎn)的彈性作用,一個(gè)按鍵開關(guān)在閉合時(shí)不會(huì)馬上穩(wěn)定地接通,在斷開時(shí)也
    的頭像 發(fā)表于 02-02 09:42 ?8936次閱讀
    <b class='flag-5'>按鍵</b>的<b class='flag-5'>硬件</b><b class='flag-5'>消</b><b class='flag-5'>抖</b>電路原理詳解

    單片機(jī)的按鍵與幾種按鍵電路

    按鍵電路 一、 硬件按鍵電路控制電路 所示利用RC 積分電路來達(dá)成雜波的濾除
    的頭像 發(fā)表于 12-17 07:45 ?10.6w次閱讀
    單片機(jī)的<b class='flag-5'>按鍵</b><b class='flag-5'>消</b><b class='flag-5'>抖</b>與幾種<b class='flag-5'>按鍵</b>電路

    按鍵

    請(qǐng)問大家的按鍵是用什么方法解決的,如普通的按鍵如何
    發(fā)表于 09-26 22:17

    FPGA按鍵方法

    FPGA按鍵方法
    發(fā)表于 05-01 16:12

    技術(shù)分享:明德?lián)P按鍵的原理和基于fpga的設(shè)計(jì)

    按鍵。按鍵可分為硬件
    發(fā)表于 08-02 10:38

    按鍵硬件原理

    按鍵硬件原理:利用電容充放電特性來實(shí)現(xiàn),因?yàn)殡娙轂閮?chǔ)能元件。它兩端的電壓不能出現(xiàn)突變,即有一個(gè)充放電的過程下降沿觸發(fā)電路:上升沿觸發(fā)電路:什么是RC電路?STM8S手冊(cè)中IO口的邏
    發(fā)表于 12-07 12:47

    有什么方法去實(shí)現(xiàn)按鍵

    怎樣用軟件即程序來實(shí)現(xiàn)按鍵呢?有什么方法去實(shí)現(xiàn)按鍵
    發(fā)表于 12-15 07:25

    介紹獨(dú)立按鍵方法

    目錄按鍵介紹按鍵方法按鍵檢測(cè)原理C51例程歡迎加QQ及郵件交流
    發(fā)表于 01-14 07:49

    按鍵延時(shí)方法和目的分別是什么

    的地方,開發(fā)成本高,操作難度大,可移植性差。軟件就相對(duì)較好些,新手即可操作,延時(shí),并非
    發(fā)表于 01-17 06:26

    按鍵都有哪些處理方式?

    按鍵都有哪些處理方式除了硬件電路用軟件怎么實(shí)
    發(fā)表于 11-01 07:06

    基于FPGA的按鍵電路設(shè)計(jì)

    采用了VHDL語(yǔ)言編程的設(shè)計(jì)方法,通過FPGA來實(shí)現(xiàn)按鍵硬件電路。論述了基于計(jì)數(shù)器、RS觸發(fā)器和狀態(tài)機(jī)3種
    發(fā)表于 12-05 14:13 ?224次下載

    VHDL—按鍵

    按鍵檢測(cè)需要,一般有硬件軟件兩種方式。硬件就是加去抖動(dòng)電路,這樣從根本上解決
    發(fā)表于 11-11 17:17 ?2次下載

    使用51單片機(jī)實(shí)現(xiàn)按鍵的資料和程序免費(fèi)下載

    抖動(dòng)是機(jī)械按鍵存在的現(xiàn)象,是必須要進(jìn)行處理的。一般處理有兩種方式:一種是硬件,另一種是軟件
    發(fā)表于 07-05 17:41 ?5次下載
    使用51單片機(jī)實(shí)現(xiàn)<b class='flag-5'>按鍵</b><b class='flag-5'>消</b><b class='flag-5'>抖</b>的資料和程序免費(fèi)下載

    【單片機(jī)】按鍵及原理(硬件軟件方法詳解)

    淺談:在設(shè)計(jì)單片機(jī)按鍵輸入的時(shí)候,進(jìn)行按鍵是防止按鍵輸入被CPU誤讀多次的必要手段。一、按鍵
    發(fā)表于 11-11 12:06 ?15次下載
    【單片機(jī)】<b class='flag-5'>按鍵</b><b class='flag-5'>消</b><b class='flag-5'>抖</b>及原理(<b class='flag-5'>硬件</b>和<b class='flag-5'>軟件</b><b class='flag-5'>方法</b>詳解)

    按鍵/開關(guān)量信號(hào)監(jiān)測(cè)實(shí)現(xiàn)方案

    關(guān)于按鍵或者開關(guān)量信號(hào)監(jiān)測(cè),可以參考本公眾號(hào)的另外一篇原創(chuàng)文章:按鍵常用的軟
    的頭像 發(fā)表于 09-19 11:35 ?802次閱讀