# 通用按键程序 **Repository Path**: zfqcode/general-key-program ## Basic Information - **Project Name**: 通用按键程序 - **Description**: 通用按键程序,各芯片都可以直接调用相关程序 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2023-04-12 - **Last Updated**: 2023-08-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 通用按键程序 所有使用的函数 ```c void BtnInit(btn_t *handle,uint8_t(*get_status)(void)); void Btn_Func(btn_t *handle); void Btn_rising_Callback(btn_t *handle,void (*Btn_Rising_Callback)(void)); void Btn_trailing_Callback(btn_t *handle,void (*Btn_Trailing_Callback)(void)); void Btn_shortPress_Callback(btn_t *handle,void (*Btn_ShortPress_Callback)(void)); void Btn_longPress_Callback(btn_t *handle,void (*Btn_LongPress_Callback)(void)); void Btn_Quickdouble_Callback(btn_t *handle,void (*Btn_Double_Callback)(void)); void Btn_more_Callback(btn_t *handle,uint16_t cnt,uint8_t mode,void (*Btn_Double_Callback)(void)); ``` ## 定义结构体 ​ 例:定义一个按键结构体 ```c btn_t btn; ``` ​ ## 初始化函数 ```c void BtnInit(btn_t *handle,uint8_t(*get_status)(void)); ``` ​ 输入: ​ btn_t *handle:定义的按键结构体 ​ uint8_t(*get_status)(void):输入函数,这个函数是硬件获取按键状态的函数 输入为1或0。1是按下0是没按 ## 注册回调函数 ``` c void Btn_rising_Callback(btn_t *handle,void (*Btn_Rising_Callback)(void)); void Btn_trailing_Callback(btn_t *handle,void (*Btn_Trailing_Callback)(void)); void Btn_shortPress_Callback(btn_t *handle,void (*Btn_ShortPress_Callback)(void)); void Btn_longPress_Callback(btn_t *handle,void (*Btn_LongPress_Callback)(void)); void Btn_Quickdouble_Callback(btn_t *handle,void (*Btn_Double_Callback)(void)); void Btn_more_Callback(btn_t *handle,uint16_t cnt,uint8_t mode,void (*Btn_Double_Callback)(void)); ``` 一共六个函数,从上到下分别代表上升沿、下降沿、单击、长按、双击、多次按下,六种不同情况。足以应付所有按键相关的需求。 输入: ​ btn_t *handle :定义的按键结构体 ​ void (*Btn_Rising_Callback)(void):回调函数,在触发当前情况时会自动调用这个函数。 ## 循环调用 ```c void Btn_Func(btn_t *handle); ``` 把这个函数放在1ms/次的定时器中 ## 例程 stm32: ```c #include "button.h" btn_t btn; uint8_t KEY_1(void) { if ((KEY1_GPIO_Port->IDR & KEY1_Pin) != (uint32_t)GPIO_PIN_RESET) { return 1; } else { return 0; } } void LED1_Toggle_Callback() { LED1_TOGGLE(); } void LED2_Toggle_Callback() { LED2_TOGGLE(); } void LED3_Toggle_Callback() { LED3_TOGGLE(); } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM1) //1ms { Btn_Func(&btn); } } void Init() { HAL_TIM_Base_Start_IT(&htim1); BtnInit(&btn,KEY_1); Btn_shortPress_Callback(&btn[2],LED1_Toggle_Callback); Btn_longPress_Callback(&btn[1],LED2_Toggle_Callback); Btn_Quickdouble_Callback(&btn[2],LED3_Toggle_Callback); } void main() { Init(); while(1) { } } ```