您的位置:控制工程论坛网论坛 » PLC与PAC » 4*4矩阵键盘模块程序的调用

cqs0088

cqs0088   |   当前状态:在线

总积分:-390  2024年可用积分:0

注册时间: 2008-07-12

最后登录时间: 2012-05-30

空间 发短消息加为好友

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

cqs0088  发表于 2008/9/15 7:52:33      524 查看 0 回复  [上一主题]  [下一主题]

手机阅读

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

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

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

***************************************************************************************
修改日期: 2008.7.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口接数码管
}
}*/


1楼 0 0 回复