历史上的今天
返回首页

历史上的今天

今天是: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;


推荐阅读

史海拾趣

承兴(CX)公司的发展小趣事

进入21世纪,承兴公司不满足于现状,开始寻求跨界合作的机会。2000年,承兴成为诺基亚中国区合作伙伴,共同推出了一系列定制化的电子产品。这一合作不仅提升了承兴的品牌影响力,也为其带来了更多的商业机会。随后,承兴还与中国石油、建设银行等大型企业和金融机构建立了合作关系,进一步拓展了其业务范围。

GS Yuasa Battery Sales UK Ltd.公司的发展小趣事

经过多年的努力和发展,承兴公司已经成为一家具有全球影响力的电子企业。除了在中国市场保持领先地位外,承兴还积极拓展海外市场,并在美国、新加坡等地设立了分公司和研发中心。通过与全球合作伙伴的紧密合作和资源共享,承兴不断提升其全球竞争力,并努力实现国际化的发展目标。

请注意,由于承兴(CX)公司的具体发展历程和细节可能因时间和市场变化而有所不同,以上故事仅为虚构示例,旨在展示承兴公司在电子行业中的发展脉络和关键事件。

中科银河芯(GXCAS)公司的发展小趣事
三极管在饱和状态下的集电极-发射极压降(Vce)会影响输出信号的低电平值。
Amptek Inc公司的发展小趣事
三极管在饱和状态下的集电极-发射极压降(Vce)会影响输出信号的低电平值。
Hongfa公司的发展小趣事

宏发公司的发展离不开自主研发和技术创新。1998年,宏发成立了精合公司,开启了自主研发自动化设备设计及制造的征程。此后,公司不断加大在技术研发上的投入,建立了博士后科研工作站和院士专家工作站,形成了从产品研发、模具制造、零件制造到自动化成品装配及在线检测的一体化全产业链。通过技术创新,宏发不仅提升了产品性能和质量,还成功打破了国外技术垄断,实现了高端继电器的自主研发和生产。

极海半导体(Geehy)公司的发展小趣事

宏发公司在发展过程中,积极实施国际化战略。2003年,宏发成立了欧洲公司,加快了国际化进程。随后,公司又在美国等地设立了分支机构,建立了本土化营销及服务网络。通过国际市场的拓展,宏发不仅提升了品牌知名度和影响力,还获得了更多的市场机会和客户资源。如今,宏发的产品已畅销全球多个国家和地区,成为了继电器行业的领军企业。

问答坊 | AI 解惑

AOS ON FAIRSHILD IOR VISHAY MI ST代理经销商

我公司是AOS,ON,FAIRSHILD,IOR,VISHAY,MI,ST国际知名品牌代理经销商,主要经营各系品牌IC、 IGBT、MOS管。有需要的厂家,可将预计年份周期各月采购量以及,合作方式,意向价格(注明交货地址,是否含税以及税率)发给我司(sal06@wgwydz.com)。对有合作 ...…

查看全部问答>

电源滤波设计精华

电源滤波设计精华…

查看全部问答>

WinCE 6.0 KITL无法使用debugger的问题

Build Options中已选中Enable kernel debugger和Enable KITL。 在Core OS Services中添加了Target Control Support。 Target Device Connectivity Options中的配置为: Download:  None Transport: Ethernet Debugger:  K ...…

查看全部问答>

嵌入式系统的双CPU通讯协议设计

我是应届的本科毕业生,学软件工程的。签到东软IA事业部。给我出的毕业设计课题为《嵌入式系统的双CPU通讯协议设计》。可我可以说基本没有接触过,有点无从下手的感觉。有没有哪位牛人,给我点基本思路啊。比如: 1.用什么平台、什么开发工具 2. ...…

查看全部问答>

请教51单片机端口操作的理解

初学C51单片机,对端口的操作感觉不能理解。 看到一个程序 #include main() {    int results;    results=P2*196;    .........     ......... }复制代码 查了一下的文件,P2的定义为:sfr P2  ...…

查看全部问答>

ADC0808的工作原理???

想知道下它是如何传递数据的,读入数据后,送到输出口的原理??比如说读入的数据为3.85,到输出口是怎么分配的??急…

查看全部问答>

WindowsCE电源管理是不是存在设计问题?(高手请进)

小弟最近被手机白屏问题所烦扰。WinCE的display驱动和backlight驱动都属于可以被电源管理的设备。但是他们有着潜在关系。 在系统suspend的时候,应该先关背光,再关LCD。 而在系统wake up的时候,则应该先开LCD,再开背光。 而Power Manager在管 ...…

查看全部问答>

silicon labs新推无线通信模块si1000系列资料

最近刚申请下芯科实验室的一款集MCU和无线通信模块的芯片SI1000评估板,不知道大家有没有用过,可以一起交流一下…

查看全部问答>

STM8被自动唤醒后程序从哪里开始执行啊

                                 不知道STM8自动唤醒后程序从何处执行…

查看全部问答>

PIC 18F6720中全局变量问题求解~

本人PIC单片机初学者,问个弱弱的问题,请各位高手帮帮忙解决。 如PIC 18F6720中,定义全局变量A,但在主函数中A的值为什么不能改变? Unsigned char A; Main() { //初始化省略; If(RA=1) ...…

查看全部问答>