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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > AVR單片機矩陣鍵盤程序(2種方法)

          AVR單片機矩陣鍵盤程序(2種方法)

          作者: 時間:2016-11-29 來源:網(wǎng)絡 收藏
          AVR矩陣鍵盤2種方法實現(xiàn)!

          普通方法:

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

          #include//
          #include//
          #define uchar unsigned char//
          #define uint unsigned int//
          #define setb(val,bitn) (val|=(1<<(bitn)))//設置某IO口某位為1
          #define clr(val,bitn) (val&=~(1<<(bitn)))//設置某IO口某位為0
          #define get(val,bitn) (val&(1<<(bitn)))//讀取某位狀態(tài)如if(get(PORTC,7))即判斷PC7口是否為1
          #pragma data:code//數(shù)組存放位置
          const table[]={
          0xc0,0xf9,0xa4,0xb0,0x99,
          0x92,0x82,0xf8,0x80,0x90,
          0x88,0x83,0xc6,0xa1,0x86,
          0x8e
          };//共陽數(shù)碼管0--9代碼
          ucharnum,yin,temp;//鍵值碼及識別碼
          voiddelay(uchar);//延時函數(shù)
          void disy();//顯示函數(shù)
          void skk()
          {
          for(yin=0;yin<2;yin++)
          {
          PORTD=0xfe;//將第一行置0,即檢測第一行
          temp=PIND;//將值給tem
          temp=temp&0xf0;//與0xf0與門一下,
          while(temp!=0xf0)//判斷是否為0xf0
          {
          delay(10);//延時
          temp=PIND;//將P1值再給tem
          temp=temp&0xf0;//將值再與門
          while(temp!=0xf0)//再次判斷是否為0xf0
          {
          temp=PIND;//確實按下了,將tem值裝回,以便下次判斷開關語句,否則沒有它對應的值,如原來是ee,如果再按下是第二個鍵就不是de了
          switch(temp)//開關語句
          {
          case 0xee:num=0;//與num值比較是否相等,如果相等就退出switch語句
          break;//退出switch語句
          case 0xde:num=1;//與num值比較是否相等,如果相等就退出switch語句
          break;//退出switch語句
          case 0xbe:num=2;//與num值比較是否相等,如果相等就退出switch語句
          break;//退出switch語句
          case 0x7e:num=3;//與num值比較是否相等,如果相等就退出switch語句
          break;//退出switch語句
          }
          while(temp!=0xf0)//松手判斷,以便退出以上兩個while
          {
          temp=PIND;//給temp賦值
          temp=temp&0xf0;//與門一下
          }
          }
          }
          }

          for(yin=0;yin<2;yin++)
          {
          PORTD=0xfd;//將第一行置0,即檢測第一行
          temp=PIND;//將值給tem
          temp=temp&0xf0;//與0xf0與門一下,
          while(temp!=0xf0)//判斷是否為0xf0
          {
          delay(10);//延時
          temp=PIND;//將P1值再給tem
          temp=temp&0xf0;//將值再與門
          while(temp!=0xf0)//再次判斷是否為0xf0
          {
          temp=PIND;//確實按下了,將tem值裝回,以便下次判斷開關語句,否則沒有它對應的值,如原來是ee,如果再按下是第二個鍵就不是de了
          switch(temp)//開關語句
          {
          case 0xed:num=4;//與num值比較是否相等,如果相等就退出switch語句
          break;//退出switch語句
          case 0xdd:num=5;//與num值比較是否相等,如果相等就退出switch語句
          break;//退出switch語句
          case 0xbd:num=6;//與num值比較是否相等,如果相等就退出switch語句
          break;//退出switch語句
          case 0x7d:num=7;//與num值比較是否相等,如果相等就退出switch語句
          break;//退出switch語句
          }
          while(temp!=0xf0)//松手判斷,以便退出以上兩個while
          {
          temp=PIND;//給temp賦值
          temp=temp&0xf0;//與門一下
          }
          }
          }
          }
          for(yin=0;yin<2;yin++)
          {
          PORTD=0xfb;//將第一行置0,即檢測第一行
          temp=PIND;//將值給tem
          temp=temp&0xf0;//與0xf0與門一下,
          while(temp!=0xf0)//判斷是否為0xf0
          {
          delay(10);//延時
          temp=PIND;//將P1值再給tem
          temp=temp&0xf0;//將值再與門
          while(temp!=0xf0)//再次判斷是否為0xf0
          {
          temp=PIND;//確實按下了,將tem值裝回,以便下次判斷開關語句,否則沒有它對應的值,如原來是ee,如果再按下是第二個鍵就不是de了
          switch(temp)//開關語句
          {
          case 0xeb:num=8;//與num值比較是否相等,如果相等就退出switch語句
          break;//退出switch語句
          case 0xdb:num=9;//與num值比較是否相等,如果相等就退出switch語句
          break;//退出switch語句
          case 0xbb:num=10;//與num值比較是否相等,如果相等就退出switch語句
          break;//退出switch語句
          case 0x7b:num=11;//與num值比較是否相等,如果相等就退出switch語句
          break;//退出switch語句
          }
          while(temp!=0xf0)//松手判斷,以便退出以上兩個while
          {
          temp=PIND;//給temp賦值
          temp=temp&0xf0;//與門一下
          }
          }
          }
          }
          for(yin=0;yin<2;yin++)
          {
          PORTD=0xf7;//將第一行置0,即檢測第一行
          temp=PIND;//將值給tem
          temp=temp&0xf0;//與0xf0與門一下,
          while(temp!=0xf0)//判斷是否為0xf0
          {
          delay(10);//延時
          temp=PIND;//將P1值再給tem
          temp=temp&0xf0;//將值再與門
          while(temp!=0xf0)//再次判斷是否為0xf0
          {
          temp=PIND;//確實按下了,將tem值裝回,以便下次判斷開關語句,否則沒有它對應的值,如原來是ee,如果再按下是第二個鍵就不是de了
          switch(temp)//開關語句
          {
          case 0xe7:num=12;//與num值比較是否相等,如果相等就退出switch語句
          break;//退出switch語句
          case 0xd7:num=13;//與num值比較是否相等,如果相等就退出switch語句
          break;//退出switch語句
          case 0xb7:num=14;//與num值比較是否相等,如果相等就退出switch語句
          break;//退出switch語句
          case 0x77:num=15;//與num值比較是否相等,如果相等就退出switch語句
          break;//退出switch語句
          }
          while(temp!=0xf0)//松手判斷,以便退出以上兩個while
          {
          temp=PIND;//給temp賦值
          temp=temp&0xf0;//與門一下
          }
          }
          }

          }
          }


          上一頁 1 2 下一頁

          關鍵詞: AVR單片機矩陣鍵

          評論


          技術專區(qū)

          關閉
          看屁屁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); })();