« 嵌入式C通用延时驱动的编写比较流行的红外解码程序 »

单片机按键处理的新思路

分类: 单片机杂谈 发布: admin 浏览: 日期: 2017年12月27日

这个新思路只能用在最简单的情况,每30ms判断一次按键的情况,如果按键是按下的情况,那么就执行相应的按键处理程序。

/***************************************************************************************************

函数功能:扫描按键值,交将扫描到的按键触发信息转换成数字赋给Key_num

函数入口:无

函数出口:无

***************************************************************************************************/

void KeyScan(void)

if(KEY1==0&&KEY2==1&&KEY3==1)

key_num=1;                                                                                         //KEY1键按下,返回1

retur

elseif(KEY1==1&&KEY2==0&&KEY3==1)

key_num=2;                                                                                         //KEY2键按下,返回2

retur

elseif(KEY1==1&&KEY2==1&&KEY3==0)

key_num=3;                                                                                         //KEY3键按下,返回3

retur

elseif(KEY1==1&&KEY2==0&&KEY3==0)

key_num=4;                                                    //KEY2键和KEY3键同时按下,返回4

retur

//这里还可以添加更多的按键,和更多的返回值,霸气不?!?!?!

//这里有一个问题啊,就是这里是三个按键的情况,如果为大于三个按键的情况

//而同时要处理多个按键按下的问题用这种if else if else if ...else的形式

//就会有一个严峻的问题,不能很好的区分每一种按键的情况,因为这时会有一个非常复杂的逻辑空间

//区别这每一种按键的

//逻辑条件,如果有更多的按键,那么这种方法肯定是行不通的,但是如果只是最简单

//的情况,也就是只会按下一个键的情况,那样的话问题就会简单很多

//总而言之使用if else if else if else if else的这种结构的关键就在于每一个if 或 else if 语句

//都必顺是不同的情况,如果不是这样的话就会有重和漏掉的情况的发生

//对于多个按键的情况有一个较为聪明的解决的办法,就是把在在每一个if或else if 语句里把每一个按键的情况

//都写清楚,使每一种分支都和别的分支都没有逻辑上的包含的被包含的情况都,从而用这种方法构建的if else if ...else

//是一个没有包含和被包含情况的逻辑关系非常清晰的空间,也就是实际上这是一个数学上的一个非常简单的问题

//最终的可能的情况有2的按键次数次方的个数,一个关键的问题就是书写条件时先写if 和 else if 里面的语句而后再

//用一个else语句来把剩下的情况全部概括,其实思路就是抓信己知的情况,从而把未知的情况剩出来。编程时这

//些情况直接用一个else语句来概括,这样的话对于这些没有定义的情况统统返回一个0,在KEY_process()里面这些情况

//全部作为是无效按键的情况,这些情况下的按键触动情况就会直接作为无效按键的情况,KEPY_process()会直接路出

//这些情况从而对于这些情况想当于是没有任何的作用的.只有有作用的按键触发情况才会转而去执行相应的按键处理程序

//特别要注意的一点就是这些有作用的按键触发情况有都是最细小的逻辑体,这样才话能够做到不重不漏,严谨有序

//这一种方法是非常有实践意义和应用价值的

else

key_num=0;                                                    //如果所有按键都没有按下就返回0或255,这里返回0

retur

/***************************************************************************************************

函数功能:根据扫描到的不同的按键触发情况,执行相应的按键的处理功能

函数入口:无

函数出口:无

作者   :任丁

***************************************************************************************************/

void KeyProcess(void)

if(KeyScan_Flag==1)                                               //按键扫描的时间30ms到了

KeyScan_Flag=0

KeyScan()

if(0<key_num&&key_num<255)                                                              //如果有键按下

if(key_num==1)

if(Key1_EnableFlag==0)

//此处添加KEY1按键的处理程序

Key1_EnableFlag=1

retur

elseif(key_num==2)

if(Key2_EnableFlag==0)

//此处添加KEY2按键的处理程序

Key2_EnableFlag=1

retur

elseif(key_num==3)

if(Key3_EnableFlag==0)

//此处添加KEY3按键的处理程序

Key3_EnableFlag=1

retur

else

return;//实际上不会走到这一条语句,因为return回的有效值为1到255

//除此之外没有其他值,而如果为0或者大于255时,是不会进入这个分支的

//直接在第二层的else语句执行相应的程序

else                                                                            //按键无效,即无键按下

Key1_EnableFlag=0;                                     //按键使能标志位置0,使能按键作用

Key2_EnableFlag=0;                                     //按键使能标志位置0,使能按键作用

Key3_EnableFlag=0;                                     //按键使能标志位置0,使能按键作用

Key4_EnableFlag=0;                                     //按键使能标志位置0,使能按键作用

retur

else           //按键检测使能标志为0,即没有到达按键检测的时间间隔,这里设置为10ms,不进行按键检测

return

相关文章:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-Blog 1.8 Walle Build 100427

Copyright 文雅单片机. Some Rights Reserved.