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

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

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

單片機(jī)人機(jī)交互之矩陣按鍵

汽車電子技術(shù) ? 來(lái)源:嵌入式悅翔園 ? 作者: JamesBin ? 2023-02-17 14:50 ? 次閱讀

按鍵是一種常開型按鈕開關(guān),與單片機(jī)的常見接法如圖所示。按鍵未按下時(shí)兩個(gè)觸點(diǎn)斷開,單片機(jī)I/O口輸入高電平;當(dāng)按鍵閉合時(shí),I/O口輸入低電平。

一、按鍵講解

當(dāng)I/O口為P0口時(shí),由于沒有內(nèi)部上拉電阻,所以必須外接上拉電阻,當(dāng)I/O口為P1、P2和P3口時(shí),由于內(nèi)部已有上拉電阻,因此可省略外接的上拉電阻。

圖片

二、按鍵消抖

單片機(jī)系統(tǒng)中所使用的鍵盤都是機(jī)械式的彈性按鍵,因?yàn)榇嬖跈C(jī)械觸點(diǎn)的彈性作用,在按鍵閉合和彈起的瞬間都會(huì)出現(xiàn)抖動(dòng),如圖所示。按鍵抖動(dòng)一般會(huì)持續(xù)5~10ms,為使一次按鍵僅被處理一次,必須消除按鍵抖動(dòng)。消除按鍵抖動(dòng)可以采用軟件消抖或硬件消抖。

圖片

軟件消抖指在檢測(cè)到有按鍵閉合時(shí),延時(shí)一小段時(shí)間之后再次檢測(cè),如果仍然檢測(cè)到按鍵閉合,則認(rèn)為按鍵真正閉合。

硬件消抖方法

1.R-S觸發(fā)器

一旦有鍵按下,觸發(fā)器立即反轉(zhuǎn),觸點(diǎn)的抖動(dòng)便不會(huì)再對(duì)輸出產(chǎn)生影響,按鍵釋放時(shí)也一樣。

圖片

2.電容濾波

電容并聯(lián)在按鍵的兩端,利用電容放電的延時(shí)特性,將產(chǎn)生抖動(dòng)的電平通過電容吸收掉,從而達(dá)到消抖的作用;

圖片

三、獨(dú)立按鍵

獨(dú)立鍵盤指每個(gè)按鍵都占據(jù)一個(gè)獨(dú)立的引腳。

圖片

四、矩陣按鍵

同一行上的所有按鍵都連接到一個(gè)引腳,同一列上的所有按鍵都連接到一個(gè)引腳。

圖片

(1)列掃描方式

所有行線都輸出高電平,列線依次輸出低電平;查詢?cè)摿猩闲械闹?,若?,則說明該行上的按鍵被按下;若該列上所有行的值都為1,則進(jìn)行下一列行值的查詢;循環(huán)往復(fù)。

圖片

(2)反轉(zhuǎn)法

所有行線都輸出0,查詢列線上的值,若某列線上的值為0,則說明該列線上的按鍵被按下;然后所有列線都輸出0,查詢行線上的值,若某行線上的值為0,則說明該行線上的按鍵被按下;從而確定某行某列的按鍵被按下。

圖片

五、程序舉例

圖片

#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
uint key,key_num;//鍵盤掃描值,鍵盤鍵值
/********************************************************************/
//函數(shù)名:delay_1ms(uint x)
//功能:利用定時(shí)器0精確定時(shí)1ms;自加 time_t的值為后面時(shí)間調(diào)整函數(shù)服務(wù)
//調(diào)用函數(shù):
//輸入參數(shù):x,1ms計(jì)數(shù)
//輸出參數(shù):
//說明:延時(shí)的時(shí)間為1ms乘以x
/********************************************************************/
void delay_1ms(uint x)
{
  TMOD=0X01;//開定時(shí)器0,工作方式為1
  TR0=1;//啟動(dòng)定時(shí)器0;
  while(x--)
  {
    TH0=0Xfc;//定時(shí)1ms初值的高8位裝入TH0
    TL0=0X18;//定時(shí)1ms初值的低8位裝入TL0
    while(!TF0);//等待,直到TF0為1
    TF0=0;
  }    
  TR0=0;//停止定時(shí)器0;
}

/**********************************************************/
//函數(shù)名:keyscan()
//功能:得出4x4鍵盤的行列掃描值
//調(diào)用函數(shù):delay_1ms(uint x)
//輸入?yún)?shù):
//輸出參數(shù):
//說明:通過P1口的掃描得出掃描值key,無(wú)鍵按下key為16
/**********************************************************/
uchar keyscan()
{
   uchar code_h;    //行掃描值
  uchar code_l;    //列掃描值
  P1=0XF0;       //P1.0-P1.3全為0,(行狀態(tài)全為低電平)
  if((P1&0xF0)!=0XF0)  //如果P1.4-P1.7不全為1,可能有鍵按下(為準(zhǔn)確識(shí)別按鍵動(dòng)作)
  {
      delay_1ms(5);  //廷時(shí)去抖動(dòng),為準(zhǔn)確識(shí)別按鍵動(dòng)作
      if((P1&0xF0)!=0XF0)//重讀高4位(列狀態(tài)),若還是不全為1,定有鍵按下
            {      
          code_h=0xfe;  //開始行掃描 (0xfe:11111110)
          while((code_h&0x10)!=0x00)//判斷是否掃描四行(X0~X3)完畢,若不是,繼續(xù)掃描(0x10:00010000)   
               {
             P1=code_h;  //第1次P1.0置為0,其余高電平;第2次P1.1置為0,其余高電平  ;第3次P1.2置為0,其余高電平;第4次P1.3置為0,其余高電平
             if((P1&0xF0)!=0XF0) //如果P1.4-P1.7不全為1,該行有鍵按下(0xF0:11110000)
                   {
               code_l=(P1&0xF0|0x0F);//保留P1口高4位,低4位變?yōu)?,作為列值
               return((~code_h)+(~code_l));//鍵盤編碼=行掃描值+列掃描值 (取反后用,相當(dāng)于改為按下按鍵對(duì)應(yīng)的行、列標(biāo)識(shí)為1,其它為0)         
             }
             else                           //左移后補(bǔ)0,但是我們需要將其他位置1,所以+1
               code_h=(code_h<<1)|0x01;  //若該行無(wú)鍵按下,行掃描值左移+1,掃描下一行 
           }
       }
   }
  return(16);   //無(wú)鍵按下,返回16 
 }

/**********************************************************/
//函數(shù)名:keynum()
//功能:得出4x4按鍵的鍵值
//調(diào)用函數(shù):keyscan()
//輸入?yún)?shù):
//輸出參數(shù):
//說明:通過key的值確定按鍵鍵值
/**********************************************************/
void keynum()
{
    uchar i,j;
    uchar code tab[4][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11},{12,13,14,15}}; 
    //4x4鍵盤各鍵值標(biāo)注
    key=16;
    key = keyscan();//引入key值
    if((key&0x01)!=0) i=0;  //判斷出按下按鍵的行列號(hào) (即找出低電平的行、列)
    if((key&0x02)!=0) i=1;
    if((key&0x04)!=0) i=2;
    if((key&0x08)!=0) i=3;
    if((key&0x10)!=0) j=0;
    if((key&0x20)!=0) j=1;
    if((key&0x40)!=0) j=2;
    if((key&0x80)!=0) j=3;
    if(key!=16) 
    {
       key_num = tab[i][j];//通過比較得出4x4鍵盤的鍵值
    }   
}

void main()
{
  uint shi,ge;
  shi = 0;
  ge = 0;
  P2 = 0x16;//初始值 為16
  while(1)
  {
     keynum(); //獲取到鍵值
     if(key!=16)
     {
        shi = key_num/10;//獲得十位   
       ge = key_num%10;//獲得個(gè)位
       if(shi)
       {
         P2 = 0x10|ge;
       }
       else
       {
          P2 = ge;
       }
     }
     delay_1ms(10);//延時(shí)
  }
}
聲明:本文內(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)注

    4

    文章

    223

    瀏覽量

    57602
  • 按鈕開關(guān)
    +關(guān)注

    關(guān)注

    1

    文章

    50

    瀏覽量

    10219
  • i/o
    i/o
    +關(guān)注

    關(guān)注

    0

    文章

    33

    瀏覽量

    4593
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    怎么設(shè)計(jì)基于單片機(jī)和FPGA的人機(jī)交互系統(tǒng)?

    在現(xiàn)代各類儀器的開發(fā)中,人機(jī)交互功能正起著無(wú)可替代的作用。人機(jī)交互界面友好的儀器將更容易操作和使用,從而提高工作效率。液晶顯示器(LCD)具有功耗低、價(jià)格低、壽命長(zhǎng)、接口控制方便等特點(diǎn),在科研
    發(fā)表于 08-22 07:50

    智能壓力監(jiān)控儀的人機(jī)交互怎么實(shí)現(xiàn)?

    近年來(lái),LCD顯示器的普及和微處理器向大容量的發(fā)展使嵌入式系統(tǒng)的人機(jī)交互功能得到了顯著的提高。在很多場(chǎng)合下,良好的圖形用戶界面(GUI)和便捷的操作環(huán)境是影響產(chǎn)品成敗的關(guān)鍵因素之一。如何充分利用成本低、資源少的單片機(jī)系統(tǒng)實(shí)現(xiàn)完善的人機(jī)交
    發(fā)表于 09-05 06:12

    基于嵌入式系統(tǒng)的LCD人機(jī)交互菜單該怎么設(shè)計(jì)?

    近年來(lái),LCD顯示器的普及和微處理器向大容量的發(fā)展使嵌入式系統(tǒng)的人機(jī)交互功能得到了顯著的提高。在很多場(chǎng)合下,良好的圖形用戶界面(GUI)和便捷的操作環(huán)境是影響產(chǎn)品成敗的關(guān)鍵因素之一。如何充分利用成本低、資源少的單片機(jī)系統(tǒng)實(shí)現(xiàn)完善的人機(jī)交
    發(fā)表于 09-25 06:31

    基于單片機(jī)和FPGA的人機(jī)交互系統(tǒng)該怎么設(shè)計(jì)?

    在現(xiàn)代各類儀器的開發(fā)中,人機(jī)交互功能正起著無(wú)可替代的作用。人機(jī)交互界面友好的儀器將更容易操作和使用,從而提高工作效率。液晶顯示器(LCD)具有功耗低、價(jià)格低、壽命長(zhǎng)、接口控制方便等特點(diǎn),在科研
    發(fā)表于 10-21 07:48

    嵌入式系統(tǒng)的人機(jī)交互技術(shù)怎么優(yōu)化?

    近年來(lái),LCD顯示器的普及和微處理器向大容量的發(fā)展使嵌入式系統(tǒng)的人機(jī)交互功能得到了顯著的提高。在很多場(chǎng)合下,良好的圖形用戶界面(GUI)和便捷的操作環(huán)境是影響產(chǎn)品成敗的關(guān)鍵因素之一。如何充分利用成本低、資源少的單片機(jī)系統(tǒng)實(shí)現(xiàn)完善的人機(jī)交
    發(fā)表于 04-07 06:05

    怎樣通過USART串口來(lái)實(shí)現(xiàn)單片機(jī)簡(jiǎn)單的人機(jī)交互功能呢

    怎樣通過USART串口來(lái)實(shí)現(xiàn)單片機(jī)簡(jiǎn)單的人機(jī)交互功能呢?有什么解決辦法嗎?
    發(fā)表于 12-09 07:42

    基于單片機(jī)和FPGA的人機(jī)交互系統(tǒng)的設(shè)計(jì)

    在儀器儀表電路中,人機(jī)交互界面是必不可少的環(huán)節(jié)。為了解決單純采用單片機(jī)制作的系統(tǒng)功耗高、速度慢、電路結(jié)構(gòu)繁瑣的問題,同時(shí)為了發(fā)揮出單片機(jī)的靈活性和FPGA的高速性,
    發(fā)表于 11-25 17:14 ?53次下載
    基于<b class='flag-5'>單片機(jī)</b>和FPGA的<b class='flag-5'>人機(jī)交互</b>系統(tǒng)的設(shè)計(jì)

    智能配電監(jiān)控系統(tǒng)人機(jī)交互方案

    研究設(shè)計(jì)了相應(yīng)的硬件電路與顯示驅(qū)動(dòng)程序,在此基礎(chǔ)上完成了人機(jī)交互系統(tǒng)的設(shè)計(jì)。充分利用成本低、資源少的單片機(jī)系統(tǒng)實(shí)現(xiàn)完善的人機(jī)交互功能。
    發(fā)表于 12-15 17:12 ?32次下載
    智能配電監(jiān)控系統(tǒng)<b class='flag-5'>人機(jī)交互</b>方案

    51單片機(jī)矩陣按鍵

    51單片機(jī)矩陣按鍵,根據(jù)按鍵數(shù)在數(shù)碼管上顯示。
    發(fā)表于 05-09 10:59 ?5次下載

    基于STC12單片機(jī)的智能點(diǎn)菜機(jī)人機(jī)交互設(shè)計(jì)

    本文主要介紹了基于STC12單片機(jī)的智能點(diǎn)菜機(jī)人機(jī)交互設(shè)計(jì),智能點(diǎn)菜系統(tǒng)采用現(xiàn)在流行的TFT液晶顯示技術(shù)和電阻式觸摸屏技術(shù)完成顧客與點(diǎn)菜機(jī)器的信息交互,SD卡中存儲(chǔ)要顯示的圖片信息。
    發(fā)表于 12-21 19:25 ?2828次閱讀
    基于STC12<b class='flag-5'>單片機(jī)</b>的智能點(diǎn)菜<b class='flag-5'>機(jī)</b>的<b class='flag-5'>人機(jī)交互</b>設(shè)計(jì)

    PIC單片機(jī)矩陣按鍵運(yùn)用程序下載

    PIC單片機(jī)矩陣按鍵運(yùn)用程序下載
    發(fā)表于 10-18 09:27 ?0次下載

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

    按鍵,每個(gè)按鍵對(duì)應(yīng)一個(gè)IO口,通過循環(huán)或者中斷去檢測(cè),這種方法常用于按鍵個(gè)數(shù)較少得時(shí)候。如果按鍵的個(gè)數(shù)較多,每個(gè)按鍵都分配一個(gè)IO口,會(huì)占用
    發(fā)表于 11-12 11:06 ?15次下載
    51<b class='flag-5'>單片機(jī)</b><b class='flag-5'>按鍵</b>檢測(cè)--獨(dú)立<b class='flag-5'>按鍵</b>與<b class='flag-5'>矩陣</b>鍵盤

    PIC單片機(jī) 按鍵檢測(cè)識(shí)別

    目錄按鍵和PIC單片機(jī)一、按鍵二、按鍵的物理連接與檢測(cè)三、PIC16F18854單片機(jī)按鍵檢測(cè)及
    發(fā)表于 11-16 12:36 ?12次下載
    PIC<b class='flag-5'>單片機(jī)</b> <b class='flag-5'>按鍵</b>檢測(cè)識(shí)別

    單片機(jī)編輯庫(kù)四矩陣按鍵

    單片機(jī)編輯庫(kù)一延時(shí)與led燈單片機(jī)編輯庫(kù)二按鍵單片機(jī)編輯庫(kù)三
    發(fā)表于 12-31 19:37 ?12次下載
    <b class='flag-5'>單片機(jī)</b>編輯庫(kù)四<b class='flag-5'>之</b><b class='flag-5'>矩陣</b><b class='flag-5'>按鍵</b>

    單片機(jī)學(xué)習(xí)-矩陣按鍵

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