原创 4*4矩阵键盘模块程序的调用

2008-5-16 17:36 2663 7 7 分类: MCU/ 嵌入式

花了两天时间终于做了个4*4的矩阵键盘模块程序,用在51单片机上,后面要是用到矩阵键盘的时候,直接调用这个程序就行了。现在贴出来,供大家学习,同时,有什么不足之处,也请大家指出。


 


产生.lib文件的方法:选择“工程”——“目标target属性”——“输出”——产生库文件*.lib,修改完后,编译一下程序,无措后,就在工程目录下产生一个.lib文件,到时要用到这个模块程序时,直接把.c和.lib文件拷贝到所在的目录下,再把.c的文件加载到工程文件里就OK了。
/*
***************************************************************************************
摘    要: 4*4小键盘模块程序,供以后其他程序调用.其中P2口高四位接键盘列,P2口低四位接键盘行,
版    本: V1.0
完成日期: 2008.4.28
作    者: ZHOUSFE
***************************************************************************************
修改日期: 2008.5.6
版    本: V1.2
****************************************************************************************
*/


#i nclude <reg51.h>
#define uchar unsigned char
#define keyport  P2
//uchar code seg[16]=


{0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0X88,0X83,0XC6,0XA1,0X86,0X8E}; //0~f,


共阳极
uchar code keycode[16]=


{0xEE,0XDE,0XBE,0X7E,0XED,0XDD,0XBD,0X7D,0XEB,0XDB,0XBB,0X7B,0XE7,0XD7,0XB7,0X77};//待查询的


键码值


/*
*******************************************************************************************
函数名称:delay()
功能描述:延时ms个微妙
入口参数:unsigned int ms
出口参数:无
*******************************************************************************************
*/


void delay(unsigned int ms) 
{
  unsigned char a;
  while(!ms--)
  for(a=0;a<124;a++); 
}


/*
*******************************************************************************************
函数名称:keyscan()
功能描述:键盘扫描程序,利用行扫描方式,得到键值
入口参数:无
出口参数:扫描得到的键值~((~sm)+(~fh))
*******************************************************************************************
*/


uchar keyscan(void)        
{
  uchar sm;                  //存放行扫描代码,该函数的返回值的低四位
  uchar fh;                  //该函数的返回值的高四位
  keyport="0xf0";
  if((keyport&0xf0)!=0xf0)        //判断是否有按键按下  
  {
    delay(2);                //去抖动延时(1~10ms)
    if((keyport&0xf0)!=0xf0) 
    {
      sm="0xfe";                //行扫描初值
      while((sm&0x10)!=0)
    {
        keyport="sm";
        if((keyport&0xf0)!=0xf0)       //若本行有键按下,则执行读取键值信息
        {
          fh=(keyport&0xf0)|0x0f;   
          return(~((~sm)+(~fh))); //返回扫描的键值
        }
         else   sm=(sm<<1)|0x01;   //若本行没有键按下,则扫描下一行
       }
     }
   }
   return 0xff;                   //若没有按键按下,则返回0xff
}


/*
*******************************************************************************************
函数名称:getkey()
功能描述:将扫描得到的键值转化为对应的0~f
入口参数:无
出口参数:显示的数字0~f
*******************************************************************************************
*/


uchar getkey()
{
  uchar key;
  uchar temp;
  uchar j;
  while(1)
  {
    key="keyscan"();       
    delay(2);
    for(j=0;j<16;j++)
    {
      if(key==keycode[j])   //通过查询方式,得到按下的按键值
      {
        temp="j";             //按键值先保存于temp中
        if(key==0xff)       //若没有按下下一个键,则一直显示上一个键值
      {
          return temp;  
      }
      else
      {
         return j;
         temp="j";          //更新temp里的值
      }
       }
     }
   }
}
/*
*******************************************************************************************
测试用函数
*******************************************************************************************
*/
/*void main(void)
{
 uchar ch;
 P3&=0xfe;
 while(1)
 {
  ch="getkey"();
  P0=~seg[ch];  //P0口接数码管
 }
}*/

文章评论0条评论)

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