MultiButton 是嵌入式开发里非常好用的轻量开源按键驱动库,仅 300 多行 C 代码,基于状态机实现,不用阻塞延时,能够一键实现单击、双击、长按、连击等全部按键事件,支持无限多按键扩展,移植简单,几乎适配所有单片机平台,是单片机按键开发的首选开源组件。很多嵌入式工程师写按键逻辑时,很容易把消抖、长短按、连击代码写得杂乱臃肿,还会出现 while 死循环、delay 阻塞主程序运行的问题;而 MultiButton 把按键状态和时间计数完全拆分,依靠 5ms 定时调度运行,全程无阻塞,自带软件消抖,把按键检测逻辑和业务代码彻底解耦,代码结构干净清晰,同时也是学习状态机编程最好的入门案例。整个项目只有 multi_button.c 和 multi_button.h 两个文件,仅依赖基础 C 标准头文件,采用 MIT 开源协议,可以免费商用;开发时只需要完成按键 GPIO 读取函数、初始化按键实例、绑定事件回调,最后在 5ms 定时器里调用一次总调度函数,就能完成全部按键功能开发,不需要修改库内部源码。按照标准流程完成移植配置后,就可以分别捕获按下、松开、单击、双击、长按启动、长按保持、连续按键七种事件,多按键同时运行互不干扰,整体内存占用极低,不会给单片机带来额外负担。
一、项目基础信息清单
| 项目参数 | 详细内容 |
|---|---|
| 项目名称 | MultiButton |
| 开源作者 | 0x1abin |
| 开源协议 | MIT(可免费商用) |
| 代码规模 | 源文件仅 321 行,头文件 116 行 |
| 开发语言 | C99 标准 C 语言 |
| 依赖文件 | 仅 stdint.h、string.h,无第三方依赖 |
| 核心运行条件 | 每 5ms 调用一次全局调度函数 |
| 支持按键事件 | 7 种按键动作,支持多按键并发检测 |
二、支持的全部按键事件列表
- PRESS_DOWN:按键按下瞬间触发
- PRESS_UP:按键松开瞬间触发
- SINGLE_CLICK:单击事件
- DOUBLE_CLICK:双击事件
- PRESS_REPEAT:连续连击事件
- LONG_PRESS_START:长按达到阈值时触发一次
- LONG_PRESS_HOLD:长按持续期间循环触发
三、完整移植操作步骤
第一步:把 multi_button.c、multi_button.h 两个文件添加到单片机工程中。
第二步:编写底层 GPIO 读取函数,返回对应按键引脚当前电平。
第三步:定义按键实例,调用 button_init 完成初始化,设置按键有效电平。
第四步:使用 button_attach 函数,给每一种按键事件绑定对应的回调处理函数。
第五步:调用 button_start 开启按键检测。
第六步:配置 5ms 定时器,在定时器中断里固定调用 button_ticks 全局调度函数。
第七步:编译下载,测试单击、双击、长短按等全部按键动作。
四、核心技术优势
- 无阻塞运行:全程不使用 delay 和 while 等待,不会卡住主循环程序。
- 自带软件消抖:内置抖动计数逻辑,无需额外硬件消抖电路。
- 面向对象设计:每个按键对应独立结构体,多按键互不影响,可无限新增按键。
- 事件回调机制:按键动作触发后自动执行回调函数,业务逻辑和底层检测完全分开。
- 跨平台适配:不绑定任何 MCU,只需要改写 GPIO 读取接口,STM32、51 单片机、ESP32 都能直接移植。
五、常见开发坑点说明
- 定时周期必须严格控制在 5ms 左右,定时不准会导致长短按、双击识别出错。
- 不要在主循环里随意调用 button_ticks,固定放在定时器中断中执行最稳定。
- 回调函数内不要写耗时代码,只做标记,复杂业务放到主循环里执行。
【常见问题】
问题 1:嵌入式开源项目 MultiButton 最大的优势是什么?
回答 1:嵌入式开源项目 MultiButton 最大优势是采用状态机无阻塞设计,300 多行精简代码,自带按键消抖,支持单击、双击、长按等 7 类事件,多按键可无限扩展,全程不占用 CPU 等待时间,非常适合单片机嵌入式项目使用。
问题 2:移植嵌入式开源项目 MultiButton 必须满足什么定时条件?
回答 2:移植嵌入式开源项目 MultiButton,必须搭建 5ms 定时任务,固定在 5ms 定时器中断中调用 button_ticks 调度函数,定时偏差过大会造成双击、长按识别异常。
问题 3:嵌入式开源项目 MultiButton 支持多少个按键,需要额外修改源码吗?
回答 3:嵌入式开源项目 MultiButton 没有按键数量上限,支持无限多按键实例;开发人员只需要新增按键结构体并完成初始化,不需要修改库内部源码,移植成本极低。
问题 4:嵌入式开源项目 MultiButton 采用什么开源协议,能不能用于商业产品?
回答 4:嵌入式开源项目 MultiButton 采用 MIT 开源许可协议,无版权限制,开发者可以直接把该库用到商用硬件产品中,不需要开源自己的项目代码。
【参考资料】
[2026-11-13](推荐一个好的嵌入式开源项目之四 ——MultiButton)电子工程专辑
[2026-11-13](MultiButton 轻量按键驱动库移植教程)电子工程世界
[2025-12-16](MultiButton 状态机按键库功能解析)与非网
[2025-08-29](GitHub 热门嵌入式项目:MultiButton 多按键处理库)电子工程专辑
[2023-06-15](STM32 平台 MultiButton 完整移植案例)阿里云开发者社区
【免责声明】
本文仅整理嵌入式开源项目 MultiButton 公开文档与移植教程,不承担工程开发适配风险;不同单片机硬件、时钟配置会影响按键识别精度,实际项目需要自行调试定时参数与 GPIO 电平;项目源码更新会造成部分接口变动,一切代码内容以项目 GitHub 官方仓库最新版本为准。
