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

          新聞中心

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

          51單片機(jī) 4*4矩陣鍵盤 掃描方式

          作者: 時(shí)間:2016-11-25 來源:網(wǎng)絡(luò) 收藏
          實(shí)際工程應(yīng)用中,遇到按鍵比較多的情況,大多是使用矩陣鍵盤或者編碼鍵盤。處于成本考慮,一般使用矩陣鍵盤。

          以下是矩陣鍵盤部分原理圖:

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



          代碼如下:

          #include
          #define uint unsigned int
          #define uchar unsigned char
          sbit duanxuan=P2^6;
          sbit pianxuan=P2^7;

          uchar code table[]={
          0x3f,0x06,0x5b,0x4f,
          0x66,0x6d,0x7d,0x07,
          0x7f,0x6f,0x77,0x7c,
          0x39,0x5e,0x79,0x71}; //編碼定義

          void delay_xs(uint);//延時(shí)函數(shù)聲明
          void display(uint);//顯示函數(shù)聲明(只是負(fù)責(zé)送段選信號(hào))
          void keyscan();//鍵盤掃描函數(shù)聲明

          void main()
          {
          //數(shù)碼管位選端初始化
          duanxuan=1;
          P0=0x40;
          duanxuan=0;
          P0=0xff;
          pianxuan=1;
          P0=0xc0;
          pianxuan=0;
          //主體部分
          while(1)
          {
          keyscan();
          }
          }
          //延時(shí)函數(shù)主體
          void delay_xs(uint xs)
          {
          uint i,j;
          for(i=xs;i>0;i--)
          {
          for(j=110;j>0;j--)
          {
          }
          }
          }
          //顯示函數(shù)主體
          void display( uint key)
          {
          duanxuan=1;
          P0=table[key];
          duanxuan=0;
          }
          //鍵盤掃描函數(shù)主體
          void keyscan()
          {
          uint buffer,key;
          //掃描第一行
          P0=0xfe; //1111 1110賦值給P3,此時(shí)鍵盤第一行全為0
          buffer=P3;
          buffer=buffer&0xf0; //1111 1110 & 1111 0000=1111 0000如果有按鍵按下,1111 1110的高四位必定出現(xiàn)0,此時(shí)按位與的結(jié)果不再是1111 0000
          if(buffer!=0xf0) //不等于1111 0000 說明有鍵被按下
          {
          delay_xs(10); //延時(shí)10us,防止抖動(dòng)
          buffer=P3; //此時(shí)的buffer=buffer&1111 0000,不是P3,所以要重新賦值,為延時(shí)之后再判斷做準(zhǔn)備
          buffer=buffer&0xf0;
          if(buffer!=0xf0) //依然按下
          {
          buffer=P3;//再一次賦值
          switch(buffer)//判斷第一行哪一個(gè)按鍵被按下
          {
          case 0xee: //如果是第一個(gè)按鍵被按下,buffer(P3)的值將是1110 1110
          key=0;
          break;
          case 0xde:
          key=1;
          break;
          case 0xbe:
          key=2;
          break;
          case 0x7e:
          key=3;
          break;
          }
          while(buffer!=0xf0) //buffer不等于1111 0000,說明按鍵沒有還是被按下
          {
          buffer=P3;
          buffer=buffer&0xf0;
          }
          display(key);//送段選信號(hào)
          }

          }
          //掃描第二行
          P3=0xfd;
          buffer=P3;
          buffer=buffer&0xf0;
          if(buffer!=0xf0)
          {
          delay_xs(10);
          buffer=P3;
          buffer=buffer&0xf0;
          if(buffer!=0xf0)
          {
          buffer=P3;
          switch(buffer)
          {
          case 0xed:
          key=4;
          break;
          case 0xdd:
          key=5;
          break;
          case 0xbd:
          key=6;
          break;
          case 0x7d:
          key=7;
          break;
          }
          while(buffer!=0xf0)
          {
          buffer=P3;
          buffer=buffer&0xf0;
          }
          display(key);
          }
          }
          //掃描第三行
          P3=0xfb;
          buffer=P3;
          buffer=buffer&0xf0;
          if(buffer!=0xf0)
          {
          delay_xs(10);
          buffer=P3;
          buffer=buffer&0xf0;
          if(buffer!=0xf0)
          {
          buffer=P3;
          switch(buffer)
          {
          case 0xeb:
          key=8;
          break;
          case 0xdb:
          key=9;
          break;
          case 0xbb:
          key=10;
          break;
          case 0x7b:
          key=11;
          break;
          }
          while(buffer!=0xf0)
          {
          buffer=P3;
          buffer=buffer&0xf0;
          }
          display(key);
          }
          }
          //掃描第四行
          P3=0xf7;
          buffer=P3;
          buffer=buffer&0xf0;
          if(buffer!=0xf0)
          {
          delay_xs(10);
          buffer=P3;
          buffer=buffer&0xf0;
          if(buffer!=0xf0)
          {
          buffer=P3;
          switch(buffer)
          {
          case 0xe7:
          key=12;
          break;
          case 0xd7:
          key=13;
          break;
          case 0xb7:
          key=14;
          break;
          case 0x77:
          key=15;
          break;
          }
          while(buffer!=0xf0)
          {
          buffer=P3;
          buffer=buffer&0xf0;
          }
          display(key);
          }
          }
          }


          以上,結(jié)束。



          評(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); })();