【STM32随笔 一】按键消抖处理

tech2023-01-11  118

【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:设置消抖时间 可查看以下代码实现:

// 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 如果觉得楼主写可以给个打赏(支付宝),让楼主更有信心写下去,谢谢!

最新回复(0)