开源! ! ! 轻量级多功能按键驱动-LiteButton

简介: 开源! ! ! 轻量级多功能按键驱动-LiteButton

[ 序 言 ]
   按键是大多项目上都有的外设模块,分独立按键和ADC按键。本篇文章介绍的时实现的独立按键的驱动,优点在于能快速的搭建框架,减少工程师的工作量,加速产品落地,模块化的安装LiteButton。进而实现多功能的按键需求。

[ 开 源 仓 库 地 址 ]
Gitee:https://gitee.com/one-hundred-and-twenty-three11/lite-button  
   欢迎大家测试提出bug,可以私信我解bug。各位也可以提交代码上去,供大家一起学习、改进LiteButton。最新的代码也会同步到master分支上。

[ LiteButton 功 能 ]
1、实现按键的按下、抬起、单击、双击、长按开始、长按保持、长按抬起事件的触发,并利用回调函数解耦。
2、实现按键的添加,多个按键时,只要使用lite_button_add添加即可。
3、某个按键的移除,移除之后该按键不会触发任何事件。
4、按键扫描的可控化,lite_button_run和lite_button_stop实现按键的扫描控制,便于在不需要触发任何按键事件的时候调用。且停止后可以再次启用。
5、销毁按键列表,回收内存空间。按键用完之后可以彻底销毁按键列表。

6、实现按键的连击功能

[ LiteButton API 接 口 ]

extern void lite_button_config(bsp_button_config button_config, uint16_t button_num);
extern void lite_button_add(Button *button, uint8_t active_level, read_gpio read_button, event_cb callback_fun);
extern void lite_button_remove(Button *button);
extern void lite_button_destroy(void);
extern void lite_button_run(void);
extern void lite_button_stop(void);
extern void lite_button_scan(void);

[ LiteButton 测试代码 ]

#include <stdio.h>
#include "LiteButton.h"
Button Button0, Button1, Button2;
void Button0_Callback(ButtonEvent event)
{
    switch(event)
    {
        case BUTTON_DOWN            : log_i("Button0 down.\r\n");               break;
        case BUTTON_UP              : log_i("Button0 up.\r\n");                 break;
        case BUTTON_PRESS_REPEAT    : log_i("Button0 repeat.\r\n");             break;
        case BUTTON_SINGLE_CLICK    : log_i("Button0 single click.\r\n");       break;
        case BUTTON_DOUBLE_CLICK    : log_i("Button0 double click.\r\n");       break;
        case BUTTON_LONG_PRESS_START: log_i("Button0 long press start.\r\n");   break;
        case BUTTON_LONG_PRESS_HOLD : log_i("Button0 long press hold.\r\n");    break;
        case BUTTON_LONG_PRESS_UP   : log_i("Button0 long press up.\r\n");      break;
        default: break;
    }
}
void Button1_Callback(ButtonEvent event)
{
  ...
}
void Button2_Callback(ButtonEvent event)
{
  ...
}
int main(void)
{
    /* bsp_button_config:硬件层初始化按键GPIO的接口  3:共有几个独立按键 */
    lite_button_config(bsp_button_config, 3);
    /* 添加独立按键 */
    lite_button_add(&Button0, 0, read_but0_gpio, but0_cb);
    lite_button_add(&Button1, 0, read_but1_gpio, but1_cb);
    lite_button_add(&Button2, 0, read_but2_gpio, but2_cb);
    .....
    /* 从按键列表中移除按键0,移除之后该按键无效 */
    lite_button_remove(&Button0);
    /* 停止运行按键扫描,停止之后可使用lite_button_run再启用 */
    lite_button_stop();
    /* 运行按键扫描,默认lite button初始化就运行 */
    lite_button_run();
    /* 该函数调用后所有的按键都无法使用,且按键列表被摧毁让系统回收,重新使用只能重新lite_button_config再添加按键 */
    lite_button_destroy();
    for(;;)
    {   
        /* 每隔5ms调用一次 */
        if(!(ticks % 5))
            lite_button_scan();
    }
    return 0;
}

  测试代码中使用滴答定时器每隔5ms运行一次lite_button_scan函数,扫描按键列表中的所有按键。使用RTOS的可以在任务中直接调用处理,类似这样:

void KeyScan_Task(void *pvParameters)
{
    Button button0;
    /* Button initialization */
    lite_button_config(bsp_KeyConfig, 2);
    /* Add button */
    lite_button_add(&button0, 0, bsp_ReadButton0, Button0_Callback);
    for(;;)
    {
        /* Key processing */
        lite_button_scan();
        vTaskDelay(SCAN_CYCLE);     
    }    
}

   SCAN_CYCLE是由LiteButton.h中提供的,默认是5ms

[ 结 语 ]
   文章至此就结束啦,项目代码在Gitee上拉取测试,拉代码的时候也记得顺带star下哦,也欢迎各位大佬提交优化代码,和我一起完善LiteButton吧,文章反馈不错的话就把ADC按键也集成进LiteButton中,配置可裁剪。

   如果觉得本篇文章多少有点帮助的话,求赞、关注、评论、转发,创作不易!你们的支持是小编创作最大动力。

相关文章
|
5月前
|
边缘计算 安全 中间件
软件体系结构 - 嵌入式系统(4)- 嵌入式中间件
软件体系结构 - 嵌入式系统(4)- 嵌入式中间件
186 0
|
自然语言处理 JavaScript 前端开发
Duktape:一个新的小巧的超精简可嵌入式JavaScript引擎
Duktape是一个可嵌入的Javascript引擎,主要关注便携性和精简及紧凑性。 Duktape很容易集成到C/C++项目: 添加duktape.c和duktape.h到您的build中,并使用Duktape API从C代码中,调用ECMAScript代码的功能,反之亦然。
1385 0
|
2月前
|
缓存 开发者 测试技术
跨平台应用开发必备秘籍:运用 Uno Platform 打造高性能与优雅设计兼备的多平台应用,全面解析从代码共享到最佳实践的每一个细节
【8月更文挑战第31天】Uno Platform 是一种强大的工具,允许开发者使用 C# 和 XAML 构建跨平台应用。本文探讨了 Uno Platform 中实现跨平台应用的最佳实践,包括代码共享、平台特定功能、性能优化及测试等方面。通过共享代码、采用 MVVM 模式、使用条件编译指令以及优化性能,开发者可以高效构建高质量应用。Uno Platform 支持多种测试方法,确保应用在各平台上的稳定性和可靠性。这使得 Uno Platform 成为个人项目和企业应用的理想选择。
49 0
|
5月前
|
开发工具 C语言 git
【嵌入式开源库】MultiButton的使用,简单易用的事件驱动型按键驱动模块
【嵌入式开源库】MultiButton的使用,简单易用的事件驱动型按键驱动模块
112 0
|
5月前
|
API 开发工具 C语言
【嵌入式开源库】EasyLogger的使用, 一款轻量级且高性能的日志库
【嵌入式开源库】EasyLogger的使用, 一款轻量级且高性能的日志库
703 0
|
5月前
|
开发工具 C语言 git
【嵌入式开源库】MultiTimer 的使用,一款可无限扩展的软件定时器
【嵌入式开源库】MultiTimer 的使用,一款可无限扩展的软件定时器
|
5月前
|
Linux iOS开发 MacOS
Star 10.4k!推荐一款国产跨平台、轻量级的文本编辑器,内置代码对比功能
Star 10.4k!推荐一款国产跨平台、轻量级的文本编辑器,内置代码对比功能
|
5月前
|
存储 传感器 缓存
面向嵌入式系统的轻量级框架分析
面向嵌入式系统的轻量级框架分析
123 1
|
11月前
|
设计模式 算法 开发者
嵌入式框架设计中的四种常用模式
嵌入式框架设计中的四种常用模式
134 0
|
传感器 编解码 缓存
实战贴:开源GUI LittlevGL在MCU上的移植
实战贴:开源GUI LittlevGL在MCU上的移植
234 2