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

          新聞中心

          msp430矩陣式4*4鍵盤

          作者: 時(shí)間:2016-11-23 來源:網(wǎng)絡(luò) 收藏
          msp430單片機(jī)矩陣式4*4鍵盤接口技術(shù)及程序設(shè)計(jì)
          V5v



          上圖中,列線通過電阻接正電源,并將行線所接的單片機(jī)的I/O口作為輸出端,而列線所接的I/O口則作為輸入。這樣,當(dāng)按鈕沒有按下時(shí),所有的輸出端都是高電平,代表無鍵按下。行線輸出是低電平,一旦有鍵按下,則輸入線就會(huì)被拉低,這樣,通過讀入輸入線的狀態(tài)就可得知是否有鍵按下了。
          矩陣式鍵盤的按鈕識(shí)別辦法——“行掃描法”。
          行掃描法行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鈕識(shí)別辦法。
          判斷鍵盤中有無鍵按下將全部行線Y0-Y3置低電平,然后檢測列線的狀態(tài)。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個(gè)按鈕之中。若所有列線均為高電平,則鍵盤中無鍵按下。
          判斷閉合鍵所在的位置在確認(rèn)有鍵按下后,即可進(jìn)入確定具體閉合鍵的過程。其辦法是:依次將行線置為低電平,即在置某根行線為低電平時(shí),其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態(tài)。若某列為低,則該列線與置為低電平的行線交叉處的按鈕就是閉合的按鈕。
          例如:圖仍如上所示。430單片機(jī)的P1口用作鍵盤I/O口,鍵盤的列線接到P1口的低4位,鍵盤的行線接到P1口的高4位。列線P1.0-P1.3分別接有4個(gè)上拉電阻到正電源5V,并把列線P1.0-P1.3設(shè)置為輸入線,行線P1.4-P.17設(shè)置為輸出線。4根行線和4根列線形成16個(gè)相交點(diǎn)。
          檢測當(dāng)前是否有鍵被按下。檢測的辦法是P1.4-P1.7輸出全“0”,讀取P1.0-P1.3的狀態(tài),若P1.0-P1.3為全“1”,則無鍵閉合,不然有鍵閉合。
          去除鍵抖動(dòng)。當(dāng)檢測到有鍵按下后,延時(shí)一段時(shí)間再做下一步的檢測判斷(以防是干擾)。
          若有鍵被按下,應(yīng)識(shí)別出是哪一個(gè)鍵閉合。辦法是對(duì)鍵盤的行線進(jìn)行掃描。P1.4-P1.7按下述4種組合依次輸出:
          P1.71110P1.61101P1.51011P1.40111
          在每組行輸出時(shí)讀取P1.0-P1.3,若全為“1”,則表示為“0”這一行沒有鍵閉合,不然有鍵閉合。由此得到閉合鍵的行值和列值,然后可采用計(jì)算法或查表法將閉合鍵的行值和列值轉(zhuǎn)換成所定義的鍵值

          鍵盤掃描程序如下:
          #include
          charkey;
          manage_key1()
          {}
          .................
          .................
          manage_key16()
          {}
          voiddelays()
          {
          intv=500;
          while(v!=0)v--;
          }
          voidkeyscan()
          {
          charsccode,recode;
          P1DIR=0X0f;

          P1OUT=0X00;//置所有行為低電平,行掃描,列線輸入(此時(shí))
          if((P1IN&0X0F)!=0X0F)//判斷是否有有鍵按下(讀取列的真實(shí)狀態(tài),若第4列有鍵按下則P1的值會(huì)變成01110000),有往下執(zhí)行
          {
          delays();
          if((P1IN&0x0f)!=0x0f)//再次判斷列中是否是干擾信號(hào),不是則向下執(zhí)行
          {
          sccode=0xef;//逐行掃描初值(即先掃描第1行)
          while((sccode&0x01)!=0)//行掃描完成(4行已全部掃描完)sccode為11101111停止while程序
          {
          P1OUT=sccode;//輸出行掃描碼
          if((P1IN&0x0F)!=0X0F)//本行有鍵按下(即P1(真實(shí)的狀態(tài))的高四位不全為1)
          {
          recode=(P1IN&0x0F)|0xf0;//列(列處于低四位,高四位補(bǔ)1)
          key=(sccode&recode);//行和列
          }
          //所掃描行沒有鍵按下,則掃描下一行,直到4行都掃描,此時(shí)sccode為11101111退出while程序
          else
          {
          sccode=(sccode<<1)|0x10;;//行掃描碼左移一位
          }
          }
          }
          //無鍵按下,返回0
          }
          }
          voidmain()
          {
          keyscan();
          delays();
          switch(key)
          {
          case0xee:manage_key1();break;//11101110
          case0xde:manage_key2();break;//11011110
          case0xbe:manage_key3();break;//10111110
          case0x7e:manage_key4();break;//01111110

          case0xed:manage_key5();break;//11101101
          case0xdd:manage_key6();break;//11011101
          case0xbd:manage_key7();break;//10111101
          case0x7d:manage_key8();break;//01111101

          case0xeb:manage_key9();break;//11101011
          case0xdb:manage_key10();break;//11011011
          case0xbb:manage_key11();break;//10111011
          case0x7b:manage_key12();break;//01111011

          case0xe7:manage_key13();break;//11100111
          case0xd7:manage_key14();break;//11010111
          case0xb7:manage_key15();break;//10110111
          case0x77:manage_key16();break;//01110111
          default:break;
          }
          }



          關(guān)鍵詞: msp430矩陣式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); })();