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

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

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

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

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

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

圖片

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:  
        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:           //沒鍵按下 退出
        break;  
      }
  }
}

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

主函數(shù)通過switch語句檢測出被按下的按鍵,并執(zhí)行被按下按鍵的任務(wù)。當(dāng)檢測到按鍵按下后并沒有馬上執(zhí)行按鍵的任務(wù)而是延時10ms躲開按鍵機(jī)械抖動(如果此時立即執(zhí)行按鍵功能,可能是誤動作,因為有可能是外界干擾引起瞬間起與按鍵相連的I/O口線為低電平)。然后再檢測按鍵是否還處在閉合狀態(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);              //延時去抖動
        if(!SW1)              //再次確認(rèn)SW1閉合
        {
          LED0=!LED0 ;          //執(zhí)行SW1按下的功能
          while(!SW1);          //等待按鍵釋放
          delay(5);             //延時去抖動
        }            
        break;
      case  0x1D:              //判斷是不是SW2閉合
        delay(10);              //延時去抖動
        if(!SW2)              //再次確認(rèn)SW2是否閉合
        {
          LED1=!LED1  ;        //執(zhí)行SW2按下的功能
          while(!SW2);           //等待按鍵釋放
          delay(5);             //延時去抖動
        }
        break;
      case  0x1B:               //判斷是不是SW3閉合
        delay(10);             //延時去抖動
        if(!SW3)              //再次確認(rèn)SW3是否閉合
        {  
          LED2=!LED2  ;        //執(zhí)行SW3按下的功能
          while(!SW3);           //等待按鍵釋放
          delay(5);            //延時去抖動
        }
        break;
      case  0x17:               //判斷是不是SW4閉合
        delay(10);              //延時去抖動
        if(!SW4)              //再次確認(rèn)SW4是否閉合
        {  
          LED3=!LED3  ;        //執(zhí)行SW4按下的功能
          while(!SW4);           //等待按鍵釋放
          delay(5);            //延時去抖動
        }
        break;
      case  0x0F:               //判斷是不是SW5閉合
        delay(10);             //延時去抖動
        if(!SW5)              //再次確認(rèn)SW5是否閉合
        {  
          LED4=!LED4  ;        //執(zhí)行SW5按下的功能
          while(!SW5)          //等待按鍵釋放
          delay(5);             //延時去抖動
        }
        break;
      default:                 //沒鍵按下 退出
        break;  
     }
  }
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6037

    文章

    44558

    瀏覽量

    635400
  • Switch
    +關(guān)注

    關(guān)注

    1

    文章

    533

    瀏覽量

    58244
  • 檢測技術(shù)
    +關(guān)注

    關(guān)注

    2

    文章

    355

    瀏覽量

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

    關(guān)注

    1

    文章

    45

    瀏覽量

    11566
  • 按鍵檢測
    +關(guān)注

    關(guān)注

    0

    文章

    23

    瀏覽量

    4836
收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

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

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

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

    獨(dú)立按鍵按下的時間該怎么檢測

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

    獨(dú)立按鍵的使用

    獨(dú)立按鍵使用較為簡單,一般需特別注意按鍵的抖動;因為按鍵的開關(guān)都有抖動,而如果在抖動時間內(nèi)檢測按鍵
    發(fā)表于 07-20 08:31

    獨(dú)立按鍵編程

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

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

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

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

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

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

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

    獨(dú)立按鍵實驗步驟

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

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

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

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

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

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

    按鍵跳線帽需要短接J5口的1和2引腳,按鍵能使用16個(即上圖中S4-S19)。矩陣按鍵的掃描方法可采用行列掃描法,分為兩步:將行的輸出設(shè)為低電平(0),檢測列的電平輸入值。將列的輸出
    發(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ú)立按鍵 的使用

    ,直白來講,就是能輸出高低電平,也能讀取高低電平。當(dāng)按鍵按下時,相當(dāng)于單片機(jī)I/O直接接地,讀取出來的電平就是低電平。獨(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位端口檢測8獨(dú)立按鍵源程序

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