lwbtn:一套用 C11 写的按钮库,专门帮你把各种按键的去抖、单击、双击、长按全搞定,不依赖任何操作系统,零动态内存分配

 


lwbtn 是什么?
lwbtn(Lightweight button manager)其实就是一套用 C(C11)写的按钮库,专门帮你把各种按键的去抖、单击、双击、长按全搞定。它不依赖任何操作系统,只要你能提供一个毫秒级的计时函数,就能跑。最关键的是——零动态内存分配,所以在资源紧张的 MCU 上也毫无压力。


它解决了哪些痛点?

常见痛点

lwbtn 的解决方案

按键抖动导致误触

软件去抖(可自定义抖动时间)

需要区分单击、双击、长按

事件回调统一管理,支持多种事件

手写状态机容易出错

回调驱动,库内部自动维护状态机

动态内存导致碎片

完全静态分配,零 malloc

跨平台移植困难

只要实现两句回调函数,几乎不改代码

说白了,把“写按钮状态机”这件事交给 lwbtn,你只管写业务,省时省力。


安装 & 使用步骤

  1. 1. 拉代码

    git clone https://github.com/MaJerle/lwbtn.git
  • 2. 在工程里加入 lwbtn.h / lwbtn.c,把它们编进你的编译链。

  • 3. 实现两段必备回调(下面给个最简例子):

    // 读取硬件按键状态,返回 1=按下,0=松开
    uint8_t btn_get_state(struct lwbtn *lw, struct lwbtn_btn *btn) {
        // 这里自行读取 GPIO,假设低电平有效
        return (GPIO_ReadPin(btn->arg) == 0);
    }

    // 按键事件回调,统一在这里处理业务
    void btn_event(struct lwbtn *lw, struct lwbtn_btn *btn, lwbtn_evt_t evt) {
        switch (evt) {
            case LWBTN_EVT_ONPRESS:   /* 按下 */   /* … */ break;
            case LWBTN_EVT_ONRELEASE: /* 松开 */   /* … */ break;
            case LWBTN_EVT_ONCLICK:   /* 单击 */   /* … */ break;
            case LWBTN_EVT_KEEPALIVE: /* 长按期间 *//* … */ break;
            default: break;
        }
    }
  • 4. 定义按钮数组(每个按钮可以挂个自定义 arg,常用来存 GPIO 引脚号):

    static lwbtn_btn_t btns[] = {
        {.arg = (void*)PIN_KEY1},
        {.arg = (void*)PIN_KEY2},
        // … 根据实际按键数目添加
    };
  • 5. 初始化库:

    lwbtn_init_ex(NULL, btns, sizeof(btns)/sizeof(btns[0]),
                  btn_get_state, btn_event);
  • 6. 在主循环或定时中调用(传入当前毫秒计时):

    while (1) {
        lwbtn_process_ex(NULL, get_tick_ms());
        // 其它业务代码...
    }
  • 大概就是这么几步,几乎没有坑。


    优缺点速评

    优点

    缺点

    零 malloc

    ,极低内存占用

    需要用户自行提供计时函数

    事件回调统一,代码结构清晰

    多配置项(去抖时间、点击窗口等)需要调参

    支持多种事件(单击/双击/长按/keep‑alive)

    只提供库层,UI 显示仍需自行实现

    MIT 开源,随意商用

    目前仅提供 C 接口,缺少 C++/Python 包装

    跨平台,只要实现两回调即可跑

    对硬件平台的抽象较薄,需要自行处理 GPIO 低/高电平差异

    总体来说,如果你在做 MCU 项目,想要一个轻量、可靠、可定制的按钮处理库,lwbtn 几乎是首选。


    小结
    lwbtn 把“按钮去抖+事件识别”这件事封装成一个小巧的库,省去你手写状态机的烦恼。它不占内存、不依赖 OS、MIT 许可,几行代码就能把键盘、遥控器甚至自定义按键的复杂交互搞定。只要把计时函数和 GPIO 读取写进去,剩下的就交给库自己跑。要是你的项目里有多种按键需求,赶紧拽上 lwbtn,省时又省力!

    项目地址:https://github.com/MaJerle/lwbtn

     

    发表评论