我會時常分享一些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