Keil C51键盘译码程序

来源:本站
导读:目前正在解读《Keil C51键盘译码程序》的相关信息,《Keil C51键盘译码程序》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《Keil C51键盘译码程序》的详细说明。
简介: 键盘译码程序是开发项目中最常用到的程序,它的好坏,直接影响着整个程序!现在介绍一个使用非常广泛的Keil C51键盘译码程序。

键盘译码程序是开发项目中最常用到的程序,它的好坏,直接影响着整个程序!现在介绍一个使用非常广泛的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;

提醒:《Keil C51键盘译码程序》最后刷新时间 2024-03-14 01:02:38,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《Keil C51键盘译码程序》该内容的真实性请自行鉴别。