加入收藏 | 设为首页 | 会员中心 | 我要投稿 | RSSRSS-巴斯仪表网
您当前的位置:首页 > 电子发烧 > 单片机学习

Keil C51键盘译码程序

时间:2013-09-02  来源:123485.com  作者:9stone

  键盘译码程序是开发项目中最常用到的程序,它的好坏,直接影响着整个程序!现在介绍一个使用非常广泛的Keil C51键盘译码程序。
 在主程序中不断调用KeyBord(),可以不停地扫描键盘!
 在功能子程序中调用:unsigned charJB_KeyData(),得到键值
#define TK  8         //主程序执行时间8ms
#define Timer20ms  (30/TK)   //延时时间20ms
#define Timer2S     (1200/TK) //延时时间2S
#define Timer100ms   (1000/TK)  //延时时间100ms
#define Port P2 //键盘口
//****************************
KEY  KeyDat;        //定义数据结构
//---------------------------
//5个开关占用的IO脚
//---------------------------
sbit ko=Port^0;
sbit ka=Port^1;
sbit kb=Port^2;
sbit kc=Port^3;
sbit kd=Port^4;

/***************************
根据硬件电路不同,只修改这段程序即可!!!
***************************/
unsigned char ReadKey(void){
    ko=0;
    if(!ka) return 2;//Ka
    if(!kb) return 3;//Kb
    if(!kc) return 4;//Kc
    if(!kd) return 5;//Kd
    return 0;
}

/***************************
判别是否有建
***************************/
void GetKey(void){
    if(ReadKey()!=0){
    KeyDat.KeyDog=Timer20ms;
    KeyDat.KeyPower++;
    }
}

/***************************
延时去抖动
***************************/
void KeyDog(void){
    if(0==-KeyDat.KeyDog){
    KeyDat.KeyData=ReadKey(); //读键盘
    if(KeyDat.KeyData!=0){
    KeyDat.KeyPower++;
    KeyDat.KeyDog=Timer3S;
/***************************
//    BeepPower=1;//蜂鸣器短鸣
***************************/
    }else{
    KeyDat.KeyPower=0:
    KeyDat.KeyData=0;    //返回
    }
  }
}

/***************************
判别是否松开
***************************/
void KeyOff1(void){
  if(ReadKey0==0){    //松开按键
    KeyDat.KeyPower=0;
    KeyDat.KeyData |=HaveKey;//定义标志
    }else{
    if(0==-KeyDat.KeyDog){ //3秒延时到
    KeyDat.KeyDog=Timer100ms;
    KeyDat.KeyPower++;
    }
    }
}

/***************************
连击是否松开
***************************/
void KeyOff2(void)
{
    if(ReadKey()!=0){
    if (0==--KeyDat.KeyDog){
    KeyDat.KeyData |=DubClick | HaveKey;  //连击标志
    KeyDat.KeyDog=Timer100ms;
/***************************
//    BeepPower=1;//发送蜂鸣器短鸣命令
***************************/
    }
    }else{
    KeyDat.KeyData=0;  //?|=HaveKey;//一次按键
    KeyDat.KeyPower=0;
    }
}
/***************************
函数指针定义
***************************/
code void(code *SubKey[])()={
    GetKey,KeyDog,KeyOff1,KeyOff2
};
/***************************
键处理程序用户在主程序只需不断调用它!
***************************/
void KeyBord(void){
   (*SubKey[KeyDat.KeyPower])();

/***************************
用户在功能函数中调用,返回键处理后清除键值
***************************/
unsigned char JB_KeyData(void){
    unsigned char i=0;
    if (KeyDat.KeyData>DubClick){
    i=KeyDat.KeyData;
    KeyDat.KeyData=0;
    }
    return i;
}

以下是头文件:
/***************************
键盘的键值定义
***************************/
#define DubClick 0x40    //连击
#define HaveKey 0x80    //有键
#define SeeKey (0x01|HaveKey)
#define SetKey (0x02|HaveKey)
#define RRKey (0x03|HaveKey)
#define UpKey (0x04|HaveKey)
#define RetKey (0x05|HaveKey)
#define RLKey (0x02|HaveKey)

//#define UseKey (0x06|HaveKey)
#define SeeKey_Dub (SeeKey | DubClick | HaveKey)
#define SetKey_Dub (SetKey | DubClick | HaveKey)//双击
#define RRKey_Dub (RRKey | DubClick | HaveKey)
#define UpKey_Dub (UpKey | DubClick | HaveKey)
#define RetKey_Dub (RetKey | DubClick | HaveKey)
//#define UseKey_Dub (UseKey | DubClick | HaveKey)

//--------------------------
typedef struct{
  unsigned char KeyPower;  //命令字
  unsigned int KeyDog;//延时
  unsigned char KeyData;//键值
}KEY;


分享到:
来顶一下
返回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
栏目导航->单片机学习
  • 电子应用基础
  • 电源技术
  • 无线传输技术
  • 信号处理
  • PCB设计
  • EDA技术
  • 单片机学习
  • 电子工具设备
  • 技术文章
  • 精彩拆解欣赏
  • 推荐资讯
    使用普通运放的仪表放大器
    使用普通运放的仪表放
    3V与5V混合系统中逻辑器接口问题
    3V与5V混合系统中逻辑
    数字PID控制及其改进算法的应用
    数字PID控制及其改进
    恶劣环境下的高性价比AD信号处理数据采集系统
    恶劣环境下的高性价比
    栏目更新
    栏目热门