组合按键移植
参考gitee移植,key_board: 用于单片机中的小巧多功能按键支持;最强功能:支持不限数量、任意按键、任意按键的任意状态之间的随意组合!!! (gitee.com)
支持:
- 矩阵键盘
- 单io按键
注:在此没有做矩阵键盘,注意按键的电气属性设置,引脚初始化默认是按键上拉,按下为低电平,要根据实际修改。
F103ZET6
PE3 PE4 PA0
一、单个按键功能
移植包含key_board.c
,key_board.h
,key_board_config.h key_board_sample.h key_board_sample.c (在此基础上修改即可)
一、key_board_sample.h 文件引脚信息
1.修改引脚宏
2.添加按键数
二、key_board_sample.c文件引脚信息
1.添加按键引脚信息
2.定义按键id及功能结构体
二、组合按键
main.c中
结构体功能初始化
查看代码
static unsigned int test_id1, test_id2; //注册组合状态 const struct key_combine_t test_combine1[] = { { .id = KEY_UP, .state = KEY_PRESS }, { .id = KEY_DOWN, .state = KEY_PRESS_LONG }, { .id = KEY_UP, .state = KEY_PRESS }, }; const struct key_combine_t test_combine2[] = { { .id = KEY_UP, .state = KEY_PRESS }, { .id = KEY_DOWN, .state = KEY_PRESS }, { .id = KEY_UP, .state = KEY_PRESS }, { .id = KEY_DOWN, .state = KEY_PRESS }, };
循环执行
查看代码
//组合按键 if(key_check_combine_state(test_id1)) { printf("combine test_id1\r\n"); } if(key_check_combine_state(test_id2)) { printf("combine test_id2\r\n"); }
main.c的源码
/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * <h2><center>© Copyright (c) 2023 STMicroelectronics. * All rights reserved.</center></h2> * * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "tim.h" #include "usart.h" #include "gpio.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "Printf_Use.h" #include "key_board.h" #include "key_board_sample.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ #define DEBUG_ON 1 /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ static unsigned int test_id1, test_id2; //注册组合状态 const struct key_combine_t test_combine1[] = { { .id = KEY_UP, .state = KEY_PRESS }, { .id = KEY_DOWN, .state = KEY_PRESS_LONG }, { .id = KEY_UP, .state = KEY_PRESS }, }; const struct key_combine_t test_combine2[] = { { .id = KEY_UP, .state = KEY_PRESS }, { .id = KEY_DOWN, .state = KEY_PRESS }, { .id = KEY_UP, .state = KEY_PRESS }, { .id = KEY_DOWN, .state = KEY_PRESS }, }; void key_print_debug_callback(const char *str) { printf("%s\n", str); } /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_TIM7_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ //串口重定向 RetargetInit(&huart1); //按键初始化 //注册调试接口 key_board_debug_register(key_print_debug_callback); //初始化硬件及按键 GPIO_Key_Board_Init(); MX_GPIO_Init(); //初始化定时器 MX_TIM7_Init(); printf("start running\n"); test_id1 = key_combine_register(test_combine1, GET_ARRAY_SIZE(test_combine1)); test_id2 = key_combine_register(test_combine2, GET_ARRAY_SIZE(test_combine2)); unsigned int res; /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ //up if(key_check_state(KEY_UP, KEY_RELEASE)) { printf("KEY_UP KEY_RELEASE\r\n"); } if(key_check_state(KEY_UP, KEY_PRESS)) { printf("KEY_UP KEY_PRESS\r\n"); HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5); } if(key_check_state(KEY_UP, KEY_PRESS_LONG)) { printf("KEY_UP KEY_PRESS_LONG\r\n"); } if(key_check_state(KEY_UP, KEY_RELEASE_LONG)) { printf("KEY_UP KEY_RELEASE_LONG\r\n"); } //---------------------------------------------------------- res = key_check_state(KEY_UP, KEY_PRESS_MULTI); if(res) { printf("KEY_UP KEY_PRESS_MULTI:%d\r\n", res); } res = key_check_state(KEY_UP, KEY_RELEASE_MULTI); if(res) { printf("KEY_UP KEY_RELEASE_MULTI:%d\r\n", res); } if(key_check_state(KEY_UP, KEY_PRESS_CONTINUOUS)) { printf("KEY_UP KEY_PRESS_CONTINUOUS\r\n"); } //down if(key_check_state(KEY_DOWN, KEY_RELEASE)) { printf("KEY_DOWN KEY_RELEASE\r\n"); HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5); } if(key_check_state(KEY_DOWN, KEY_PRESS)) { printf("KEY_DOWN KEY_PRESS\r\n"); } if(key_check_state(KEY_DOWN, KEY_PRESS_LONG)) { printf("KEY_DOWN KEY_PRESS_LONG\r\n"); } if(key_check_state(KEY_DOWN, KEY_RELEASE_LONG)) { printf("KEY_DOWN KEY_RELEASE_LONG\r\n"); } res = key_check_state(KEY_DOWN, KEY_PRESS_MULTI); if(res) { printf("KEY_DOWN KEY_PRESS_MULTI:%d\r\n", res); } res = key_check_state(KEY_DOWN, KEY_RELEASE_MULTI); if(res) { printf("KEY_DOWN KEY_RELEASE_MULTI:%d\r\n", res); } if(key_check_state(KEY_DOWN, KEY_PRESS_CONTINUOUS)) { printf("KEY_DOWN KEY_PRESS_CONTINUOUS\r\n"); } //WK_UP if(key_check_state(KEY_WK_UP, KEY_RELEASE)) { printf("KEY_WK_UP KEY_RELEASE\r\n"); } if(key_check_state(KEY_WK_UP, KEY_PRESS)) { printf("KEY_WK_UP KEY_PRESS\r\n"); HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5); } if(key_check_state(KEY_WK_UP, KEY_PRESS_LONG)) { printf("KEY_WK_UP KEY_PRESS_LONG\r\n"); } if(key_check_state(KEY_WK_UP, KEY_RELEASE_LONG)) { printf("KEY_WK_UP KEY_RELEASE_LONG\r\n"); } //---------------------------------------------------------- res = key_check_state(KEY_WK_UP, KEY_PRESS_MULTI); if(res) { printf("KEY_WK_UP KEY_PRESS_MULTI:%d\r\n", res); } res = key_check_state(KEY_WK_UP, KEY_RELEASE_MULTI); if(res) { printf("KEY_WK_UP KEY_RELEASE_MULTI:%d\r\n", res); } if(key_check_state(KEY_WK_UP, KEY_PRESS_CONTINUOUS)) { printf("KEY_WK_UP KEY_PRESS_CONTINUOUS\r\n"); } //组合按键 if(key_check_combine_state(test_id1)) { printf("combine test_id1\r\n"); } if(key_check_combine_state(test_id2)) { printf("combine test_id2\r\n"); } } /* USER CODE END 3 */ }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构