开源库介绍

MultiButtonMultiButton
一个高效、灵活的多按键状态机库,支持多种按键事件检测。

将MultiButton添加进入工程

使用git工具下载源码

==安装git工具==可以参考:视频-安装git

在工程中创建Bsp文件夹,专门用于放单片机的底层驱动代码的文件,做到程序的分层设计,这也方便后续工程的直接迁移使用,在软件中,直接进去这个Bsp文件夹中,运行Git Bash,下载源码!

git clone https://github.com/0x1abin/MultiButton.git
或者
git clone https://gitclone.com/github.com/0x1abin/MultiButton.git(使用GitHub镜像)

整个文件的结构是这样的:

排除不需要的文件

将除了Bsp\MultiButton\multi_button.c ,Bsp\MultiButton\multi_button.h ,Bsp\MultiButton\README.md 这三个文件之外的文件/文件夹,排除编译。只需要右键单击文件/文件夹,然后选择排除编译就可。

将创建的文件加入编译器

最重要的是,将创建的文件,添加进编译,和keil类似,入口在--工程->属性,具体操作如下:

这样就可以正常的编译,并在工程中被应用。

编写应用代码

接下来,README.md中有这个库的介绍和使用说明,直接看到快速开始部分,照做。

我创建了一个新的按键相关的文件,专门写案件相关的初始化和驱动函数Bsp\bsp_multibutton\bsp_multibutton.cBsp\bsp_multibutton\bsp_multibutton.h同样需要将这些加入进编译器配置

编写bsp_multibutton.c文件

以PA2和PA0做演示,前提将PA2配置为按键输入,PA0配置为LED灯的输出。那这个演示的代码实现的效果就是,按下按键,灯点亮,再次按下灯熄灭,就是灯在亮灭之间循环。
这个是GPIO相关的函数解释:GPIO库函数解释

#include "bsp_multibutton.h"

#define BUTTON1_GPIO_Port GPIOA
#define BUTTON1_Pin GPIO_Pin_2

// 前向声明
void btn1_single_click_handler(Button *btn);
// 定义按键
static Button btn1;

// 实现对GPIO 读取函数
uint8_t read_button_gpio(uint8_t button_id)
{
    switch (button_id)
    {
    case 1:
        return GPIO_ReadInputDataBit(BUTTON1_GPIO_Port, BUTTON1_Pin);
    default:
        return 0;
    }
}

// 按键回调函数
void btn1_single_click_handler(Button *btn)
{
    // 使用三元运算符
    uint8_t current_state = GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0);
    GPIO_WriteBit(GPIOA, GPIO_Pin_0, current_state ? Bit_RESET : Bit_SET);
}

// 初始化按键
void bsp_multibutton_init(void)
{
    // 初始化按键 (active_level: 0=低电平有效, 1=高电平有效)
    button_init(&btn1, read_button_gpio, 0, 1);
    button_attach(&btn1, BTN_SINGLE_CLICK, btn1_single_click_handler);
    button_start(&btn1); // 开始检测按键
}

编写bsp_multibutton.h文件

#ifndef __BSP_MULTIBUTTON_H
#define __BSP_MULTIBUTTON_H

#include "debug.h"
#include "multi_button.h"

void bsp_multibutton_init(void);

#endif //__BSP_MULTIBUTTON_H