资源描述:
《经典按键程序.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、项目里经常处理按键消抖,本来这个消抖的过程是与具体按下的键无关的,可以前的代码总是在消抖的同时处理具体的按键值,再加上长按短按组合键混在一起,成一锅粥.最近在一个项目中痛下决心,想弄个通用版本的,这样下个项目只要将文件包含一下,处理具体按键值就可以了,不必再关心消抖部分的代码了.另外还发现,这样做可以同时做出几套不同的按键处理方式.思路是:按照面向过程的编程方式,将数据与过程分离.把和按键状态相关的东西统统塞到结构里,把消抖的代码放在一个函数中.//key.h头文件------------------------------------------
2、-------------------#ifndef_KEY_H#define_KEY_H#define_KEY_NONE0#define_HAS_NO_KEY0#define_HAS_KEY_DOWN1#define_HAS_KEY_SURE2#define_HAS_KEY_WAITUP3#define_REENTER1#define_NO_REENTER2typedefstruct{WORDPreDownKey;//上次检测到的键BYTEKeyState;//状态WORDSameKeyCntr;//同一键检测到按下的次数WORDCurKey;/
3、/当前检测到的键,用于处理长按的情况BYTE(*KeyDownCallBack)(WORD,WORD);//键确认按下的回调函数指针void(*KeyUpCallBack)(WORD);//键抬起的回调函数指针}struct_KeyInfo;voidDitherlessKey(struct_KeyInfo*pInfo);//消抖的处理函数#endif//_KEY_H//消抖动的代码--------------------------------------------------------------#include"Key.h"//定时消抖的按
4、键处理函数,通常在定时中断中调用,voidDitherlessKey(struct_KeyInfo*pInfo){switch(pInfo->KeyState){case_HAS_NO_KEY:pInfo->SameKeyCntr=0;if(pInfo->CurKey!=_KEY_NONE){pInfo->KeyState=_HAS_KEY_DOWN;//进入有键按下状态}break;case_HAS_KEY_DOWN:if(pInfo->PreDownKey==pInfo->CurKey){pInfo->KeyState=_HAS_KEY_SUR
5、E;//确认键已按下状态}else{pInfo->KeyState=_HAS_NO_KEY;//回到无键状态}break;case_HAS_KEY_SURE:if(pInfo->CurKey==pInfo->PreDownKey){pInfo->KeyState=_HAS_KEY_WAITUP;if(pInfo->KeyDownCallBack){//这里回调函数的返回值决定了是否允许出现长按的情况if(_REENTER==pInfo->KeyDownCallBack(pInfo->CurKey,pInfo->SameKeyCntr)){pInfo
6、->KeyState=_HAS_KEY_SURE;++pInfo->SameKeyCntr;}}}else{pInfo->KeyState=_KEY_NONE;}break;case_HAS_KEY_WAITUP:if(pInfo->CurKey!=pInfo->PreDownKey){pInfo->KeyState=_HAS_NO_KEY;if(pInfo->KeyUpCallBack){pInfo->KeyUpCallBack(pInfo->PreDownKey);}}break;default:break;}pInfo->PreDownKey
7、=pInfo->CurKey;//保存上次按键值return;}//应用代码片段---------------------------------------------------------------------------------------......//声明按键回调函数BYTEKeyDownCallBack(WORDKey,WORDTimes);BYTEKeyDownCallBack2(WORDKey,WORDTimes);//按键处理数据结构staticstruct_KeyInfog_KeyInfo1={0,0,0,0,KeyDo
8、wnCallBack};staticstruct_KeyInfog_KeyInfo2={0,0,0,0,KeyDownCa