From d939449267ce595f9500b355fd41c236f3174ad2 Mon Sep 17 00:00:00 2001 From: ZZY <2450266535@qq.com> Date: Sun, 29 Jun 2025 20:46:15 +0800 Subject: [PATCH] =?UTF-8?q?feat(ge=5Finterface):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=8C=89=E9=92=AE=E8=BE=93=E5=85=A5=E5=8A=9F=E8=83=BD=E5=B9=B6?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=AE=9A=E6=97=B6=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 button4_4 按钮输入模块,实现 4x4 按钮矩阵的扫描和处理 - 添加 ge_timer 模块,提供基本的定时功能 - 优化 ge_render 模块,调整屏幕尺寸的类型 - 修复 init_lcd 函数的定义,使其返回类型为 void --- libs/ge_interface/CMakeLists.txt | 0 libs/ge_interface/ge_render.c | 2 +- libs/ge_interface/ge_timer.c | 16 ++++ libs/ge_interface/include/ge_render.h | 2 +- libs/ge_interface/include/ge_timer.h | 8 +- libs/ge_interface/member/button4_4.c | 115 ++++++++++++++++++++++++ libs/ge_interface/member/button4_4.h | 30 +++++++ libs/ge_interface/member/ge_mem_input.h | 25 ++++++ 8 files changed, 192 insertions(+), 6 deletions(-) create mode 100644 libs/ge_interface/CMakeLists.txt create mode 100644 libs/ge_interface/member/button4_4.c create mode 100644 libs/ge_interface/member/button4_4.h create mode 100644 libs/ge_interface/member/ge_mem_input.h diff --git a/libs/ge_interface/CMakeLists.txt b/libs/ge_interface/CMakeLists.txt new file mode 100644 index 0000000..e69de29 diff --git a/libs/ge_interface/ge_render.c b/libs/ge_interface/ge_render.c index 0e541c4..642d9a2 100644 --- a/libs/ge_interface/ge_render.c +++ b/libs/ge_interface/ge_render.c @@ -135,7 +135,7 @@ static const struct { {0x29, 0, NULL} // Display on }; -static inline init_lcd() { +static inline void init_lcd() { lcd_reset(); //Reset before LCD Init. //LCD Init For 1.44Inch LCD Panel with ST7735R. diff --git a/libs/ge_interface/ge_timer.c b/libs/ge_interface/ge_timer.c index e69de29..16f3cdc 100644 --- a/libs/ge_interface/ge_timer.c +++ b/libs/ge_interface/ge_timer.c @@ -0,0 +1,16 @@ +#include "ge_interface.h" +#include "main.h" + +void ge_timer_sleepms(const ge_timer_t* timer, ge_time_t time) { + (void) timer; + HAL_Delay(time); +} + + +ge_timer_t ge_timer = { + .time = 0, + .func_getms = NULL, + .func_getus = NULL, + .func_sleepms = ge_timer_sleepms, + .func_sleepus = NULL, +}; \ No newline at end of file diff --git a/libs/ge_interface/include/ge_render.h b/libs/ge_interface/include/ge_render.h index 553a26c..b7f02da 100644 --- a/libs/ge_interface/include/ge_render.h +++ b/libs/ge_interface/include/ge_render.h @@ -29,7 +29,7 @@ typedef int(*ge_render_draw_resource_func_t)(ge_render_t* ctx, const ge_render_p struct ge_render { void* context; - const ge_render_pos2_t screen_size; + ge_render_pos2_t screen_size; ge_render_init_func_t init_func; ge_render_flush_func_t func_flush; diff --git a/libs/ge_interface/include/ge_timer.h b/libs/ge_interface/include/ge_timer.h index 060c82c..03fce0a 100644 --- a/libs/ge_interface/include/ge_timer.h +++ b/libs/ge_interface/include/ge_timer.h @@ -7,10 +7,10 @@ typedef uint64_t ge_time_t; struct ge_timer; typedef struct ge_timer ge_timer_t; -typedef void(*ge_timer_getus_func_t)(ge_timer_t* timer); -typedef void(*ge_timer_sleepus_func_t)(const ge_timer_t* timer); -typedef void(*ge_timer_getms_func_t)(ge_timer_t* timer); -typedef void(*ge_timer_sleepms_func_t)(const ge_timer_t* timer); +typedef ge_time_t(*ge_timer_getus_func_t)(ge_timer_t* timer); +typedef void(*ge_timer_sleepus_func_t)(const ge_timer_t* timer, ge_time_t time); +typedef ge_time_t(*ge_timer_getms_func_t)(ge_timer_t* timer); +typedef void(*ge_timer_sleepms_func_t)(const ge_timer_t* timer, ge_time_t time); struct ge_timer { ge_time_t time; diff --git a/libs/ge_interface/member/button4_4.c b/libs/ge_interface/member/button4_4.c new file mode 100644 index 0000000..1537267 --- /dev/null +++ b/libs/ge_interface/member/button4_4.c @@ -0,0 +1,115 @@ +// #include "stm32f10x.h" +// #include "led.h" +// #include "usart.h" +// #include "delay.h" +// #include "button4_4.h" +#define __GE_INPUT_IMPLIMEMT__ +#include "ge_mem_input.h" +struct IO_PORT +{ + GPIO_TypeDef *GPIO_x; + unsigned short GPIO_pin; +}; + +static struct IO_PORT KEY_OUT[4] = { + {KEY_H1_GPIO_Port, KEY_H1_Pin}, + {KEY_H2_GPIO_Port, KEY_H2_Pin}, + {KEY_H3_GPIO_Port, KEY_H3_Pin}, + {KEY_H4_GPIO_Port, KEY_H4_Pin} +}; + +static struct IO_PORT KEY_IN[4] = { + {KEY_L1_GPIO_Port, KEY_L1_Pin}, + {KEY_L2_GPIO_Port, KEY_L2_Pin}, + {KEY_L3_GPIO_Port, KEY_L3_Pin}, + {KEY_L4_GPIO_Port, KEY_L4_Pin} +}; + +int key[4][4]; +/* +void Button4_4_Init(void) { + GPIO_InitTypeDef GPIO_InitStructure; + unsigned char i; + + RCC_APB2PeriphClockCmd(KEY_GPIO_CLK, ENABLE); + + for(i = 0; i < 4; i++) { + GPIO_InitStructure.GPIO_Pin = KEY_OUT[i].GPIO_pin; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + + GPIO_Init(KEY_OUT[i].GPIO_x, &GPIO_InitStructure); + } + + + for(i = 0; i < 4; i++) { + GPIO_InitStructure.GPIO_Pin = KEY_IN[i].GPIO_pin; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + + GPIO_Init(KEY_IN[i].GPIO_x, &GPIO_InitStructure); + } + + + + + for(i = 0; i < 4; i++) { + GPIO_SetBits(KEY_OUT[i].GPIO_x, KEY_OUT[i].GPIO_pin); + } + + for(i = 0; i < 4; i++) { + key[i][0] = 0; + key[i][1] = 0; + key[i][2] = 0; + key[i][3] = 0; + } +} +*/ +//uint16_t key; + + + +int Button4_4_Scan(void) { + unsigned char i, j; + + for(i = 0; i < 4; i++) { + delay_ms(10); + GPIO_ResetBits(KEY_OUT[i].GPIO_x, KEY_OUT[i].GPIO_pin); + for(j = 0; j < 4; j++) { + + delay_ms(10); + if(GPIO_ReadInputDataBit(KEY_IN[j].GPIO_x, KEY_IN[j].GPIO_pin) == 0){ + + key[i][j] = 1; + } else { + + key[i][j] = 0; + } + } + + GPIO_SetBits(KEY_OUT[i].GPIO_x, KEY_OUT[i].GPIO_pin); + } + + if(key[0][0] == 1) return 16; + if(key[0][1] == 1) return 15; + if(key[0][2] == 1) return 14; + if(key[0][3] == 1) return 13; + + if(key[1][0] == 1) return 12; + if(key[1][1] == 1) return 11; + if(key[1][2] == 1) return 10; + if(key[1][3] == 1) return 9; + + if(key[2][0] == 1) return 8; + if(key[2][1] == 1) return 7; + if(key[2][2] == 1) return 6; + if(key[2][3] == 1) return 5; + + if(key[3][0] == 1) return 4; + if(key[3][1] == 1) return 3; + if(key[3][2] == 1) return 2; + if(key[3][3] == 1) return 1; + + return 0; +} + diff --git a/libs/ge_interface/member/button4_4.h b/libs/ge_interface/member/button4_4.h new file mode 100644 index 0000000..86c6d5e --- /dev/null +++ b/libs/ge_interface/member/button4_4.h @@ -0,0 +1,30 @@ +#ifndef __BUTTON4_4_H +#define __BUTTON4_4_H + +#define KEY_GPIO_CLK RCC_APB2Periph_GPIOC +#define KEY_L1_Pin GPIO_Pin_0 +#define KEY_L1_GPIO_Port GPIOC +#define KEY_L2_Pin GPIO_Pin_1 +#define KEY_L2_GPIO_Port GPIOC +#define KEY_L3_Pin GPIO_Pin_2 +#define KEY_L3_GPIO_Port GPIOC +#define KEY_L4_Pin GPIO_Pin_3 +#define KEY_L4_GPIO_Port GPIOC + +#define KEY_H1_Pin GPIO_Pin_4 +#define KEY_H1_GPIO_Port GPIOC +#define KEY_H2_Pin GPIO_Pin_5 +#define KEY_H2_GPIO_Port GPIOC +#define KEY_H3_Pin GPIO_Pin_6 +#define KEY_H3_GPIO_Port GPIOC +#define KEY_H4_Pin GPIO_Pin_7 +#define KEY_H4_GPIO_Port GPIOC + +//#define BTN_GET_BIT(num, pos) ( (num) & ( 1 << (pos) ) ) +//#define BTN_SET_TRUE(num, pos) ( (num) |= ( 1 << (pos) ) ) +//#define BTN_SET_FALSE(num, pos) ( (num) &= ( ~( 1 << (pos) ) ) ) + +void Button4_4_Init(void); +int Button4_4_Scan(void); + +#endif diff --git a/libs/ge_interface/member/ge_mem_input.h b/libs/ge_interface/member/ge_mem_input.h new file mode 100644 index 0000000..abd7231 --- /dev/null +++ b/libs/ge_interface/member/ge_mem_input.h @@ -0,0 +1,25 @@ +#ifndef __GE_MEM_INPUT_H__ +#define __GE_MEM_INPUT_H__ + +#include +#include +#include +#include "../ge_interface.h" +int Button4_4_Scan(void); + +#define delay_ms HAL_Delay +#define GPIO_ReadInputDataBit HAL_GPIO_ReadPin +#define GPIO_SetBits(port, pin) HAL_GPIO_WritePin(port, pin, 1) +#define GPIO_ResetBits(port, pin) HAL_GPIO_WritePin(port, pin, 0) +#ifdef __GE_INPUT_IMPLIMEMT__ + +void mem_input_btn_func(ge_input_t* ctx) { + uint16_t code = Button4_4_Scan(); + ge_input_event_t event; + event.num = GE_ITYPE_KEY_L1H1 + code; + ctx->func_send(ctx, event); +} + +#endif + +#endif