4X4矩阵键盘程序

来源:互联网 发布:银行市场份额数据 编辑:程序博客网 时间:2024/04/28 22:25
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;
}
}
}
}