/* * 模块名称:按键驱动适配层 * 模块功能:提供MultiButton库与STM32 HAL库的适配接口 * 适用平台:STM32F103C8T6 * 作者:王建锋 * 创建日期:2026-07-13 * 修改记录: * 2026-07-13 王建锋 创建初始版本 */ #include "button_driver.h" #include "main.h" #include /* 按键句柄数组 */ static Button s_button_handles[BUTTON_ID_MAX]; /* 按键GPIO端口和引脚映射表 */ typedef struct { GPIO_TypeDef* port; /* GPIO端口 */ uint16_t pin; /* GPIO引脚 */ } ButtonGpio_t; static const ButtonGpio_t s_button_gpio[BUTTON_ID_MAX] = { {KEY1_GPIO_Port, KEY1_Pin}, /* KEY1: PB4 左上*/ {KEY2_GPIO_Port, KEY2_Pin}, /* KEY2: PB5 右上*/ {KEY3_GPIO_Port, KEY3_Pin}, /* KEY3: PB3 右下*/ {KEY4_GPIO_Port, KEY4_Pin}, /* KEY4: PC14 左下*/ {KEY5_GPIO_Port, KEY5_Pin}, /* KEY5: PC15 中间*/ }; /* * 函数功能:获取指定按键的电平状态 * 入口参数:button_id - 按键标识符 * 返回值:GPIO电平值 (0或1) * 函数说明:根据按键ID读取对应GPIO引脚的电平 */ uint8_t button_driver_read_level(uint8_t button_id) { if (button_id >= BUTTON_ID_MAX) { return 0; } return HAL_GPIO_ReadPin(s_button_gpio[button_id].port, s_button_gpio[button_id].pin); } /* * 函数功能:KEY1按键回调函数 * 入口参数:handle - 按键句柄 * user_data - 用户数据指针 * 返回值:无 * 函数说明:KEY1按下时翻转LED */ static void button_key1_callback(Button* handle, void* user_data) { (void)handle; (void)user_data; printf("KEY1\n"); } /* * 函数功能:KEY2单击回调函数 * 入口参数:handle - 按键句柄 * user_data - 用户数据指针 * 返回值:无 * 函数说明:KEY2单击时点亮LED */ static void button_key2_single_click(Button* handle, void* user_data) { (void)handle; (void)user_data; printf("KEY2\n"); } /* * 函数功能:KEY3单击回调函数 * 入口参数:handle - 按键句柄 * user_data - 用户数据指针 * 返回值:无 * 函数说明:KEY3单击事件处理 */ static void button_key3_single_click(Button* handle, void* user_data) { (void)handle; (void)user_data; printf("KEY3: \n"); } /* * 函数功能:KEY4单击回调函数 * 入口参数:handle - 按键句柄 * user_data - 用户数据指针 * 返回值:无 * 函数说明:KEY4单击事件处理 */ static void button_key4_single_click(Button* handle, void* user_data) { (void)handle; (void)user_data; printf("KEY4\n"); } /* * 函数功能:KEY5单击回调函数 * 入口参数:handle - 按键句柄 * user_data - 用户数据指针 * 返回值:无 * 函数说明:KEY5单击事件处理 */ static void button_key5_single_click(Button* handle, void* user_data) { (void)handle; (void)user_data; printf("KEY5\n"); } /* * 函数功能:按键驱动初始化 * 入口参数:无 * 返回值:无 * 函数说明:初始化所有按键对象,注册回调函数,启动按键轮询 */ void button_driver_init(void) { /* 初始化KEY1 */ button_init(&s_button_handles[BUTTON_ID_KEY1], button_driver_read_level, BUTTON_ACTIVE_LEVEL_LOW, BUTTON_ID_KEY1); button_attach(&s_button_handles[BUTTON_ID_KEY1], BTN_SINGLE_CLICK, button_key1_callback, NULL); button_start(&s_button_handles[BUTTON_ID_KEY1]); /* 初始化KEY2 */ button_init(&s_button_handles[BUTTON_ID_KEY2], button_driver_read_level, BUTTON_ACTIVE_LEVEL_LOW, BUTTON_ID_KEY2); button_attach(&s_button_handles[BUTTON_ID_KEY2], BTN_SINGLE_CLICK, button_key2_single_click, NULL); button_start(&s_button_handles[BUTTON_ID_KEY2]); /* 初始化KEY3 */ button_init(&s_button_handles[BUTTON_ID_KEY3], button_driver_read_level, BUTTON_ACTIVE_LEVEL_LOW, BUTTON_ID_KEY3); button_attach(&s_button_handles[BUTTON_ID_KEY3], BTN_SINGLE_CLICK, button_key3_single_click, NULL); button_start(&s_button_handles[BUTTON_ID_KEY3]); /* 初始化KEY4 */ button_init(&s_button_handles[BUTTON_ID_KEY4], button_driver_read_level, BUTTON_ACTIVE_LEVEL_LOW, BUTTON_ID_KEY4); button_attach(&s_button_handles[BUTTON_ID_KEY4], BTN_SINGLE_CLICK, button_key4_single_click, NULL); button_start(&s_button_handles[BUTTON_ID_KEY4]); /* 初始化KEY5 */ button_init(&s_button_handles[BUTTON_ID_KEY5], button_driver_read_level, BUTTON_ACTIVE_LEVEL_LOW, BUTTON_ID_KEY5); button_attach(&s_button_handles[BUTTON_ID_KEY5], BTN_SINGLE_CLICK, button_key5_single_click, NULL); button_start(&s_button_handles[BUTTON_ID_KEY5]); } /* * 函数功能:获取指定按键的事件 * 入口参数:button_id - 按键标识符 * 返回值:按键事件 * 函数说明:返回指定按键的当前事件 */ ButtonEvent button_driver_get_event(uint8_t button_id) { if (button_id >= BUTTON_ID_MAX) { return BTN_NONE_PRESS; } return button_get_event(&s_button_handles[button_id]); }