關于矩陣鍵盤行列掃描的測試實驗

發表于:2016-07-07來源:推酷作者:Inknkg點擊數: 標簽:測試實驗
我會時常分享一些51的程序編寫方法,有一定基礎的可以來看看。如有不當之處,歡迎大家指正,一同進步。

我會時常分享一些51的程序編寫方法,有一定基礎的可以來看看。如有不當之處,歡迎大家指正,一同進步。
矩陣鍵盤無非就是兩種掃描方式,一為逐行掃描,二為行列一起掃描讀取鍵值。先確定行后確定列的讀取方法沒有什么可講的,我針對行列一起掃描來總結一下我常用的一些方法。
學習嵌入式或者說硬件一定是從硬件原理開始,因為矩陣鍵盤電路原理簡單,網上講解較多,我只附上原理圖,重點跟大家交流一下程序部分。
下圖就是矩陣鍵盤 由P1口控制,P10~P13為列 P14~P17為行。


 

矩陣鍵盤電路原理圖

高四位輸出低電平,低四位輸出高電平,檢測低四位不全為高可確定列;反過來高四位輸出高電平,低四位輸出高電平,高四位不全為高確定行,行列交叉即可獲得按鍵鍵值。廢話不多說,直接上程序,我已經詳細注解過了,不懂多看看哈。

/*******************************************************************************
* 函數名        : KeyDown
* 函數功能      : 檢測有按鍵按下并讀取鍵值
* 輸入          : 無
* 輸出        : 無
* 作者    : INK
* 日期地點      : NANKING
*******************************************************************************/
void KeyDown(void)
{
  char a=0;
  GPIO_KEY=0x0f;      // 位定義的引腳
  if(GPIO_KEY!=0x0f)  //讀取按鍵是否按下
  {
    Delay10ms();      //延時10ms進行消抖
        if(GPIO_KEY!=0x0f) //再次檢測鍵盤是否按下
          {
          //測試
            GPIO_KEY=0X0F;
switch(GPIO_KEY)
        {  //此段程序只是為了確定列的值 方便在后面進行測試行的時候加減運算 獲得具體案件的行列值 從而轉換為按鍵值
case(0X07):    KeyValue=0;break;//掃描第一列
case(0X0b):    KeyValue=1;break;//按鍵第二列 是keyValue=1
case(0X0d): KeyValue=2;break;//按鍵第三列
case(0X0e):    KeyValue=3;break;//按鍵第四列
         }
              //測試行 確定了列以后需要翻轉 確定行 交叉確定鍵值
          GPIO_KEY=0XF0; //屏蔽高四位
switch(GPIO_KEY)
        {                      //已經進行過
case(0X70):    KeyValue=KeyValue;break;//自己去看為什么是 0X70 列的時候又為什么是0X07 硬件相結合
case(0Xb0):    KeyValue=KeyValue+4;break;  //鍵值是5  掃描第二行
case(0Xd0): KeyValue=KeyValue+8;break;  //鍵值是9  掃描第三行
case(0Xe0):    KeyValue=KeyValue+12;break; //鍵值13  掃描第四行
        }   //其實最終返回的鍵值就是進行過加法運算的
while((a<50)&&(GPIO_KEY!=0xf0))    //檢測按鍵松手檢測 松手 按鍵就是 f0
        {
          Delay10ms();
          a++;//防止程序死在 while循環里 利用a的值跳出循環,比較不錯的雙重保險辦法 
        }
    }
  }
}
 

原文轉自:http://www.jianshu.com/p/f94e6c55e352

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97