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

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

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

單片機人機交互之矩陣按鍵

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

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

一、按鍵講解

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

圖片

二、按鍵消抖

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

圖片

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

硬件消抖方法

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

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

圖片

2.電容濾波

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

圖片

三、獨立按鍵

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

圖片

四、矩陣按鍵

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

圖片

(1)列掃描方式

所有行線都輸出高電平,列線依次輸出低電平;查詢該列上行的值,若為0,則說明該行上的按鍵被按下;若該列上所有行的值都為1,則進行下一列行值的查詢;循環(huán)往復。

圖片

(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)
//功能:利用定時器0精確定時1ms;自加 time_t的值為后面時間調(diào)整函數(shù)服務
//調(diào)用函數(shù):
//輸入參數(shù):x,1ms計數(shù)
//輸出參數(shù):
//說明:延時的時間為1ms乘以x
/********************************************************************/
void delay_1ms(uint x)
{
  TMOD=0X01;//開定時器0,工作方式為1
  TR0=1;//啟動定時器0;
  while(x--)
  {
    TH0=0Xfc;//定時1ms初值的高8位裝入TH0
    TL0=0X18;//定時1ms初值的低8位裝入TL0
    while(!TF0);//等待,直到TF0為1
    TF0=0;
  }    
  TR0=0;//停止定時器0;
}

/**********************************************************/
//函數(shù)名:keyscan()
//功能:得出4x4鍵盤的行列掃描值
//調(diào)用函數(shù):delay_1ms(uint x)
//輸入?yún)?shù):
//輸出參數(shù):
//說明:通過P1口的掃描得出掃描值key,無鍵按下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,可能有鍵按下(為準確識別按鍵動作)
  {
      delay_1ms(5);  //廷時去抖動,為準確識別按鍵動作
      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));//鍵盤編碼=行掃描值+列掃描值 (取反后用,相當于改為按下按鍵對應的行、列標識為1,其它為0)         
             }
             else                           //左移后補0,但是我們需要將其他位置1,所以+1
               code_h=(code_h<<1)|0x01;  //若該行無鍵按下,行掃描值左移+1,掃描下一行 
           }
       }
   }
  return(16);   //無鍵按下,返回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鍵盤各鍵值標注
    key=16;
    key = keyscan();//引入key值
    if((key&0x01)!=0) i=0;  //判斷出按下按鍵的行列號 (即找出低電平的行、列)
    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;//獲得個位
       if(shi)
       {
         P2 = 0x10|ge;
       }
       else
       {
          P2 = ge;
       }
     }
     delay_1ms(10);//延時
  }
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 按鍵
    +關(guān)注

    關(guān)注

    4

    文章

    223

    瀏覽量

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

    關(guān)注

    1

    文章

    50

    瀏覽量

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

    關(guān)注

    0

    文章

    33

    瀏覽量

    4562
收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

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

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

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

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

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

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

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

    怎樣通過USART串口來實現(xiàn)單片機簡單的人機交互功能呢

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

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

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

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

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

    51單片機矩陣按鍵

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

    基于STC12單片機的智能點菜人機交互設計

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

    PIC單片機矩陣按鍵運用程序下載

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

    51單片機按鍵檢測--獨立按鍵矩陣鍵盤

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

    PIC單片機 按鍵檢測識別

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

    單片機編輯庫四矩陣按鍵

    單片機編輯庫一延時與led燈單片機編輯庫二按鍵單片機編輯庫三
    發(fā)表于 12-31 19:37 ?12次下載
    <b class='flag-5'>單片機</b>編輯庫四<b class='flag-5'>之</b><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><b class='flag-5'>按鍵</b>