作者:书友55218170 | 来源:互联网 | 2024-10-10 01:25
【STM32随笔一】按键消抖处理【STM32随笔一】按键消抖处理通过计数的形式,对按键进行消抖处理,而非用延时的形式,具体可向下查看。一、按键类型说明以下定义了两个类型在接下
【STM32随笔 一】按键消抖处理
【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:设置消抖时间
可查看以下代码实现:
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
如果觉得楼主写可以给个打赏(支付宝),让楼主更有信心写下去,谢谢!