lwbtn 是什么?
lwbtn(Lightweight button manager)其实就是一套用 C(C11)写的按钮库,专门帮你把各种按键的去抖、单击、双击、长按全搞定。它不依赖任何操作系统,只要你能提供一个毫秒级的计时函数,就能跑。最关键的是——零动态内存分配,所以在资源紧张的 MCU 上也毫无压力。
它解决了哪些痛点?
|
常见痛点 |
lwbtn 的解决方案 |
|
按键抖动导致误触 |
软件去抖(可自定义抖动时间) |
|
需要区分单击、双击、长按 |
事件回调统一管理,支持多种事件 |
|
手写状态机容易出错 |
回调驱动,库内部自动维护状态机 |
|
动态内存导致碎片 |
完全静态分配,零 malloc |
|
跨平台移植困难 |
只要实现两句回调函数,几乎不改代码 |
说白了,把“写按钮状态机”这件事交给 lwbtn,你只管写业务,省时省力。
安装 & 使用步骤
-
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