Files
STM32F103/STM32F103C8T6/Drivers/BSP/MultiButton/button_driver.c

193 lines
5.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 模块名称:按键驱动适配层
* 模块功能提供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]);
}