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

          新聞中心

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

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

          作者: 時(shí)間:2016-11-29 來(lái)源:網(wǎng)絡(luò) 收藏

          void main()
          {
          DDRD|=0xff;//設(shè)置PB口為輸出
          PORTD|=0xff;//PB輸出為高電位
          DDRD&=0x0f;//設(shè)置高
          while(1)//大循環(huán)
          {
          skk();
          disy();//調(diào)用顯示子程序
          }
          }
          void delay(uchar z)//延時(shí)子函數(shù)
          {
          uchar x,y;
          for(x=100;x>0;x--)
          for(y=z;y>0;y--);
          }
          void disy()//顯示子函數(shù)
          {
          DDRC=0xff;
          DDRB=0xff;
          PORTB=table[num];
          PORTC=0x00;
          }

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

          簡(jiǎn)單方法:

          #include
          #include
          #define uchar unsigned char
          #define uint unsigned int
          #pragma data:code//定義程序存在ROM里面
          const table[]={
          0xc0,0xf9,0xa4,0xb0,0x99,
          0x92,0x82,0xf8,0x80,0x90,
          0x88,0x83,0xc6,0xa1,0x86,
          0x8e,0xff
          };
          /***********************************************/
          /*******************延時(shí)子程序******************/
          /***********************************************/
          void delay(uchar z)
          {
          uchar x,y;
          for(x=0;x<50;x++)
          for(y=0;y}
          /***********************************************/
          /*******************顯示子程序******************/
          /***********************************************/
          void xian(uchar num)
          {
          uchar i;
          PORTB=table[num];//十位
          PORTC=0x00;
          }
          /***********************************************/
          /***************按鍵按下處理程序***************/
          /***********************************************/
          uchar key_press()
          {
          uchar i;
          DDRD=0XFF;//設(shè)置PD口全為輸出
          PORTD=0XF0;//設(shè)置PD高四位為高電平,以便進(jìn)行判斷
          DDRD=0X0F;//設(shè)置高4位為輸入,低4位為輸出
          i=PIND;//讀出IO口狀態(tài)
          if(i==0XF0)//如果它等于0XF0就執(zhí)返回0
          {
          DDRD=0XFF;//將IO口值讀回來(lái)
          return 0;
          }
          else//否則它就執(zhí)返回1
          {
          DDRD=0XFF;
          return 1;
          }
          }
          /***********************************************/
          /***************按鍵鍵值處理程序***************/
          /***********************************************/
          uchar key_scan()
          {
          uchar key,i=0X7F,j;//將變量I設(shè)置為01111111B
          if(key_press())//判斷按鍵是否被按下了
          {
          delay(10);//如果被按下了,消下抖
          if(key_press())//再次判斷下按鍵是否被按下了
          {
          do//先執(zhí)行一次
          {
          i=(i<<1|i>>7);/*將變量I內(nèi)容左移1位,11111110
          然后將I右移7位,11111110,即實(shí)現(xiàn)11111110
          11111101 11111011 11110111*/
          PORTD=i;//將移位后的值給PD口
          DDRD=0X0F;//將PD口高位設(shè)為輸入,低位設(shè)為輸出
          key=PIND;//將IO口高位值讀一下
          j=key&0XF0;//只需要讀高4位
          }
          while(j==0XF0);//如果按鍵沒(méi)有按下,則再執(zhí)行上面的do語(yǔ)句
          while(key_press());//如果有按下則釋放一下
          switch(key)//確定有按鍵按下了就判斷下到底是哪個(gè)值
          {
          case 0xEE:
          key=0x0;
          break;
          case 0xDE:
          key=0x1;
          break;
          case 0xBE:
          key=0x2;
          break;
          case 0x7E:
          key=0x3;
          break;
          case 0xED:
          key=0x4;
          break;
          case 0xDD:
          key=0x5;
          break;
          case 0xBD:
          key=0x6;
          break;
          case 0x7D:
          key=0x7;
          break;
          case 0xEB:
          key=8;
          break;
          case 0xDB:
          key=9;
          break;
          case 0xBB:
          key=0xA;
          break;
          case 0x7B:
          key=0xB;
          break;
          case 0xE7:
          key=0xC;
          break;
          case 0xD7:
          key=0xD;
          break;
          case 0xB7:
          key=0xE;
          break;
          case 0x77:
          key=0xF;
          break;
          }
          }
          }
          return key;//返回按鍵值
          }
          /***********************************************/
          /*******************主程序*********************/
          /***********************************************/
          void main()
          {
          uchar ik=16;//定義局部變量
          DDRB=0xff;//設(shè)置PB口為輸出
          DDRC=0xff;//設(shè)置PC口為輸出
          while(1)
          {
          ik=key_scan();//將按鍵返回值給變量IK
          if(ik<16)//如果返回值小于16就在數(shù)碼管上顯示出來(lái)
          xian(ik); //調(diào)用顯示子程序
          else//如果返回值不小于16,就顯示黑屏
          xian(16);
          }
          }


          上一頁(yè) 1 2 下一頁(yè)

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

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