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

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

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

獨(dú)立按鍵檢測(cè)技術(shù)講解

CHANBAEK ? 來(lái)源:嵌入式開(kāi)發(fā)教程 ? 作者:郭學(xué)提 ? 2023-07-12 11:53 ? 次閱讀

獨(dú)立按鍵根據(jù)其擊鍵持續(xù)時(shí)間可分為短按和長(zhǎng)按。在一鍵多功能技術(shù)中,短按和長(zhǎng)按所實(shí)現(xiàn)的功能是不一樣的。如MP3播放器中的下一曲按扭,短按時(shí)執(zhí)行的功能是選擇下一曲,而長(zhǎng)按時(shí)則是當(dāng)前歌曲的快進(jìn)。一般將按鍵按下的時(shí)間小于1S以?xún)?nèi)的稱(chēng)為短按鍵,按鍵按下超過(guò)1S的稱(chēng)為長(zhǎng)按。大部分單片機(jī)中所講述的按鍵都屬于短按功能。本節(jié)通過(guò)按鍵短按功能講述獨(dú)立按鍵的檢測(cè)及軟件防抖動(dòng)的基本方法。如圖所示的實(shí)驗(yàn)電路中,其按鍵檢測(cè)程序代碼如下:

圖片

sbit  LED0=P1^0;          //定義LED0為P1.0口
sbit  LED1=P1^1;           //定義LED1為P1.1口
sbit  LED2=P1^2;           //定義LED2為P1.2口
sbit  LED3=P1^3;           //定義LED3為P1.3口
sbit  LED4=P1^4;           //定義LED4為P1.4口
void  main(void)  
{
  unsigned char SW;          //定義按鍵檢測(cè)中間變量
  while(1)
  {     
    SW=P2&0x1F;          //屏蔽P2口高3位
    switch(SW)
     {
      case 0x1E:  
        LED0=0 ;        //執(zhí)行SW1按下的功能
        break;
      case  0x1D:  
        LED1=0  ;      //執(zhí)行SW2按下的功能
        break;
      case  0x1B:  
        LED2=0  ;      //執(zhí)行SW3按下的功能
        break;
      case  0x17:  
        LED3=0  ;      //執(zhí)行SW4按下的功能
        break;
      case  0x0F:  
        LED4=0  ;      //執(zhí)行SW5按下的功能
        break;
      default:           //沒(méi)鍵按下 退出
        break;  
      }
  }
}

獨(dú)立按鍵檢測(cè)技術(shù)一般是通過(guò)檢測(cè)與按鍵相連的I/O口線的狀態(tài)。由圖可知當(dāng)按鍵按下時(shí),與其連接的I/O口線將向單片機(jī)系統(tǒng)輸入低(單片機(jī)讀取的值是0)。因此通過(guò)檢測(cè)I/O口是否有低輸入可判斷是否有按鍵按下。上述程序能夠檢測(cè)到按鍵按下,檢測(cè)不到按鍵釋放的,每次只能檢測(cè)到一個(gè)按鍵,同一時(shí)刻有兩個(gè)或以上的按鍵按下時(shí)按鍵無(wú)效(無(wú)按鍵按下)。而且沒(méi)有添加軟件去抖動(dòng)功能,但是它提供了一種按鍵檢測(cè)的基本思路。另外讀者還可通過(guò)條件判斷語(yǔ)句if來(lái)檢測(cè)按鍵的狀態(tài)。下面介紹一種具有軟件防抖動(dòng)功能,能檢測(cè)按鍵釋放、閉合的程序。其程序在結(jié)構(gòu)上可分為兩部分:主函數(shù)、防抖動(dòng)延時(shí)函數(shù)。

主函數(shù)通過(guò)switch語(yǔ)句檢測(cè)出被按下的按鍵,并執(zhí)行被按下按鍵的任務(wù)。當(dāng)檢測(cè)到按鍵按下后并沒(méi)有馬上執(zhí)行按鍵的任務(wù)而是延時(shí)10ms躲開(kāi)按鍵機(jī)械抖動(dòng)(如果此時(shí)立即執(zhí)行按鍵功能,可能是誤動(dòng)作,因?yàn)橛锌赡苁峭饨绺蓴_引起瞬間起與按鍵相連的I/O口線為低電平)。然后再檢測(cè)按鍵是否還處在閉合狀態(tài),如果仍然處在閉合狀態(tài),則執(zhí)行按鍵的任務(wù)。反之則退出。其程序代碼如下:

sbit  SW1=P2^0;             //定義SW1為P2.0口
sbit  SW2=P2^1;             //定義SW1為P2.1口
sbit  SW3=P2^2;             //定義SW1為P2.2口
sbit  SW4=P2^3;             //定義SW1為P2.3口
sbit  SW5=P2^4;             //定義SW1為P2.4口
sbit  LED0=P1^0;          //定義LED0為P1.0口
sbit  LED1=P1^1;           //定義LED1為P1.1口
sbit  LED2=P1^2;           //定義LED2為P1.2口
sbit  LED3=P1^3;           //定義LED3為P1.3口
sbit  LED4=P1^4;           //定義LED4為P1.4口
void  main(void)  
{
  unsigned char SW;
  while(1)
 {     
    SW=P2&0x1F;                //屏蔽P2口高3位
    switch(SW)
    {
      case 0x1E:              //判斷是不是SW1閉合
        delay(10);              //延時(shí)去抖動(dòng)
        if(!SW1)              //再次確認(rèn)SW1閉合
        {
          LED0=!LED0 ;          //執(zhí)行SW1按下的功能
          while(!SW1);          //等待按鍵釋放
          delay(5);             //延時(shí)去抖動(dòng)
        }            
        break;
      case  0x1D:              //判斷是不是SW2閉合
        delay(10);              //延時(shí)去抖動(dòng)
        if(!SW2)              //再次確認(rèn)SW2是否閉合
        {
          LED1=!LED1  ;        //執(zhí)行SW2按下的功能
          while(!SW2);           //等待按鍵釋放
          delay(5);             //延時(shí)去抖動(dòng)
        }
        break;
      case  0x1B:               //判斷是不是SW3閉合
        delay(10);             //延時(shí)去抖動(dòng)
        if(!SW3)              //再次確認(rèn)SW3是否閉合
        {  
          LED2=!LED2  ;        //執(zhí)行SW3按下的功能
          while(!SW3);           //等待按鍵釋放
          delay(5);            //延時(shí)去抖動(dòng)
        }
        break;
      case  0x17:               //判斷是不是SW4閉合
        delay(10);              //延時(shí)去抖動(dòng)
        if(!SW4)              //再次確認(rèn)SW4是否閉合
        {  
          LED3=!LED3  ;        //執(zhí)行SW4按下的功能
          while(!SW4);           //等待按鍵釋放
          delay(5);            //延時(shí)去抖動(dòng)
        }
        break;
      case  0x0F:               //判斷是不是SW5閉合
        delay(10);             //延時(shí)去抖動(dòng)
        if(!SW5)              //再次確認(rèn)SW5是否閉合
        {  
          LED4=!LED4  ;        //執(zhí)行SW5按下的功能
          while(!SW5)          //等待按鍵釋放
          delay(5);             //延時(shí)去抖動(dòng)
        }
        break;
      default:                 //沒(méi)鍵按下 退出
        break;  
     }
  }
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6023

    文章

    44376

    瀏覽量

    628297
  • Switch
    +關(guān)注

    關(guān)注

    1

    文章

    532

    瀏覽量

    57924
  • 檢測(cè)技術(shù)
    +關(guān)注

    關(guān)注

    2

    文章

    348

    瀏覽量

    29014
  • 獨(dú)立按鍵
    +關(guān)注

    關(guān)注

    1

    文章

    45

    瀏覽量

    11519
  • 按鍵檢測(cè)
    +關(guān)注

    關(guān)注

    0

    文章

    22

    瀏覽量

    4812
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    深入而全面:FPGA學(xué)習(xí)之獨(dú)立按鍵檢測(cè)

    幾乎沒(méi)有哪一個(gè)系統(tǒng)沒(méi)有輸入輸出設(shè)備,大到顯示器,小到led燈,輕觸按鍵。作為一個(gè)系統(tǒng),要想穩(wěn)定的工作,輸入輸出設(shè)備的性能占了很重要的角色。本實(shí)驗(yàn),小梅哥就通過(guò)一個(gè)獨(dú)立按鍵檢測(cè)實(shí)驗(yàn),來(lái)
    發(fā)表于 12-11 11:18 ?1.1w次閱讀

    獨(dú)立鍵盤(pán)的檢測(cè)原理及程序?qū)崿F(xiàn)的方法

    由于在單片機(jī)在應(yīng)用系統(tǒng)中,更多的會(huì)用到獨(dú)立鍵盤(pán),加之兩者的檢測(cè)原理基本相似,所以這一節(jié)里我主要講解獨(dú)立鍵盤(pán)的檢測(cè)原理及程序?qū)崿F(xiàn)的方法。 1、
    的頭像 發(fā)表于 09-11 10:44 ?1966次閱讀
    <b class='flag-5'>獨(dú)立</b>鍵盤(pán)的<b class='flag-5'>檢測(cè)</b>原理及程序?qū)崿F(xiàn)的方法

    ATmega32應(yīng)用 獨(dú)立按鍵檢測(cè)

    本帖最后由 suae 于 2011-7-27 16:24 編輯 ATmega32應(yīng)用 獨(dú)立按鍵檢測(cè)[code]//顯示相應(yīng)的鍵值0~4#include#include#define uchar
    發(fā)表于 07-27 16:15

    獨(dú)立按鍵按下的時(shí)間該怎么檢測(cè)?

    當(dāng)獨(dú)立按鍵按下時(shí)間大于0.2s時(shí)執(zhí)行操作,怎么檢測(cè)按鍵按下時(shí)間呢?
    發(fā)表于 10-08 04:15

    獨(dú)立按鍵的使用

    獨(dú)立按鍵使用較為簡(jiǎn)單,一般需特別注意按鍵的抖動(dòng);因?yàn)?b class='flag-5'>按鍵的開(kāi)關(guān)都有抖動(dòng),而如果在抖動(dòng)時(shí)間內(nèi)檢測(cè)按鍵
    發(fā)表于 07-20 08:31

    獨(dú)立按鍵編程

    【朱老師課程總結(jié) 侵刪】第一部分、章節(jié)目錄1.9.1.按鍵相關(guān)知識(shí)1.9.2.獨(dú)立按鍵編程1.9.3.鍵值檢測(cè)與顯示1.9.4.按鍵的消抖1
    發(fā)表于 11-22 08:09

    獨(dú)立按鍵使用的原理是什么

    ,直白來(lái)講,就是能輸出高低電平,也能讀取高低電平。當(dāng)按鍵按下時(shí),相當(dāng)于單片機(jī)I/O直接接地,讀取出來(lái)的電平就是低電平。獨(dú)立按鍵使用代碼獨(dú)立按鍵
    發(fā)表于 01-17 06:31

    矩陣按鍵按鍵獨(dú)立按鍵檢測(cè)有什么不同的地方?

    矩陣按鍵按鍵獨(dú)立按鍵檢測(cè)有什么不同的地方
    發(fā)表于 10-11 08:05

    8位端口檢測(cè)8獨(dú)立按鍵

    8位端口檢測(cè)8獨(dú)立按鍵 C51單片機(jī)源碼,KEIL源文件,C語(yǔ)言編寫(xiě)
    發(fā)表于 06-20 16:36 ?17次下載

    獨(dú)立按鍵實(shí)驗(yàn)步驟

    獨(dú)立按鍵原理即使用
    發(fā)表于 03-16 08:00 ?2次下載

    小梅哥和你一起深入學(xué)習(xí)FPGA之獨(dú)立按鍵檢測(cè)(上)

    關(guān)鍵詞:FPGA , 按鍵檢測(cè) 幾乎沒(méi)有哪一個(gè)系統(tǒng)沒(méi)有輸入輸出設(shè)備,大到顯示器,小到led燈,輕觸按鍵。作為一個(gè)系統(tǒng),要想穩(wěn)定的工作,輸入輸出設(shè)備的性能占了很重要的角色。本實(shí)驗(yàn),小梅哥就通過(guò)一個(gè)
    發(fā)表于 09-26 07:40 ?531次閱讀

    51單片機(jī)按鍵檢測(cè)--獨(dú)立按鍵與矩陣鍵盤(pán)

    按鍵可以說(shuō)是51單片機(jī)項(xiàng)目開(kāi)發(fā)的一個(gè)重要組件了,它是作為51單片機(jī)IO口輸入的一種重要方式。我們可以通過(guò)按鍵控制單片機(jī)執(zhí)行相應(yīng)的程序,得到我們想要得效果。51單片機(jī)的按鍵輸入主要有兩種,一種是
    發(fā)表于 11-12 11:06 ?15次下載
    51單片機(jī)<b class='flag-5'>按鍵</b><b class='flag-5'>檢測(cè)</b>--<b class='flag-5'>獨(dú)立</b><b class='flag-5'>按鍵</b>與矩陣鍵盤(pán)

    藍(lán)橋杯單片機(jī)——獨(dú)立按鍵、矩陣按鍵

    按鍵跳線帽需要短接J5口的1和2引腳,按鍵能使用16個(gè)(即上圖中S4-S19)。矩陣按鍵的掃描方法可采用行列掃描法,分為兩步:將行的輸出設(shè)為低電平(0),檢測(cè)列的電平輸入值。將列的輸出
    發(fā)表于 12-31 19:29 ?1次下載
    藍(lán)橋杯單片機(jī)——<b class='flag-5'>獨(dú)立</b><b class='flag-5'>按鍵</b>、矩陣<b class='flag-5'>按鍵</b>

    藍(lán)橋杯 單片機(jī) 獨(dú)立按鍵 的使用

    ,直白來(lái)講,就是能輸出高低電平,也能讀取高低電平。當(dāng)按鍵按下時(shí),相當(dāng)于單片機(jī)I/O直接接地,讀取出來(lái)的電平就是低電平。獨(dú)立按鍵使用代碼獨(dú)立按鍵
    發(fā)表于 01-18 10:44 ?7次下載
    藍(lán)橋杯 單片機(jī) <b class='flag-5'>獨(dú)立</b><b class='flag-5'>按鍵</b> 的使用

    基于89C51單片機(jī)的8位端口檢測(cè)8獨(dú)立按鍵源程序

    基于89C51單片機(jī)的8位端口檢測(cè)8獨(dú)立按鍵源程序
    發(fā)表于 05-16 10:49 ?1次下載