www.pudn.com > key4X4.rar > key4X4.h, change:2006-08-27,size:3464b


/*----------------------模块说明---------------------------*/ 
/*  模块名  :key4x4.h     
    模块功能:检查4*4键盘,找到所按下的键的键值(0~F) 
    注意事项: 模块中包含头文件key_io.h、Delay.h 
    设计人:   LXB    2005.8.2 /N.S 
    测试人:  LXB        
    测试结果:程序运行正常 
    最后修改日期: 2005.8.11                               */ 
 
#include <key_io.h> 
//#include <Delay.h> 
/**********键盘子程序说明:与单片机接口为p1口,利用高四位送扫描值,*******/ 
/**********低四位按位判断是哪个键按下,找到后返回按键所对应的偏移量*******/ 
//#define   dat P1 
//sbit key_1=P1^0; 
//sbit key_2=P1^1; 
//sbit key_3=P1^2; 
//sbit key_4=P1^3; 
/******调用之前先对函数进行定义**********/ 
/*****************检查有没有键按下子程序***********************/ 
//有键按下返回1,无键按下返回0 
unsigned  char  testkey(); 
 
/******************扫描是哪个键按下子程序***********************/ 
//找到所按键的键值,并返回 
unsigned  char keyscan(void); 
 
 
 
/************键盘子程序,有键按下,找到所按下键,并将键值返回***********/ 
//无键按下返回ffH 
unsigned char key_0() 
{  if (testkey()==1) 
  	return keyscan();         //返回键值 
  	else return 0xff;         //返回ffH 
}  
 
 
              
/******函数功能描述***************/     
unsigned  char  testkey() 
{ unsigned  char  jia,rejia; 
  unsigned char h; 
  dat=0x0f; 
  jia=dat; 
  if(jia==0x0f) h=0; 
  else   
  {  delaynms(100);              // 延时消抖 
     rejia=dat; 
     if (rejia==jia)h=1;     // 确实有键按下,返回1 
     else h=0;               // 与键按下返回0 
  }                          
  return   h; 
} 
 
/******************扫描是哪个键按下子程序***********************/ 
unsigned  char keyscan(void)                
{     unsigned char pos; 
      unsigned char i,k; 
      bit  d,z,s;       
      k=0;i=0;z=0;s=0; 
      pos=0xf7; 
      do{i=k; 
         d=1; 
         pos<=1;                                   // 查找具体是哪个键按下 
         pos=(pos | 0x0f); 
         dat=pos; 
         if(key_1==0) 
                  {   while(d) 
                     { if(key_1==1) 
                        {d=0; 
                         i += 0;                   // 与硬件配合起来,对于同一列的键偏移量彼此相差4 
                         z=1; 
                         s=1; 
                        } 
                     } 
                  } 
         else if(key_2==0) 
                  {   while(d) 
                     { if(key_2==1) 
                        {d=0; 
                         i += 4;                   // 与硬件配合起来,对于同一列的键偏移量彼此相差4 
                         z=1; 
                        } 
                     } 
                  } 
         else if(key_3==0) 
                  {   while(d) 
                     { if(key_3==1) 
                        {d=0; 
                         i += 8;                   // 与硬件配合起来,对于同一列的键偏移量彼此相差4 
                         z=1; 
                        } 
                     } 
                  } 
         else if(key_4==0) 
                  {   while(d) 
                     { if(key_4==1) 
                        {d=0; 
                         i += 12;                 // 与硬件配合起来,对于同一列的键偏移量彼此相差4 
                         z=1; 
                        } 
                     } 
                  } 
          
          } while((++k != 4)&&(z==0));   
          if((i==3)&&(s==0)) return (0xff); 
          else  return i;           
  }