<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

單片機按鍵去抖動的方法

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

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

一、STC15W408AS按鍵電路

圖片

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

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

圖片

三、按鍵去抖動方法

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

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

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

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

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

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

{

        Delay20ms(); //延時20MS

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

        {

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

            mNum++; //按鍵次數加1

        }

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

}



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

void Timer0_ISR (void) interrupt 1

{

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

        {

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

        }

}



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

void Delay20ms(void)

{

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

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

}



* //500MS延時函數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閃動函數,第1次按下,LED閃動1次,第2次按下,LED閃動2次,依次類推。

void LedFlash(UINT num)

{

        UINT i;

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

        {

               PinLed_Low();

               Delay500ms();

               PinLed_High();

               Delay500ms();

        }

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

    關注

    6008

    文章

    44087

    瀏覽量

    623097
  • 去抖動
    +關注

    關注

    0

    文章

    2

    瀏覽量

    6325
  • 按鍵電路
    +關注

    關注

    1

    文章

    35

    瀏覽量

    21644
  • 按鍵檢測
    +關注

    關注

    0

    文章

    22

    瀏覽量

    4806
收藏 人收藏

    評論

    相關推薦

    單片機按鍵的問題(轉)

    在網上看到這篇心得,感覺還是很實用的小問題,轉來希望大家共同學習,在網上看了《單片機按鍵一次處理的優化方法》這篇文章,很有點啟發,不過我疑惑的是第二個程序中的消除抖動語句怎么沒了,再查
    發表于 08-11 11:03

    單片機如何區別按鍵長按和短按?

      單片機工程師在面試的過程中,經常會碰到一些相同的問題,筆者總結了十個提問率較高的問題,供大家參考?,F在我們來分析單片機工程師常遇面試問題之二:單片機如何區別按鍵長按和短按?    
    發表于 01-14 16:59

    如何使用基于51單片機的新型按鍵掃描程序

    如何使用基于51單片機的新型按鍵掃描程序?基于51單片機的新型按鍵掃描程序有哪些應用?
    發表于 10-19 09:14

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

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

    單片機按鍵檢測程序分享

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

    如何消除按鍵抖動的影響

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

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

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

    怎樣編寫單片機的獨立按鍵與矩陣按鍵的掃描函數呢

    單片機的獨立按鍵是什么?單片機的矩陣按鍵是什么?怎樣編寫單片機的獨立
    發表于 02-23 06:24

    單片機按鍵抖原理是什么?

    單片機按鍵抖原理
    發表于 11-06 06:57

    單片機按鍵產生的抖動是方波還是尖刺?

    單片機 按鍵產生的抖動是方波還是尖刺
    發表于 11-08 07:03

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

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

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

    閉合的時間超過了 20ms。因此單片機在檢測鍵盤是否按下時都要加上去抖動操作,有專用的去抖動電路,也有專門的去抖動芯片,但通常我們采用軟件延時的方法
    的頭像 發表于 11-30 17:39 ?2154次閱讀

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

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

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

    單片機零基礎入門(7):解決獨立按鍵抖動的問題一、按鍵抖動的原因二、解決按鍵
    發表于 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 按鍵抖動 延時消抖

    按鍵抖動:在機械按鍵的觸點閉合和斷開時,都會產生抖動,為了保證系統能正確識別按鍵的開關,就必須對按鍵
    發表于 01-18 10:30 ?4次下載
    STM32F407 <b class='flag-5'>按鍵</b><b class='flag-5'>抖動</b> 延時消抖
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>