<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī) 4*4 矩陣鍵盤應(yīng)用

          單片機(jī) 4*4 矩陣鍵盤應(yīng)用

          作者: 時(shí)間:2016-11-26 來源:網(wǎng)絡(luò) 收藏
          單片機(jī)按鍵使用過程中,當(dāng)鍵盤中按鍵數(shù)量較多時(shí) 為了減少端口的占用通常將按鍵排列成矩陣 形式如下圖所示,在矩陣式鍵盤中 每條水平線和垂直線在交叉處不直接連通而是通過一個(gè)按鍵加以連接,到底這樣做是出意何種目的呢? 大家看下面電路圖,單片機(jī)的整一個(gè)8位端口可以構(gòu)成 4*4=16 個(gè)矩陣式按鍵 ,相比獨(dú)立式按鍵接法多出了一倍,而且線數(shù)越多區(qū)別就越明顯,假如再多加一條線就可以構(gòu)成 20個(gè)按鍵的鍵盤,但是獨(dú)立式按鍵接法只能多出1個(gè)按鍵。由此可見,在需要的按鍵數(shù)量比較多時(shí),采用矩陣法來連接鍵盤是非常合理的,矩陣式結(jié)構(gòu)的鍵盤顯然比獨(dú)立式鍵盤復(fù)雜一些,單片機(jī)對(duì)其進(jìn)行識(shí)別也要復(fù)雜一些。確定矩陣式鍵盤上任何一個(gè)鍵被按下通常采用行掃描法。行掃描法又稱為逐行查詢法它是一種最常用的多按鍵識(shí)別方法。因此,我們就以行掃描法為例介紹矩陣式鍵盤的工作原理。

          圖5-4(4*4矩陣式按鍵的接法)

          本文引用地址:http://www.ex-cimer.com/article/201611/321822.htm

          首先,不斷循環(huán)地給低四位獨(dú)立的低電平,然后判斷鍵盤中有無鍵按下。將低位中其中一列線(P1.0~P1.3中其中一列)置低電平然后檢測行線的狀態(tài)(高4位,即P1.4~P1.7,由于線與關(guān)系,只要與低電平列線接通,即跳變成低電平),只要有一行的電平為低就延時(shí)一段時(shí)間以消除抖動(dòng),然后再次判斷,假如依然為低電平,則表示鍵盤中真的有鍵被按下而且閉合的鍵位于低電平的4個(gè)按鍵之中任其一,若所有行線均為高電平則表示鍵盤中無鍵按下。再其次,判斷閉合鍵所在的具體位置。在確認(rèn)有鍵按下后 ,即可進(jìn)入確定具體閉合鍵的過程。其方法是: 依次將列線置為低電平,即在置某一根列線為低電平時(shí),其它列線為高電平。同時(shí)再逐行檢測各行線的電平狀態(tài) ;若某行為低 ,則該行線與置為低電平的列線交叉處的按鍵就是閉合的按鍵。下面圖5-5是4*4矩陣式按鍵接法的軟件算法操作流程。

          下面程序按照上述算法流程去編寫的,其電路如圖5-6,只是在圖5-5的基礎(chǔ)上多加了P0端口的8只LED燈。從鍵盤中檢測到一個(gè)鍵值,然后將這個(gè)值寫到LED數(shù)碼管上顯示。

          #include

          #include

          #define uchar unsigned char

          #define uint unsigned int

          uchar temp,num;

          uchar code Dis_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff} ;

          //0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,0ff

          void delay(uchar ms)

          {

          int i;

          while(ms--)

          {

          for(i=0;i<100;i++) ;

          }

          }

          uchar keyscan()

          {

          P1=0xfe;

          temp=P1;

          while(temp!=0xfe)

          {

          temp=P1;

          switch(temp)

          {

          case 0xee:num=1;

          break;

          case 0xde:num=2;

          break;

          case 0xbe:num=3;

          break;

          case 0x7e:num=4;

          break;

          }

          delay(100);

          }

          P1=0xfd;

          temp=P1;

          while(temp!=0xfd)

          {

          temp=P1;

          switch(temp)

          {

          case 0xed:num=5;

          break;

          case 0xdd:num=6;

          break;

          case 0xbd:num=7;

          break;

          case 0x7d:num=8;

          break;

          }

          delay(100);

          }

          P1=0xfb;

          temp=P1;

          while(temp!=0xfb)

          {

          temp=P1;

          switch(temp)

          {

          case 0xeb:num=9;

          break;

          case 0xdb:num=10;

          break;

          case 0xbb:num=11;

          break;

          case 0x7b:num=12;

          break;

          }

          delay(100);

          }

          P1=0xf7;

          temp=P1;

          while(temp!=0xf7)

          {

          temp=P1;

          switch(temp)

          {

          case 0xe7:num=13;

          break;

          case 0xd7:num=14;

          break;

          case 0xb7:num=15;

          break;

          case 0x77:num=16;

          break;

          }

          delay(100);

          }

          return num;

          }

          void Display(uchar Wei_8,uchar Wei_7,uchar Wei_6,uchar Wei_5,uchar Wei_4,uchar Wei_3,uchar Wei_2,uchar Wei_1)

          {

          P2=0xfe;

          P0=Dis_code[Wei_8];

          delay(1);

          P2=0xfd;

          P0=Dis_code[Wei_7];

          delay(1);

          P2=0xfb;

          P0=Dis_code[Wei_6];

          delay(1);

          P2=0xf7;

          P0=Dis_code[Wei_5];

          delay(1);

          P2=0xef;

          P0=Dis_code[Wei_4];

          delay(1);

          P2=0xdf;

          P0=Dis_code[Wei_3];

          delay(1);

          P2=0xbf;

          P0=Dis_code[Wei_2];

          delay(1);

          P2=0x7f;

          P0=Dis_code[Wei_1];

          delay(1);

          }

          void main()

          {

          while(1)

          {

          Display(keyscan(),16,16,16,16,16,16,16);

          }

          }



          關(guān)鍵詞: 單片機(jī)4*4矩陣鍵

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();