官术网_书友最值得收藏!

5.1 4×4掃描鍵盤設計實例

鍵盤是大家非常熟悉而且經常用到的部分,在大部分的單片機系統中都存在鍵盤,因為鍵盤是最實用、最簡單的一種輸入設備,是用于控制整個系統的主要工具。

5.1.1 實例說明

本節將詳細介紹4×4掃描式鍵盤的電路設計和程序編寫,通過本實例,讀者將了解4×4掃描鍵盤的結構和工作原理;熟悉PIC單片機I/O口的應用方法;掌握鍵盤掃描程序的編寫及其注意事項。

5.1.2 鍵盤知識介紹

4×4掃描鍵盤本身的電路結構如圖5-1所示。這種鍵盤通常稱為行列式鍵盤,由橫豎兩排線路組成,在每個行與列的交叉點有一個按鍵,當鍵盤按下時就將相互交叉的兩條線路導通。其中電阻R1~R4是上拉電阻,JP5是連接鍵盤的插座。

圖5-1 連接鍵盤部分的電路

鍵盤原理雖然看上去比較簡單,但是在編程時仍需要注意以下兩個問題。

(1)要能不斷地掃描鍵盤并判斷是否有鍵按下

判斷的方法為:首先控制單片機向行或列的4個引腳輸出高電平,然后再讀取其余4個引腳的電平。如果此時其中一個鍵被按下則其對應的引腳應為高電平,否則為低電平。例如:在圖5-2中,當向RB0~RB7引腳輸出高電平時按下鍵1,那么引腳RB3(37)即與引腳RB4(36)導通,因為RB3(37)引腳輸出了高電平,所以RB4(36)引腳也是高電平。

圖5-2 RB4(36)引腳也是高電平

(2)要消除鍵盤抖動的問題

因為在實際應用中鍵盤上的電壓有時會出現瞬間的電平波動而并非有鍵按下,所以在程序中需要使用一定的方法消除抖動的影響。

通常采用的消除抖動的方法是“判斷延時再判斷”的方法,即當檢測到有某個按鍵按下時不是立刻斷定此鍵已經按下,而是延時一段時間后再次判斷此鍵是否處于按下狀態,若是即認定此鍵已經按下,否則即認為是抖動現象而非鍵盤按下。這其中延時的時間是個重點,既不能太短也不能過長,延時時間太短起不到消除抖動的效果,而如果延時超過了鍵被按下的時間則不能判斷出鍵被按下。具體的延時長短要根據實際情況確定。

5.1.3 硬件電路設計

4×4掃描鍵盤的電路原理圖如圖5-3所示。電路連接較簡單,主要是單片機部分的復位和晶振電路。

圖5-3 單片機部分的復位和晶振電路圖

5.1.4 軟件設計

1.程序流程介紹

程序流程圖如圖5-4所示,基本流程描述如下:

圖5-4 程序流程圖

首先初始化單片機,并將RB0~RB3口設置為輸出,將RB4~RB7口設置為輸入。然后開始執行掃描程序,輪流向RB0~RB3口輸出高電平,并在每次輸出后讀取RB4~RB7口的值。對讀取的值進行判斷,若值為0,則表示沒有鍵被按下,繼續掃描;若某一位的值不為0,則在短暫延時后再次讀取RB4~RB7口的值,若此時值變為0,則認為是抖動現象,繼續進行掃描;若此時值仍然不為0,則根據值判斷出是哪個按鍵被按下,并將結果發送,然后繼續回到掃描程序。

2.程序代碼與注釋

相應程序代碼與注釋如下:

      /*********************************************
      example program for PIC download board
      16F877A @ 4MHz
      *********************************************/
      //#include  <pic.h>
      //#include  <pic1687x.h>
      #include "usart.h"
      void DELAY1(int time);
      unsigned char keyboard(unsigned char x);
      void main(void)
      {
          unsigned char  key,sendkey;
          init_comms();   // 初始化串口
          TRISB=0xf0;     //設置RB口的輸入輸出方向
          PORTB=0;        //清P2口
          while(1)
            {
            RB0=1;
            key=(PORTB&0xf0)>>4; //清低4位,只保留高4位的值,即保留RB4~RB7
            if(key!=0)
                  {
                      DELAY1(5);//延時125ms消抖
                      key=(PORTB&0xf0)>>4;
                      if(key!=0)
                      {
                          sendkey=keyboard(key);
                          putch(sendkey);
                                          }
                  }
            RB1=1;
      key=(PORTB&0xf0)>>4; //清低4位,只保留高4位的值,即保留RB4~RB7
                  if(key!=0)
                  {
                      DELAY1(5);//延時125ms消抖
                      key=(PORTB&0xf0)>>4;
                      if(key!=0)
                      {
                          sendkey=keyboard(key);
                          putch(sendkey+4);
                      }
                  }
            RB2=1;
            key=(PORTB&0xf0)>>4; //清低4位,只保留高4位的值,即保留RB4~RB7
                  if(key!=0)
                  {
                      DELAY1(5);//延時125ms消抖
                      key=(PORTB&0xf0)>>4;
                      if(key!=0)
                      {
                          sendkey=keyboard(key);
                          putch(sendkey+8);
                      }
                  }
            RB3=1;
            key=(PORTB&0xf0)>>4; //清低4位,只保留高4位的值,即保留RB4~RB7
                  if(key!=0)
                  {
                      DELAY1(5);//延時125ms消抖
                      key=(PORTB&0xf0)>>4;
                      if(key!=0)
                      {
                          sendkey=keyboard(key);
                          putch(sendkey+12);
                      }
                  }
            }
      }
      void DELAY1(int time)
      {
          int x,y;
          for(x=0;x<100;x++)
          {
            for(y=0;y<time;y++);
          }
      }
      unsigned char keyboard(unsigned char x)
      {
      unsigned char key;
      switch(x)
            {
                  case 1:
                          {   key=1;
                              break;
                          }
                      case 2:
                                  {   key=2;
                                      break;
                                  }
                      case 4:
                                  {   key=3;
                                      break;
                                  }
                      case 8:
                                  {
                                        key=4;
                                      break;
                                  }
                      default:    break;
      }
          return key;
      }

5.1.5 實例總結

鍵盤是單片機系統中經常使用的一個功能模塊,本節詳細介紹了最常用的4×4行列式鍵盤。讀者通過本節的學習將掌握以下幾個內容:

● 掌握行列式鍵盤的工作原理和電路設計方法。

● 熟悉軟件編寫的流程和需要注意的要點。

● 能根據具體情況和實際需要設計不同的鍵盤電路和軟件。

在實際設計中還要特別注意如下幾個要點:

● 鍵盤與單片機接口之間一定要添加合適的電阻,確保電路工作穩定。

● 編寫鍵盤掃描程序要合理加入延時消抖程序,防止對鍵盤按下與否的誤判斷。

● 這種掃描鍵盤的方式適合程序不太復雜且系統空閑時間較多的情況,若系統較復雜且空閑時間較少,則可采用中斷的方式。

主站蜘蛛池模板: 昌宁县| 上林县| 连云港市| 赤城县| 深水埗区| 会同县| 泌阳县| 峡江县| 阜新市| 东乡族自治县| 扶沟县| 南华县| 南岸区| 黔西县| 定南县| 安远县| 大荔县| 青铜峡市| 萍乡市| 中山市| 成都市| 金乡县| 建德市| 永登县| 东阿县| 甘南县| 嘉义县| 博乐市| 察雅县| 正阳县| 翁牛特旗| 乾安县| 乳山市| 都匀市| 威海市| 青浦区| 六枝特区| 读书| 连州市| 蓬溪县| 庆阳市|