keypad 键盘扫描,并返回按键值

来源:互联网 发布:geo芯片数据转换器 编辑:程序博客网 时间:2024/05/05 21:48

       /*
标题:小键盘的输入函数
版本:1.0
Target:89S51
函数描述:   char gotkey(void)
             从4ⅹ4小键盘输入数据,返回0 15
小键盘的连接方式:

  
  1 P20 -----0----1----2----3
             |    |    |    |
  2 P21 -----4----5----6----7
             |    |    |    |
  3 P22 -----8----9----10---11
             |    |    |    | 
  4 P23 -----12---13---14---15
             |    |    |    |
  5 P24 ---- |    |    |    |
             |    |    |    |
  6 P25 ----------     |    |
                       |    |
  7 P26 ---------------     |  
                            |
  8 P27 --------------------   
*/
#include <REGX51.H>
code char key_code[]={0x7E,0XBE,0XBD,0XBB,0XDE,0XDD,0XDB,0XEE,
                      0XED,0XEB,0X7D,0X7B,0XE7,0XD7,0XB7,0X77};
code ksp[4]={0x7F,0xBF,0xDF,0xEF};
void delay (void)  {                   /* 时间延迟函数 */
  unsigned char i,j;                 
     for (i=0;i<5;i++)
          for(j=0;j<255;j++)
          ;
}
char keypad_scan()
{
    char key,i;
    P2=0xF0;
    while (P2!=0xF0); //这句想不明白什么作用!? W 应该是要满足条件情况下,重复执行上面一句P2=0xF0;
      do{
       for(i=0;i<=3;i++)
       {        
           P2=ksp[i];
           if(P2!=ksp[i])
           {
              delay();
              key=P2;
              if(key!=ksp[i])
              {
                  return(key);
              }
           }
       }
    } while(1);
}
// 检查是否有按键按下
char gotkey()
{
     char temp,i;
     temp=keypad_scan();
     for (i=0;i<=15;i++)
  {
          if(temp==key_code[i]) return(i);
     }
     return(16);  //1.这句不知道为什么要放括号外?? 
               //W  我想可能是因为键盘大多时间应该是不被按下的,没按下的情况返回16.
      //2.还有,有按键被按下,返回相应的键值后,会不会再执行这句呢?
      //会的话不是多输出一个16呢?
      //查资料,得知,return是返回函数值并退出函数

 }