原创 4X4矩阵键盘程序

2009-5-24 22:26 4860 7 6 分类: MCU/ 嵌入式

        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;
   }
  }
 }
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /3 下一条