在开发嵌入式系统或微控制器程序的过程中,我们经常遇到各种按钮要求,例如短按按钮,长按按钮和双击双击。
尽管这些功能并不难,但要编写好这些功能并不容易。
。
Internet上已经有这样的组件。
组件的功能如下:使用时,系统不会阻塞。
低耦合。
可以单击,双击和长按相同的按钮。
可以根据按钮的行顺序进行更改,例如高电平触发或低电平触发。
级别触发按钮检测组件的功能接口如下:1.初始化按钮/ ** * @name Init_Key_Struct * @brief初始化按钮* @param Update_Key_CallBack:更新按钮状态* @param Debug_CallBack:打印按钮调试信息* @retval 0:成功; * 1:Update_Key_CallBack == NULL; * / char Init_Key_Struct(void(* Update_Key_CallBack)(void),void(* Debug_CallBack)(unsigned char * debug_mess));参数Update_Key_CallBack用于更新键状态,即按下或释放,是的函数指针,该值不能为NULL。
参数Debug_CallBack用于打印按钮组件的异常信息,它也是一个函数指针。
如果不需要它,可以将此参数写入NULL。
2.注册按钮/ ** * @name Reg_Key * @brief添加注册按钮(注意:如果按钮已经注册,则再次注册将覆盖先前注册的相同按钮)* @param key_s:按钮状态* @param count :键计数* @param Trig_Mode_E:键触发模式* @param Key_Mode_E:键模式* @param Key_Click_CallBack:键触发回调* @retval 0:成功; * 1:Key_Click_CallBack == NULL; * 2:Key.Reg_Key_Num& gt; Key_Num_Max; * / Char Reg_Key(unsigned char * key_s,const unsigned short count,Trig_Mode_TypeDef Trig_Mode_E,Key_Mode_TypeDef Key_Mode_E,void(* Key_Click_CallBack)(void));参数key_s是按键的状态,即按键被按下或释放。
“在Update_Key_CallBack回调函数中。
参数计数是按钮计数,这意味着当按下按钮多少次时会触发相应的回调。
此回调是参数Key_Click_CallBack。
参数Trig_Mode_E表示按钮的启动方法。
该组件由枚举描述:/ ** * @简要键触发模式状态枚举* / typedef枚举(N_Trig = 0,/ *!< 0空* / L_Trig,/ *!< 1低级别触发器* / H_Trig,/ *!< 2高压Ping触发器* /} Trig_Mode_TypeDef;参数Key_Mode_E是按钮模式,共有三种类型:单击,双击和长按。
由枚举描述:/ ** * @简短按钮模式状态枚举* / typedef枚举{N_Click = 0,/ *!< 0空* / S_Click,/ *!< 1单击* / D_Click ,/ *!< 2双击* / L_Press,/ *!< 3长按* /} Key_Mode_TypeDef;参数Key_Click_CallBack是在相应模式下启动的回调函数,它是一个函数指针。
3.密钥检测/ ** * @name Key_Detect * @简短密钥检测* @param none * @retval 0:成功; * 1:Key.Update_Key_CallBack == NULL; * / char Key_Detect(void);使用此接口要检测按钮状态,请在使用此功能时定期召集。
当该函数返回0时,表示该函数已在运行。
如果返回1,则表示用于更新按钮级别状态的回调函数Update_Key_CallBack为空。
4.打印组件版本信息/ ** * @名称Get_Version_Mess * @简短打印Key_Detect组件版本信息* @param无* @retval返回Key_Detect组件版本信息* / char * Get_Version_Mess(void)我们分别是一,二和三这个按钮组件的核心功能,让我们看一下如何使用此组件。
以下是我使用Wildfire Overbearing F103开发板实现的示例。
该代码仅发布了部分内核:5.部分示例实现和说明// //单击按钮时的事件值#define KEY_SIGNAL 0 //长按按钮时的事件值#define KEY_LONG 1 //未发出按钮时的事件值#define KEY_NULL -1 / *按钮状态==>按下或释放* / uint8_t Key_Status = 0; / *键事件==>对应于单击,双击,长按* / int Key_Event = KEY_NULL; / *单击按钮时的回调* / void key_S_CallBack(void){Key_Event = KEY_SIGNAL;} / *长按该键时的回调* / void key_L_CallBack(void){Key_Event = KEY_LONG;} / *获取密钥状态* / void Get_Key_Status(void){Key_Status = HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin);} / *打印调试信息* / void Print_Debug_mess(unsigned char * debug_Mess){ (“%s " debug_Mess);} / ** * @brief应用程序入口点。
* @retval int * / int main(voi