lwbtn:一个用 C11 编写的超轻量级按键管理库,不依赖操作系统,零动态内存

什么是 lwbtn
唠一唠,lwbtn(Lightweight Button Manager)就是个超轻量级的按键管理库,用 C11 写的。它不依赖操作系统,零动态内存,一切都靠你提供个毫秒级的时间源。回调驱动,支持单击、多击、长按,还自带软件防抖——功能虽精简,但绝对够用。

它能帮你做什么

  • • 按键状态采样、防抖动。

  • • 长按、短按、连击、保活(keep-alive)事件通知。

  • • 多击统计:双击、三击…随你设定最大次数,事件只发一次,省得你乱七八糟地去算次数。

  • • 平台无关:STM32、Arduino、Win32……只要你能提供读GPIO和时间,一切 OK。

解决了哪些痛点

  • • 硬件抖动带来的误触发烦恼。

  • • 连击判断复杂,时序窗口不好算。

  • • 希望代码轻量易维护,但手写状态机又麻烦。

  • • 不想在小内存设备上用重库,却想要完善的按键检测。

安装 & 使用

  1. 1. 从 GitHub clone:

    git clone https://github.com/MaJerle/lwbtn.git
  2. 2. 加入你的编译链,包含 lwbtn.h 和 lwbtn.c。

  3. 3. 定义按钮数组:

    static lwbtn_btn_t btns[] = {
      {.arg = (void*)PIN_A}, {.arg = (void*)PIN_B},
    };
  4. 4. 实现两个回调:

    • • btn_get_state():读取 GPIO,返回 1/0。

    • • btn_event():处理事件,比如 LED 闪烁、串口输出。

  5. 5. 初始化并定时调用:

    lwbtn_init_ex(NULL, btns, count, btn_get_state, btn_event);
    while(1) {
      lwbtn_process_ex(NULL, get_ms());
    }

    就这么简单,整个按钮逻辑由 lwbtn 帮你管。

优缺点对比

优点

缺点

纯 C11,无动态内存,适合小内存设备

需要用户自己提供毫秒定时源

支持多种按键事件(单击、多击、长按、保活)

不含硬件中断封装,得自己做 GPIO 读取

软件防抖、可配置;无需手写复杂状态机

功能专注按键管理,其他外设要另写

平台无关,移植成本低

配置选项比较多,新手可能要花点时间熟悉

MIT 许可证,随便改、随便用

文档示例多,但有些细节要结合源码一起看

总结
总的来说,lwbtn 是那种“轻、快、稳、干活”的按键管理利器。你不用写复杂的状态机,不用担心抖动和误触发,连击识别、长按检测都交给它搞定。要是你在做嵌入式项目,或者任何需要按键交互的小玩意儿,它绝对值得一试。最关键的,它把复杂留给自己,简单留给你。快去试试吧!

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

发表评论