首页 > 其他分享 >组合按键移植

组合按键移植

时间:2023-11-30 19:22:18浏览次数:38  
标签:CODE KEY 组合 UP state key 按键 PRESS 移植

参考gitee移植,key_board: 用于单片机中的小巧多功能按键支持;最强功能:支持不限数量、任意按键、任意按键的任意状态之间的随意组合!!! (gitee.com)

支持:

  1. 矩阵键盘
  2. 单io按键

 注:在此没有做矩阵键盘,注意按键的电气属性设置,引脚初始化默认是按键上拉,按下为低电平,要根据实际修改。

F103ZET6

PE3 PE4 PA0

一、单个按键功能

移植包含key_board.ckey_board.hkey_board_config.h  key_board_sample.h key_board_sample.c (在此基础上修改即可)

一、key_board_sample.h 文件引脚信息

1.修改引脚宏​

2.添加按键数

3.修改引脚初始化时钟​

二、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>&copy; 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 */
}

 

​​

标签:CODE,KEY,组合,UP,state,key,按键,PRESS,移植
From: https://www.cnblogs.com/qsy-linux/p/17868068.html

相关文章

  • web前端tips:js继承——寄生组合式继承
    上篇文章给大家分享了js继承中的寄生式继承web前端tips:js继承——寄生式继承今天给大家分享一下js继承中的寄生组合式继承寄生组合式继承寄生组合式继承是一种结合了寄生式继承和组合式继承的方式,它的目标是减少组合式继承中多余的调用父类构造函数的开销。在组合式继承......
  • XmlRPC入门_组合类型操作
    1、数组操作#include<iostream>#include<winsock2.h>#include<windows.h>#include<xmlrpc-c/base.hpp>#include<xmlrpc-c/registry.hpp>#include<xmlrpc-c/server_abyss.hpp>#include<direct.h>#include<stdio.h&......
  • 代码随想训练营第四十四天(Python)| 完全背包、518. 零钱兑换 II 、377. 组合总和 Ⅳ
    [完全背包]有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。1、先遍历物品再遍历背包defall_bag(weight,value,bag_weight):dp=[0]*......
  • 【5.0】Python面向对象之组合
    【一】什么是组合在一个类中以另外一个类的对象作为数据属性,称为类的组合。【二】组合的使用组合与继承都是用来解决代码的重用性问题。不同的是:继承是一种“是”的关系,比如老师是人、学生是人,当类之间有很多相同的之处,应该使用继承;而组合则是一种“有”的关系,比如老......
  • FPGA入门笔记007_A——按键消抖模块设计与验证(状态机、$random、仿真模型、task语法)
    实验现象:每次按下按键0,4个LED显示状态以二进制加法格式加1。每次按下按键1,4个LED显示状态以二进制加法格式减1。知识点:1、testbench中随机数发生函数$random的使用;2、仿真模型的概念1、按键波形分析:按键未按,FPGA管脚检测到高电平。按键按下,FPGA管脚检测到低电平。2、设......
  • 实验10:组合模式
    本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解组合模式的动机,掌握该模式的结构;2、能够利用组合模式解决实际问题。 [实验任务一]:组合模式用透明组合模式实现教材中的“文件夹浏览”这个例子。1.文件的执行不需真正实现,只需简单提示即可;2.提交源代码;3.......
  • 将1234数字,组成不重复的3数字组合,并统计组合个数
    total=0forainrange(1,5):forbinrange(1,5):forcinrange(1,5):ifa!=banda!=candb!=c:total=total+1print(a,b,c)print(total) ......
  • 【DFS深度优先算法】全排列、组合总和
    全排列题目描述:给定一个没有重复数字的序列,返回其所有可能的全排列。题目链接:46.全排列输入描述:输入:[1,2,3]输出描述:输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]思路:依次从前往后把所有数字,固定在第0个位置,此时再从前往后把剩余数字依次固定在第1个位置,如此......
  • Realtek蓝牙Android10.0移植结束后的基本测试和常见问题分析
    基本测试主要包括配置检查和BT测试两大部分配置检查:为了进一步确保porting没有问题,在测试之前先确认fw以及config文件是否存在。adbshell到测试平台的根目录,检查测试平台的vendor/firmware/目录中rtlxxxx_fw以及rtlxxxx_config文件是否存在(xxxx为BTChip型号)......
  • Shell快捷按键
    Shell的快捷按键用来导航命令行的按键:按键全称含义Ctrl+F向前一个字符前进一个字符Ctrl+B向后一个字符前后一个字符Alt+F向前一个单词向前一个单词Alt+B向后一个单词向后一个单词Ctrl+A命令行开头转到当前命......