193 lines
5.4 KiB
C
193 lines
5.4 KiB
C
/*
|
||
* 模块名称:按键驱动适配层
|
||
* 模块功能:提供MultiButton库与STM32 HAL库的适配接口
|
||
* 适用平台:STM32F103C8T6
|
||
* 作者:王建锋
|
||
* 创建日期:2026-07-13
|
||
* 修改记录:
|
||
* 2026-07-13 王建锋 创建初始版本
|
||
*/
|
||
|
||
#include "button_driver.h"
|
||
#include "main.h"
|
||
#include <stdio.h>
|
||
|
||
/* 按键句柄数组 */
|
||
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]);
|
||
}
|