没有合适的资源?快使用搜索试试~ 我知道了~
通用按键消抖函数 -- 数据与过程分离
需积分: 16 10 下载量 162 浏览量
2018-05-29
17:25:16
上传
评论
收藏 38KB DOCX 举报
温馨提示
试读
12页
项目里经常处理按键消抖, 本来这个消抖的过程是与具体按下的键无关的, 可以前的代码总是在消抖的同时处理具体的按键值, 再加上长按 短按 组合键混在一起, 成一锅粥. 最近在一个项目中痛下决心, 想弄个通用版本的, 这样下个项目只要将文件包含一下, 处理具体按键值就可以了, 不必再关心消抖部分的代码了. 另外还发现, 这样做可以同时做出几套不同的按键处理方式. 思路是: 按照面向过程的编程方式, 将数据与过程分离. 把和按键状态相关的东西统统塞到结构里, 把消抖的代码放在一个函数中.
资源推荐
资源详情
资源评论
项目里经常处理按键消抖,本来这个消抖的过程是与具体按下的键无关的,可以前的代码总是在消抖的同时处理具体的按键值,
再加上长按(短按(组合键混在一起,成一锅粥.最近在一个项目中痛下决心,想弄个通用版本的,这样下个项目只要将文件包含一
下,处理具体按键值就可以了,不必再关心消抖部分的代码了.另外还发现,这样做可以同时做出几套不同的按键处理方式.
思路是:按照面向过程的编程方式,将数据与过程分离.把和按键状态相关的东西统统塞到结构里,把消抖的代码放在一个函数
中.
//key.h头文件-------------------------------------------------------------
#ifndef_KEY_H
#dene_KEY_H
#dene_KEY_NONE0
#dene_HAS_NO_KEY0
#dene_HAS_KEY_DOWN1
#dene_HAS_KEY_SURE2
#dene_HAS_KEY_WAITUP3
#dene_REENTER1
#dene_NO_REENTER2
typedefstruct
{
WORDPreDownKey;//上次检测到的键(
BYTEKeyState;//状态(
WORDSameKeyCntr;//同一键检测到按下的次数(
WORDCurKey;//当前检测到的键,用于处理长按的情况(
BYTE(*KeyDownCallBack)(WORD,WORD);//键确认按下的回调函数指针(
void(*KeyUpCallBack)(WORD);//键抬起的回调函数指针(
}struct_KeyInfo;
voidDitherlessKey(struct_KeyInfo*pInfo);//消抖的处理函数(
#endif//_KEY_H
//消抖动的代码--------------------------------------------------------------
#include"Key.h"
//定时消抖的按键处理函数,通常在定时中断中调用,
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_SURE;//确认键已按下状态(
}
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->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=pInfo->CurKey;//保存上次按键值(
return;
}
//应用代码片段---------------------------------------------------------------------------------------
......
//声明按键回调函数(
BYTEKeyDownCallBack(WORDKey,WORDTimes);
BYTEKeyDownCallBack2(WORDKey,WORDTimes);
//按键处理数据结构(
staticstruct_KeyInfog_KeyInfo1={0,0,0,0,KeyDownCallBack};
staticstruct_KeyInfog_KeyInfo2={0,0,0,0,KeyDownCallBack2};
//////////////////////////////////////////////////////////////////////////
//TIMER2initialize-prescale:1024
//WGM:Normal
//desiredvalue:100Hz
//actualvalue:101.024Hz(1.0%)
#pragmainterrupt_handlertimer2_ovf_isr:iv_TIM2_OVF
voidtimer2_ovf_isr(void)
{
WORDtemp;
_TIMER2_LOAD;//reloadcountervalue
temp=Read165()^_KEY_MASK;//输入信息(
g_KeyInfo1.CurKey=temp&0x00FF;
DitherlessKey(&g_KeyInfo1);
g_KeyInfo2.CurKey=temp&0xFF00;//同一个消抖函数处理不同的按键(
剩余11页未读,继续阅读
资源评论
hitter_king
- 粉丝: 0
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功