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

3.17 數碼管顯示4×4鍵盤矩陣按鍵

本例在識別鍵盤矩陣按鍵時,使用了不同的掃描程序代碼,程序運行時數碼管會顯示相應按鍵的鍵值0~F。

本例電路如圖3-14所示。

程序設計調試與實訓:

讀者要注意本例中P1端口低4位連接的是列線,高4位連接的是行線。

本例中鍵盤矩陣按鍵掃描思想與上一案例類似,但使用的代碼有較大變化,而且沒有再使用查表法得到按鍵序號,代碼細節讀者可以自行剖析。

圖3-14 數碼管顯示4×4鍵盤矩陣按鍵電路

讀者可在上一案例的鍵盤布局下重新修改本例掃描代碼,實現按鍵識別功能。

另外,在本例及上一案例關于鍵盤矩陣單按鍵掃描的基礎上,讀者可修改代碼,實現對多按鍵的判斷(同時有2~3個按鍵按下)。在測試時,如果希望按鍵按下后不釋放,然后再繼續按第2個或第3個按鍵,這時不能用鼠標單擊按鍵,而應單擊按鍵旁邊的上下箭頭。

源程序代碼:

        //-----------------------------------------------------------------
        //  名稱: 數碼管顯示4×4 鍵盤矩陣按鍵序號
        //-----------------------------------------------------------------
        //  說明: 按下任意一按鍵時,數碼管會顯示它在鍵盤矩陣上的序號0~ F,
        //       掃描程序首先判斷按鍵發生在哪一列,然后根據所發生的行附加
        //       不同的值,從而得到鍵盤按鍵序號。
        //-----------------------------------------------------------------
        #include <reg51.h>
        #define uchar unsigned char
        #define uint  unsigned int
        //0~9,A~F的數碼管段碼,最后一個是黑屏
        uchar code DSY_CODE[]=
        { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
          0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00
        };
        sbit  BEEP = P3^7;
        //上次按鍵和當前按鍵序號,該矩陣中序號范圍為0~15,16表示無按鍵
        uchar Pre_KeyNo = 16, KeyNo = 16 ;
        //-----------------------------------------------------------------
        // 延時
        //-----------------------------------------------------------------
        void DelayMS(uint ms)
        {
            uchar t;
            while(ms--)  for(t = 0; t < 120; t++);
        }
        //-----------------------------------------------------------------
        // 鍵盤矩陣掃描
        //-----------------------------------------------------------------
        void Keys_Scan()
        {
            uchar Tmp;
            //高4位置1,放入4行
            P1 = 0x0F;
            DelayMS(1);
            //按鍵后00001111將變成0000XXXX,X中有1個為0,3個仍為1
            //下面的異或操作會把3個1變成0,唯一的0變成1
            Tmp = P1 ^ 0x0F;
            //判斷按鍵發生于0~3列中的哪一列
            switch (Tmp)
            {
              case 1: KeyNo = 0; break;
              case 2: KeyNo = 1; break;
              case 4: KeyNo = 2; break;
              case 8: KeyNo = 3; break;
              default:   KeyNo = 16;  //無鍵按下
            }
            //低4位置0,放入4列
            P1 = 0xF0;
            DelayMS(1);
            //按鍵后11110000將變成XXXX0000,X中有1個為0,3個仍為1
            //下面的表達式會將高4位移到低4位,并將其中唯一的0變為1,其余為0
            Tmp = P1 >> 4 ^ 0x0F;
            //對0~3行分別附加起始值0,4,8,12
            switch (Tmp)
            {
              case 1: KeyNo += 0; break;
              case 2: KeyNo += 4; break;
              case 4: KeyNo += 8; break;
              case 8: KeyNo += 12;
            }
        }
        //-----------------------------------------------------------------
        // 蜂鳴器
        //-----------------------------------------------------------------
        void Beep()
        {
          uchar i;
          for (i = 0; i < 100; i++)
          {
            DelayMS(1);
            BEEP = ~BEEP;
          }
          BEEP = 1;
        }
        //-----------------------------------------------------------------
        // 主程序
        //-----------------------------------------------------------------
        void main()
        {
          P0 = 0x00;
          while(1)
          {
              P1 = 0xF0;
              if(P1 != 0xF0) Keys_Scan();    //掃描鍵盤獲取按鍵序號KeyNo
              if (Pre_KeyNo != KeyNo)
              {
                P0 = ~DSY_CODE[KeyNo];       //顯示(用~作共陰共陽轉換)
                Beep();
                Pre_KeyNo = KeyNo;
              }
              DelayMS(100);
          }
        }
主站蜘蛛池模板: 都匀市| 嘉义县| 泰兴市| 封丘县| 天等县| 贵南县| 穆棱市| 浪卡子县| 苏尼特右旗| 五常市| 会泽县| 平谷区| 大余县| 武清区| 孝感市| 湖北省| 渭南市| 深泽县| 石嘴山市| 洛南县| 汪清县| 开鲁县| 祁门县| 临武县| 远安县| 赤水市| 沅陵县| 获嘉县| 揭东县| 安丘市| 宣威市| 达日县| 武安市| 三原县| 黎城县| 晋州市| 淮阳县| 慈溪市| 新疆| 静海县| 衡水市|