历史上的今天
今天是:2025年06月11日(星期三)
2021年06月11日 | Keil C51键盘译码程序
2021-06-11 来源:eefocus
键盘译码程序是开发项目中最常用到的程序,它的好坏,直接影响着整个程序!现在介绍一个使用非常广泛的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;
上一篇:定时器/计数器T1的定时实例
史海拾趣
|
AOS ON FAIRSHILD IOR VISHAY MI ST代理经销商 我公司是AOS,ON,FAIRSHILD,IOR,VISHAY,MI,ST国际知名品牌代理经销商,主要经营各系品牌IC、 IGBT、MOS管。有需要的厂家,可将预计年份周期各月采购量以及,合作方式,意向价格(注明交货地址,是否含税以及税率)发给我司(sal06@wgwydz.com)。对有合作 ...… 查看全部问答> |
|
Build Options中已选中Enable kernel debugger和Enable KITL。 在Core OS Services中添加了Target Control Support。 Target Device Connectivity Options中的配置为: Download: None Transport: Ethernet Debugger: K ...… 查看全部问答> |
|
我是应届的本科毕业生,学软件工程的。签到东软IA事业部。给我出的毕业设计课题为《嵌入式系统的双CPU通讯协议设计》。可我可以说基本没有接触过,有点无从下手的感觉。有没有哪位牛人,给我点基本思路啊。比如: 1.用什么平台、什么开发工具 2. ...… 查看全部问答> |
|
初学C51单片机,对端口的操作感觉不能理解。 看到一个程序 #include main() { int results; results=P2*196; ......... ......... }复制代码 查了一下的文件,P2的定义为:sfr P2 ...… 查看全部问答> |
|
小弟最近被手机白屏问题所烦扰。WinCE的display驱动和backlight驱动都属于可以被电源管理的设备。但是他们有着潜在关系。 在系统suspend的时候,应该先关背光,再关LCD。 而在系统wake up的时候,则应该先开LCD,再开背光。 而Power Manager在管 ...… 查看全部问答> |
|
本人PIC单片机初学者,问个弱弱的问题,请各位高手帮帮忙解决。 如PIC 18F6720中,定义全局变量A,但在主函数中A的值为什么不能改变? Unsigned char A; Main() { //初始化省略; If(RA=1) ...… 查看全部问答> |




