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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > Stm32矩陣鍵盤掃描程序分析

          Stm32矩陣鍵盤掃描程序分析

          作者: 時間:2016-11-27 來源:網(wǎng)絡 收藏
          我們知道在51單片機中,通過掃描某個口的電平高低得知那個按鍵按下,比如,控制兩行4列,

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

          假如讓P1=0xCf;低位都置1(pb0-pb3),pb4-pb5置0;然后我們就掃描P1口就行了,如果有按鍵被按下的,高電平會被強制拉低的。

          假如按鍵返回的值為0xce,可知是pb0被拉低了,由此可判斷是S1或者S2按下了,其他的同理。

          當然只讓P1=0xcf,是不能判斷出具體的按鍵是哪個的,此時,如果我們?nèi)》醇萈1=0x30;

          當按鍵返回值為0x10時,我們可得知01 0000,pb5=0,s1或者s2被按下,這個時候我們將0xce|0x10=0xde,就是唯一的值了。以此類推,得出其他的值來。

          在stm32中是同樣的大道理;

          uint8_t KeyScan(void)

          {

          uint8_t HangValue = 0;

          uint8_t LieValue= 0;

          uint16_t KeyValue= 0;

          uint8_t Tmp =0;

          static uint8_t KeyConter = 0;

          GPIO_SetBits(Colum1.port, (Colum1.pin|Colum2.pin|Colum3.pin|Colum4.pin));

          GPIO_ResetBits(Line1.port,(Line1.pin|Line2.pin));

          Tmp = GPIO_ReadInputData(Line1.port);

          if ((Tmp&0x0F) != 0x0F)

          {

          if (KeyConter < 1)

          {//去抖

          KeyConter++;

          }

          else

          {

          HangValue = Tmp&0x0f;

          GPIO_ResetBits(Colum1.port, (Colum1.pin|Colum2.pin|Colum3.pin|Colum4.pin));

          GPIO_SetBits(Line1.port,(Line1.pin|Line2.pin));

          Tmp = GPIO_ReadInputData(Colum1.port);

          LieValue = Tmp&0x30;

          KeyValue = (HangValue)|LieValue;

          if (KeyValue)// KeyValue^KeyValueBkp

          {

          KeyValueBkp = KeyValue;

          switch (KeyValue)

          {

          //case KEY_10:return KEY_NUM_0;//16;----0

          case KEY_01:return KEY_NUM_1;//3;-----1

          case KEY_02:return KEY_NUM_2;//4;-----2

          case KEY_03:return KEY_NUM_3;//5;-----3

          case KEY_04:return KEY_NUM_4;//7;-----4

          case KEY_05:return KEY_NUM_5;//8;-----5

          case KEY_06:return KEY_NUM_6;//9;-----6

          case KEY_07:return KEY_NUM_7;//11----7

          case KEY_08:return KEY_NUM_8;//------8

          default:

          return 0;

          }

          }

          else

          {

          return 0;

          }

          }

          }

          else

          {

          KeyConter = 0;//計數(shù)清零

          KeyValueBkp = 0;

          }

          return 0;

          }

          typedef struct

          {

          GPIO_TypeDef*port;

          uint16_tpin;

          }Matrix_t;

          //const Matrix_t Colum1 = {GPIOD, GPIO_PIN_2};

          //const Matrix_t Colum2 = {GPIOD, GPIO_PIN_3};

          //const Matrix_t Colum3 = {GPIOD, GPIO_PIN_4};

          const Matrix_t Colum1 = {GPIOB, GPIO_Pin_0};

          const Matrix_t Colum2 = {GPIOB, GPIO_Pin_1};

          const Matrix_t Colum3 = {GPIOB, GPIO_Pin_2};

          const Matrix_t Colum4 = {GPIOB, GPIO_Pin_3};

          const Matrix_t Line1= {GPIOB, GPIO_Pin_4};

          const Matrix_t Line2= {GPIOB, GPIO_Pin_5};

          #define KEY_01 0x1e

          #define KEY_02 0x2e

          #define KEY_03 0x1d

          #define KEY_04 0x2d

          #define KEY_05 0x1b

          #define KEY_06 0x2b

          #define KEY_07 0x17

          #define KEY_08 0x27



          評論


          技術(shù)專區(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); })();