Keil C51键盘译码程序

发布者:科技舞者最新更新时间:2021-06-11 来源: eefocus关键字: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 引用地址:Keil C51键盘译码程序

上一篇:定时器/计数器T1的定时实例
下一篇:51单片机实现智能泊车系统的设计方法

推荐阅读最新更新时间:2024-11-06 14:05

C51中如何将数字转换成字符串的问题
将整数转换成字符串,在C51中你如何做? 这个问题似乎很简单,keilC中也用sprintf()函数嘛,用就行了。但对于 寸土寸金 的单片机来说,问 题可没那么简单。 看看我代码中这句弃之不用的代码吧: //sprintf(sFileLen, %d ,fileLen*128);print(sFileLen); //使用这个库函数,体积一下增加2563. 我 的程序空间马上溢出不够用了。 OMG! C51库函数,伤不起啊 能自己写就自己写,尽量不用库函数吧。谱太大,用不起啊。下面这个函数就是类似sprintf()的作用。 为了节省几个字节,结果就直接发出来了,不必存储到uchar 中了。 // 向串口发送一个整数,支持
[单片机]
如何在KEIL中编写模块化的C程序
模块化编程是C相对汇编的重大优势。看书看了半天,没能实现周立功的的那个复杂的代码。自己在网上百度了下,按步骤要求可以实现,即模块化的代码在PROTUES仿真时成功的。在KEIL中的模块化程序写法在使用KEIL的时候,我们习惯上在一个.c的文件中把自己要写的东西按照自己思路的顺序进行顺序书写。这样是很普遍的写法,当程序比较短 的时候比如几十行或者一百多行,是没有什么问题的。但是当程序很长的时候,比如你要用到LCD显示数据,就有几个LCD相关的函数,然后你 想在LCD上显示温度,那么就要有DS18B20相关的操作,这又有几个相关的函数,如果你还想加上去DS1302的时间显示功能,那么又要多很多函 数。这样的话一个程序下来几百行是很正常的
[单片机]
C51对特殊功能寄存器位变量定义写法不严谨
C51对特殊功能寄存器位变量定义写法是否有不严谨之处,因为sbit P1_3=P1^3;中^是一个双目运算符 (按位加),P1口的8位状态和3正好构成双目,前面又是一个赋值号,又把一个字节赋给一个位,逻辑上讲不通。为什么非要用一个^号来定义,如果用两个(^^)来定义就不会有歧意,也不会被人误解了,在C51中有很多这样的符号,如== && !! =等。须要用上面的写法来定义吗?在这点上我可能是有点晕,但尚未影响编程,如果方便请看了书的和会搞程序的同人给予指点!
[单片机]
keil 常犯错误处理
1.提示 UNRESOLVED EXTERNAL SYMBOL SYMBOL:?C 很大可能相应代码忘记加入到代码组里面! 2、一直提示我重复定义函数,搜了一下网上,似乎只有变量的重复定义的问题啊,怎么函数也有重复定义的问题!!!最后删了uart.c和uart.h,然后编译成功。。。 最后仔细一看,竟然main.c中头文件包含的是uart.c 3、error C267: '××': requires ANSI-style prototype ×× - 通常是函数,缺少函数原型。 有时候自己明明有声明的,这个时候就要注意了,可能是后来稍微变了传入参数或者返回类型,注意再修改一下! 4
[单片机]
<font color='red'>keil</font> 常犯错误处理
Keil MDK使用第5篇---解决st-link 不能用状态
一直用的好好的 ,突然st-link不能用了,出现下边这个情况,上网一查很多人都有这个问题,就研究了下。 注意:因为是一直可以使用,所以这里不再赘述是否没有驱动的问题,这其实应是第一步检查的。 首先应排除硬件问题,若使用为台式机,可以试试使用背部面板USB口。 然后就是降低传输速率,确认使用下载方式正确。 还是不可以,可以按照以下步骤检查。 1.首先先检查连线,然后检查keil下载配置(这里不再赘述,参见另一篇博文《keil下载配置》) 2.还是不行的话,就试试下边的方法 首先,翻译下错误:internal command error 内部命令错误 找了几
[单片机]
单片机--电子时钟(C51
//简单电子时钟的C程序代码,没有消隐,没有按键功能 //author:helloword #include #define uint unsigned int #define uchar unsigned char sbit segoe=P1^3;//数码管的使能控制端,低电平有效 sbit duanxuan=P1^4;//数码管的段选控制,7段发光LED显示 sbit weixuan=P1^5;//数码管的位选控制,8个数码管的选择 uchar code smg_duan ={0x3F,0x06,0x5B,0x4F,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管段选码表,我们的数码管是共
[单片机]
C51-基础知识必备
基础知识必备 概念 在一片硅片上集成了微处理器,存储器及各种输入/输出接口的芯片。(单片微型计算机) 主要知识 中央处理器 程序处理器 数据存储器 定时器/计数器 并行I/O口 全双工串行口 中断系统 时钟震荡电路 主要内容 总图
[单片机]
C51-基础知识必备
CS5532 C51驱动程序
//The program for CS5532-ASZ //This is a 24bit ADC and PGIA //Made by OurWay and 2006/03/21 //#include reg51.h //#include intrins.h //根据实际情况定义 //sbit SDI5532 = P2^1; //sbit SDO5532 = P2^2; //sbit CLK5532 = P2^3; //sbit CS5532 = P2^0; //sbit ACC7 = ACC^7; //sbit ACC0 = ACC^0; //#define BYTE unsigned char //#define WOR
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved