ButtonDrive icon indicating copy to clipboard operation
ButtonDrive copied to clipboard

纯C语言实现的一个按键驱动,可移植性强,支持单双击、连按、连按释放、长按;采用回调处理按键事件(自定义消抖时间),使用只需3步,1:创建按键,2:按键事件与回调处理函数链接映射。然后周期检查按键。

Results 8 ButtonDrive issues
Sort by recently updated
recently updated
newest added

建议读取电平函数指针 带1-2个参数, 读取该 button 连接的引脚 需要知道 引脚的数值不是吗?

``` void Button_Cycle_Process(Button_t *btn) { uint8_t current_level = (uint8_t)btn->Read_Button_Level();//获取当前按键电平 if((current_level != btn->Button_Last_Level)&&(++(btn->Debounce_Time) >= BUTTON_DEBOUNCE_TIME)) //按键电平发生变化,消抖 { btn->Button_Last_Level = current_level; //更新当前按键电平 btn->Debounce_Time = 0; //确定了是按下 ...... } ...... } ``` btn->Debounce_Time仅在if内清零,如果发生多次抖动,btn->Debounce_Time依然会累加,并最终被认为是一次有效按键。应该修改为:...

实际应用中可能有很多按键,如果一个按键对应一个IO 太浪费资源了!

原来在长按释放的时候会有很大概率触发一次短按事件,因为长按后必须等到 BUTTON_LONG_CYCLE 延时后 btn->Button_Trigger_Event 才能赋值为 BUTTON_LONG,如果在赋值为 BUTTON_LONG 之前释放按键,那么 btn->Button_Trigger_Event = BUTTON_DOWM,就会触发 BUTTON_DOWM事件,更改后长按不会触发短按事件。

uint8_t Button_State :4 ; /* 按键当前状态(按下还是弹起) */ uint8_t Button_Last_State :4 ; /* 上一次的按键状态,用于判断双击 */ uint8_t Button_Trigger_Level :2 ; /* 按键触发电平 */ uint8_t Button_Last_Level :2 ; /* 按键当前电平 */ 环境:IAR,stm8,实测,这几个的位域操作与stm8的io电平读取返回函数冲突, return...

BUTTON_CONTINUOS,应为continous,强迫症看着很难受啊

是否可以跳过np和xtrap的检测