4X4矩陣鍵盤程序

4x4鍵盤的程序有掃描法與線反法,但我個人認爲用線反法較好,用掃描法得依次掃描所有行或列,如果用線反法就簡單多了。先使鍵盤的行置爲低、列置爲高(或列置爲高、行置爲低),接着讀回端口的值。比如:如果使用P0爲鍵盤接口就先使低四位爲低、高四位爲高即P0=0xf0然後就讀回P0口的值賦給一個變量,a=P0;緊接就給行列賦相反的值行置爲高、列置爲低(或列置爲低、行置爲高)即P0=0x0f然後就讀回再與a運算就能得到唯一的識別碼

下面的程序就是用線反寫一個4x4鍵盤識別程序:


#include<AT89X52.H>
#include<delay.h>


#define KEY_SCAN P1
#define uchar unsigned char


//char num;


/********************************/
/*函數名稱:KEY_DOWN() */
/*函數功能:延時子函數 */
/*參 數:無 */
/*返 回:返回1或0 */
/*備 注:1表示有鍵按下,0則無*/
/********************************/
bit KEY_DOWN()
{
KEY_SCAN=0x0f; //先給鍵盤口賦個初值
if(KEY_SCAN!=0x0f) //判斷是有按鍵按下,即KEY_SCAN不等於初值時有鍵按下
{
delayms(10); //消抖
if(KEY_SCAN!=0x0f) //再次判斷是否真有鍵按下
return 1; //真有就返回1沒有返回零
else
return 0;
}
else
return 0;
}


/********************************/
/*函數名稱:SCAN_GET() */
/*函數功能:鍵盤值函數 */
/*參 數:無 */
/*返 回:返回1或0 */
/*備 注:無 */
/********************************/
uchar SCAN_GET()
{
char button;
uchar key_code;
button=KEY_SCAN;
KEY_SCAN=0xf0;
button=(button|KEY_SCAN);
while(KEY_SCAN!=0xf0);
delayms(10);
switch(button)
{
case 0xd7: key_code='1';break;
case 0xdb: key_code='2';break;
case 0xdd: key_code='3';break;
case 0xb7: key_code='4';break;
case 0xbb: key_code='5';break;
case 0xbd: key_code='6';break;
case 0x77: key_code='7';break;
case 0x7b: key_code='8';break;
case 0x7d: key_code='9';break;
case 0xeb: key_code='0';break;
case 0xee: key_code=0xee;break;
default : break;
}
return key_code;
}
//////////////////////////////////////////////////////////////
//此程序是上兩個程序結合的
/********************************/
/*函數名稱:Key_Get() */
/*函數功能:鍵盤掃描函數 */
/*參 數:無 */
/*返 回:無 */
/*備 注:無 */
/********************************/
void Key_Get()
{
char button;
KEY_SCAN=0x0f;
if(KEY_SCAN!=0x0f)
{
delayms(5);
if(KEY_SCAN!=0x0f)
{
button=KEY_SCAN;
KEY_SCAN=0xf0;
button=(button|KEY_SCAN);
while(KEY_SCAN!=0xf0);
switch(button)
{
case 0xd7: num='1';P0=0x00;break;
case 0xdb: num='2';P0=0x0f;break;
case 0xdd: num='3';break;
case 0xb7: num='4';break;
case 0xbb: num='5';break;
case 0xbd: num='6';break;
case 0x77: num='7';break;
case 0x7b: num='8';break;
case 0x7d: num='9';break;
case 0xeb: num='0';break;
case 0xe7: num='a';break;
case 0xed: num='b';break;
case 0xee: num='c';break;
case 0xde: num='d';break;
case 0xbe: num='e';break;
case 0x7e: num='f';break;
default : break;
}
}
}
}

發佈了10 篇原創文章 · 獲贊 24 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章