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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

單片機按鍵去抖動的方法

CHANBAEK ? 來源:科創(chuàng)追夢者 ? 作者:謝士金 ? 2023-11-02 15:16 ? 次閱讀

在使用按鍵時,我們想按一次按鍵,但在實際中卻經(jīng)常發(fā)現(xiàn)我們要的”一次“,實際上去并不是”一次“而可能是多次。為什么呢?這是因為,我們使用的機械按鍵,在我們按下時,并非只是接觸一次,因為存在機械抖動,導致接觸多次。因此,按鍵檢測去抖動就很有必要了。下面,我就向大家介紹按鍵去抖動的方法。

一、STC15W408AS按鍵電路

圖片

二、按鍵按下和松開時的波形

下面的圖形中顯示的是按鍵按下和松開時的理想狀態(tài)和實際狀態(tài)。

圖片

三、按鍵去抖動方法

理想波形:沒有按下為高電平,按下之后為低電平,松開之后又為高電平。

實際波形:按下之后,存在機械抖動,需要過一段時間才會穩(wěn)定成低電平,然后,松開時又會產(chǎn)生機械抖動。機械式按鍵在按下或者釋放時,由于機械彈性的影響,通常會伴隨有一定的時間觸電機械抖動,然后其觸電才穩(wěn)定下來。在觸點抖動期間檢測按鍵的通與斷,可能會導致錯誤,也就是有可能被認為進行了多次操作,這種情況是不允許出現(xiàn)的。

因此,在單片機檢測鍵盤是否按下都要加上去抖動操作,按鍵少時,可采用硬件消抖,按鍵較多時,采用軟件消抖。

我們在編寫單片機的按鍵檢測程序時,一般在檢測按下時加入去抖動延時(10~20ms即可),也就是當檢測到按鍵輸入口是低電平時,延時20MS再檢測一次按鍵的狀態(tài)是不是還是低電平。如果還是低電平,則認為按鍵被真正按下一次。

四、按鍵檢測去抖動關鍵代碼

if(!GetKey_High()) //如果檢測到按鍵低電平

{

        Delay20ms(); //延時20MS

        if(!GetKey_High()) //如果還是檢測到按鍵低電平

        {

            bKeyDown=TRUE; //確認按鍵已按下

            mNum++; //按鍵次數(shù)加1

        }

        while(!GetKey_High()); //等待按鍵松開

}



* //1MS定時中斷函數(shù)Timer0_ISR()

void Timer0_ISR (void) interrupt 1

{

        if(mDelay >0)//如果mDelay >0

        {

             mDelay--; //則中斷到來時,mDelay減1

        }

}



* //20MS延時函數(shù)Delay20ms()

void Delay20ms(void)

{

        mDelay=20;            //設置mDelay的值為20

        while(mDelay >0);    //等待mDelay在中斷中減到0

}



* //500MS延時函數(shù)Delay500ms()

void Delay500ms(void)

{

        mDelay=500;

        while(mDelay >0);

}

五、本例完整源程序

#define FOSC 11059200L

#define T1MS (65536-FOSC/1000)      // 1 T模式

#define BIT0 0x01

#define BIT1 0x02

#define BIT2 0x04

#define BIT3 0x08

#define BIT4 0x10

#define BIT5 0x20

#define BIT6 0x40

#define BIT7 0x80



#define TRUE 1

#define FALSE 0



#define Pin_LED P32

#define Pin_LED_M1 P3M1

#define Pin_LED_M0 P3M0

#define Pin_LED_BIT BIT2

#define PinLed_High() Pin_LED=1

#define PinLed_Low() Pin_LED=0

#define Pin_KEY P12

#define Pin_KEY_M1 P1M1

#define Pin_KEY_M0 P1M0

#define Pin_KEY_BIT BIT2

#define GetKey_High() Pin_KEY==1

#define BOOL unsigned char

#define UINT unsigned int



void PinLED_DirOut(void);

void PinKEY_DirIn(void);

void Timer0_Init(void);

void Delay20ms(void);

void Delay500ms(void);

void LedFlash(UINT num);



BOOL bKeyDown=FALSE;

UINT mDelay=0;

UINT mNum=0;



void main(void)

{

        PinKEY_DirIn();

        PinLED_DirOut();

        PinLed_High();

        Timer0_Init();

        while(TRUE)

        {

            if(!GetKey_High())

            {

                Delay20ms();

                if(!GetKey_High())

                {

                      mNum++;

                      bKeyDown=TRUE;

                 }



               while(!GetKey_High());

           }



          if(bKeyDown)

          {

              bKeyDown=FALSE;

              LedFlash(mNum);         

          }

     }    

}



void PinKEY_DirIn(void)

{

        Pin_KEY_M1 &=~Pin_KEY_BIT;

        Pin_KEY_M0 &=~Pin_KEY_BIT;   

}



void PinLED_DirOut(void)

{

        Pin_LED_M1 &=~Pin_LED_BIT;

        Pin_LED_M0 |=Pin_LED_BIT; 

}



void Timer0_Init(void)

{

        AUXR |= 0x80;         //定時器0為1T模式

        TMOD = 0x00;          //設置定時器為模式0(16位自動重裝載)

        TL0 = T1MS;           //初始化計時值

        TH0 = T1MS > > 8;

        TR0 = 1;              //定時器0開始計時

        ET0 = 1;              //使能定時器0中斷

        EA = 1;

}



// 1ms

void Timer0_ISR (void) interrupt 1

{

        if(mDelay >0)

        {

              mDelay--;

        }    

}



void Delay20ms(void)

{

        mDelay=20;

        while(mDelay >0);

}



void Delay500ms(void)

{

        mDelay=500;

        while(mDelay >0);

}



//為了方便檢驗效果,我寫了下面這個LED閃動函數(shù),第1次按下,LED閃動1次,第2次按下,LED閃動2次,依次類推。

void LedFlash(UINT num)

{

        UINT i;

        for(i=0;i< num;i++)

        {

               PinLed_Low();

               Delay500ms();

               PinLed_High();

               Delay500ms();

        }

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

    關注

    6037

    文章

    44558

    瀏覽量

    635217
  • 去抖動
    +關注

    關注

    0

    文章

    2

    瀏覽量

    6343
  • 按鍵電路
    +關注

    關注

    1

    文章

    35

    瀏覽量

    21774
  • 按鍵檢測
    +關注

    關注

    0

    文章

    23

    瀏覽量

    4836
收藏 人收藏

    評論

    相關推薦

    單片機按鍵設計的方法,這幾個方案不錯

    單片機按鍵設計的四個方案詳解在單片機系統(tǒng)里,按鍵是常見的輸入設備,在本文江介紹幾種按鍵硬件、軟件設計方面的技
    的頭像 發(fā)表于 01-06 07:05 ?1w次閱讀
    <b class='flag-5'>單片機</b><b class='flag-5'>按鍵</b>設計的<b class='flag-5'>方法</b>,這幾個方案不錯

    單片機如何消除按鍵抖動?

    單片機如何消除按鍵抖動?
    發(fā)表于 10-21 09:29

    單片機按鍵檢測程序分享

    單片機按鍵檢測程序(定時器法消抖)相信大家在初學51單片機的時候按鍵檢測為了消抖都會加一些空循環(huán)做軟件延時。這樣做可是浪費了CPU的不少資源。對于51這種低端
    發(fā)表于 12-03 07:23

    如何消除按鍵抖動的影響

    按鍵抖動:在機械按鍵的觸點閉合和斷開時,都會產(chǎn)生抖動,為了保證系統(tǒng)能正確識別按鍵的開關,就必須對按鍵
    發(fā)表于 01-17 07:46

    STM32單片機按鍵消抖和FPGA按鍵消抖的相關資料分享

    寫在前面:STM32單片機按鍵消抖和FPGA按鍵消抖大全按鍵抖:由上圖可以看出理想波形與實際波形之間是有區(qū)別的,實際波形在按下和釋放的瞬間
    發(fā)表于 01-18 06:39

    單片機按鍵產(chǎn)生的抖動是方波還是尖刺?

    單片機 按鍵產(chǎn)生的抖動是方波還是尖刺
    發(fā)表于 11-08 07:03

    單片機按鍵處理總結(jié)——含程序詳解

    講述幾種常用的按鍵的應用及程序處理方法,幫助大家掌握單片機處理按鍵方法
    發(fā)表于 11-10 10:55 ?11次下載

    單片機按鍵抖動程序解析

    通常按鍵所用的開關都是機械彈性開關,當機械觸點斷開、閉合時,由于機械觸點的彈性作用,一個按鍵開關在閉合時不會馬上就穩(wěn)定的接通,在斷開時也不會一下子徹底斷開,而是在閉合和斷開的瞬間伴隨了一連串的抖動。
    發(fā)表于 11-15 14:45 ?2.7w次閱讀
    <b class='flag-5'>單片機</b><b class='flag-5'>按鍵</b><b class='flag-5'>去</b><b class='flag-5'>抖動</b>程序解析

    單片機按鍵防抖子程序詳情解說

    要解決單片機按鍵抖動問題,首先要了解被鍵的類型,按鍵有觸點式和非觸點式兩種,單片機中應用的- 一般是由機械觸點構(gòu)成的。在下圖中,當開關未被按
    發(fā)表于 11-15 15:16 ?1.1w次閱讀
    <b class='flag-5'>單片機</b><b class='flag-5'>按鍵</b>防抖子程序詳情解說

    STM單片機中的按鍵消抖和FPGA消抖

    閉合的時間超過了 20ms。因此單片機在檢測鍵盤是否按下時都要加上去抖動操作,有專用的抖動電路,也有專門的
    的頭像 發(fā)表于 11-30 17:39 ?2728次閱讀

    單片機按鍵使用程序 (51單片機

    單片機獨立按鍵使用程序 (51單片機)獨立按鍵單片機中很重要的一個器件,在這篇文章里,通過這個用獨立
    發(fā)表于 11-11 18:36 ?108次下載
    <b class='flag-5'>單片機</b><b class='flag-5'>按鍵</b>使用程序 (51<b class='flag-5'>單片機</b>)

    單片機按鍵檢測程序(定時器法消抖)

    單片機按鍵檢測程序(定時器法消抖)相信大家在初學51單片機的時候按鍵檢測為了消抖都會加一些空循環(huán)做軟件延時。這樣做可是浪費了CPU的不少資源。對于51這種低端
    發(fā)表于 11-23 17:51 ?5次下載
    <b class='flag-5'>單片機</b><b class='flag-5'>按鍵</b>檢測程序(定時器法消抖)

    單片機學習-矩陣按鍵

    目錄矩陣按鍵介紹檢測方法C51例程歡迎加QQ及郵件交流矩陣按鍵介紹 獨立鍵盤與單片機連接時,每一個按鍵都需要
    發(fā)表于 12-31 19:37 ?15次下載
    <b class='flag-5'>單片機</b>學習-矩陣<b class='flag-5'>按鍵</b>

    單片機零基礎入門(7):按鍵消抖--獨立按鍵按下點亮LED燈,松開LED燈滅--解決獨立按鍵抖動的問題

    單片機零基礎入門(7):解決獨立按鍵抖動的問題一、按鍵抖動的原因二、解決按鍵
    發(fā)表于 01-17 11:05 ?6次下載
    <b class='flag-5'>單片機</b>零基礎入門(7):<b class='flag-5'>按鍵</b>消抖--獨立<b class='flag-5'>按鍵</b>按下點亮LED燈,松開LED燈滅--解決獨立<b class='flag-5'>按鍵</b><b class='flag-5'>抖動</b>的問題

    STM32F407 按鍵抖動 延時消抖

    按鍵抖動:在機械按鍵的觸點閉合和斷開時,都會產(chǎn)生抖動,為了保證系統(tǒng)能正確識別按鍵的開關,就必須對按鍵
    發(fā)表于 01-18 10:30 ?4次下載
    STM32F407 <b class='flag-5'>按鍵</b><b class='flag-5'>抖動</b> 延時消抖