【STM32随笔 一】按键消抖处理
【随笔一】按键消抖处理
通过计数的形式,对按键进行消抖处理,而非用延时的形式,具体可向下查看。
一 、按键类型说明
以下定义了两个类型在接下来的程序下会用到,释义可看注释
//返回类型
typedef enum{
eErr_Ok, //返回成功
eErr_Fail //返回失败
}err_t;
//函数类型
typedef u8 (*KeyCallBack_t)(void);
//按键类型
typedef struct
{
u16 usCnt; //按键按下或者弹起计数
u8 ucActiveLevel; //有效电平
KeyCallBack_t ucValCallBack; //按键值回调函数
u16 usDebounDly; //消抖时间
}key_t;
二 、按键类型初始化
key_t 是按键类型,可查看(一)
key_t *pkey:需初始化的按键类型
u8 active:设置检测高电平还是低电平
u16 dly:设置消抖时间
可查看以下代码实现:
// An highlighted block
void vKey_Init(key_t *pkey,u8 active,u16 dly,KeyCallBack_t callback)
{
pkey->usCnt = 0;
pkey->ucActiveLevel = active;
pkey->ucValCallBack= callback;
pkey->usDebounDly = dly;
}
二 、按键消抖实现
如果当前按键电平等于设置的电平
{
计数值加1;
如果计数值大于等于设置的电平
{
计数值 = 边界值;//防止计数值累加溢出
返回成功;
}
}
否则
{
计数值清零;
}
返回失败;
以下是代码的实现:
err_t xKey_Detect(key_t *pkey)
{
if(pkey->ucValCallBack()==pkey->ucActiveLevel)
{
pkey->usCnt++; //
if(pkey->usCnt > pkey->usDebounDly) //
{
pkey->usCnt = pkey->usDebounDly; //
return eErr_Ok;
}
}
else
{
pkey->usCnt = 0;
}
return eErr_Fail;
}
三、在单片机中的实现
此代码是在stm32f407ve中实现的,只是对高电平消抖,如有兴趣自己可以对高低电平都消抖。这只是初始版本,以下是代码自己可下载:
在QQ群中可下载:857081287
如果觉得楼主写可以给个打赏(支付宝),让楼主更有信心写下去,谢谢!