软件SPI可以驱动屏幕

This commit is contained in:
2026-07-14 14:44:07 +08:00
parent 3577003fb6
commit 0a5c478a42
53 changed files with 9354 additions and 87 deletions

View File

@@ -0,0 +1,192 @@
/*
* 模块名称:按键驱动适配层
* 模块功能提供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]);
}