MurphyZhao 发表于 2019-8-31 22:52:45

回馈开源----史上最强按键驱动

大家可曾听说过经典的3行代码按键扫描算法?
这个按键扫描算法我一直有在用,但都是零零散散的代码,去年在做项目的时候,为了考虑通用性,对其进行了进一步封装。
该按键驱动使用事件机制上报按键状态,并解耦具体的按键硬件结构,理论上可以支持轻触按键和自锁按键,支持无限按键数量,一次扫描即可获取所有的按键状态。

- 支持单击、双击、长按
- 自动消抖
- 可灵活配置中断以及适配低功耗场景
- 支持按需组合按键
- 可扩展支持矩阵键盘
- C99 编写,支持裸机和任意 OS

源代码资源地址:https://github.com/murphyzhao/FlexibleButton

源代码中的按键扫描部分算法来自网络,仅有三行代码,非常精辟,值得学习,喜欢的朋友,不妨尝试用到自己的项目中,开源免费。算法来自网络,软件包也回馈网络,希望大家不再重复造轮子,以事半功倍。

还请各位大佬不吝指教,感谢

icoyool 发表于 2019-8-31 22:55:52

前排支持!!

了无 发表于 2019-8-31 22:57:56

前排支持,我去看看咋样。过几天我也准备回报论坛,也开源一个论坛最强菜单架构。

icoyool 发表于 2019-8-31 22:59:34

我觉得把switch全部改成if语句就更加好了

887799 发表于 2019-8-31 23:06:07

技术文章 要支持一下。{:handshake:}

贰梓 发表于 2019-8-31 23:07:10

学习收藏

wudicgi 发表于 2019-8-31 23:25:55

看起来很不错的样子

不过硬件按键是否应该叫 key?
button 一般是 UI 上的按钮吧

Doding 发表于 2019-8-31 23:31:45

icoyool 发表于 2019-8-31 22:59
我觉得把switch全部改成if语句就更加好了

为什么?习惯?

liangws201 发表于 2019-8-31 23:47:49

了无 发表于 2019-8-31 22:57
前排支持,我去看看咋样。过几天我也准备回报论坛,也开源一个论坛最强菜单架构。 ...

期待开源

我是一个大白菜 发表于 2019-8-31 23:56:41

谢谢分享,一直再用3行那个代码,学习一下你的

jaywen 发表于 2019-9-1 00:24:46

了无 发表于 2019-8-31 22:57
前排支持,我去看看咋样。过几天我也准备回报论坛,也开源一个论坛最强菜单架构。 ...

谢谢楼主的分享也期待你的菜单框架!!{:lol:}

jordonwu 发表于 2019-9-1 00:45:48

感谢分享

zyw19987 发表于 2019-9-1 05:17:35

还是希望莫大这有源码,不知道低功耗是怎么实现,特别是长按事件。

jianbo513 发表于 2019-9-1 05:46:40

支持一下

micintcnh 发表于 2019-9-1 06:50:57

谢谢楼主的分享精神!

ronic 发表于 2019-9-1 07:08:43

感谢楼主分享,有空试试

farfar 发表于 2019-9-1 07:35:19

學習一下,感謝樓主的無私奉獻!

shh6899 发表于 2019-9-1 07:48:12

学习,感谢分享

air2016 发表于 2019-9-1 08:45:29

感谢分享,学些了

johnlj 发表于 2019-9-1 09:13:28

感谢分享,再次学习

lnskngdc 发表于 2019-9-1 09:20:22

记得坛子里有个状态机的按键扫描也很经典,我一直在用

Wangwy 发表于 2019-9-1 09:44:57

谢谢分享,经典的都值得学习

fsmcu 发表于 2019-9-1 09:55:05

谢谢分享,那3行一直视为经典语句,一直都在使用,不知道这个驱动有没有提供类似键盘的机打输出事件,就是持续按下期间,固定机打间隔时间持续输出按下事件

wye11083 发表于 2019-9-1 14:56:18

zyw19987 发表于 2019-9-1 05:17
还是希望莫大这有源码,不知道低功耗是怎么实现,特别是长按事件。

长按估计比较难了,因为通常情况下键盘命令有按下、弹起、按住(自动重复)。

BigWolf 发表于 2019-9-1 15:13:49

感谢分享 {:smile:}

muniao 发表于 2019-9-1 15:14:46

支持支持

Excellence 发表于 2019-9-1 15:17:26

支持矩阵吗?

pzt 发表于 2019-9-1 16:15:50

写的确实不错

Ray______ 发表于 2019-9-1 16:21:02

比较喜欢multibutton,有多击,可查询也可以回调。

Ray______ 发表于 2019-9-1 16:22:52

了无 发表于 2019-8-31 22:57
前排支持,我去看看咋样。过几天我也准备回报论坛,也开源一个论坛最强菜单架构。 ...

期待,我一直也想开源,无奈苦于两点:
1、如何能最大程度低消耗以及能兼容低性能8位机和32位机。
2、如何兼容多种显示场合,黑白、彩屏、数码管(当然严格来说draw不实现交给用户就好,但是这样又高了一点点门槛~~)

MurphyZhao 发表于 2019-9-2 09:03:09

icoyool 发表于 2019-8-31 22:59
我觉得把switch全部改成if语句就更加好了

他们两个在使用上还是会有些区别的,后面我反汇编出来对比看看如何优化下

MurphyZhao 发表于 2019-9-2 09:04:07

了无 发表于 2019-8-31 22:57
前排支持,我去看看咋样。过几天我也准备回报论坛,也开源一个论坛最强菜单架构。 ...

期待{:smile:}

MurphyZhao 发表于 2019-9-2 09:05:55

wudicgi 发表于 2019-8-31 23:25
看起来很不错的样子

不过硬件按键是否应该叫 key?


因为 key 的译意太广泛了,在驱动里也多是 button driver,没见过 key driver{:lol:}

MurphyZhao 发表于 2019-9-2 09:09:51

zyw19987 发表于 2019-9-1 05:17
还是希望莫大这有源码,不知道低功耗是怎么实现,特别是长按事件。

嗯,后面我镜像一份 源码包 过来

低功耗需要结合自己的低功耗特性,如果是 STM32 没有使用低功耗框架的话,可以接一路唤醒中断触发按键扫描启动

ykhuixuesen 发表于 2019-9-2 09:10:33

谢谢,辛苦了!

MurphyZhao 发表于 2019-9-2 09:11:50

wye11083 发表于 2019-9-1 14:56
长按估计比较难了,因为通常情况下键盘命令有按下、弹起、按住(自动重复)。 ...

低功耗后,可以通过按键触发唤醒,这样本次的按键事件会丢掉(仅用于唤醒)

MurphyZhao 发表于 2019-9-2 09:30:43

fsmcu 发表于 2019-9-1 09:55
谢谢分享,那3行一直视为经典语句,一直都在使用,不知道这个驱动有没有提供类似键盘的机打输出事件,就是 ...

当时考虑过 Windows 的按键处理机制,但是不确定其用途,没有加上,如果有需求的话,后面这里的按键事件可以用更好的方式实现

d__xin 发表于 2019-9-2 09:33:52

感谢分享,MARK一下

yanyanyan168 发表于 2019-9-2 09:41:30

感谢分享,MARK一下 +1

zuu0 发表于 2019-9-2 09:41:41

重新学习一下,高手写代码都不喜欢写注解

dreambox 发表于 2019-9-2 09:53:50

谢谢楼主的分享

chun2495 发表于 2019-9-2 10:15:54

只想问下:readme.md文件格式是自己写的,还是用什么文件来做的?

ttyyuuio 发表于 2019-9-2 10:22:15

感谢分享,今后就直接调用了

fuu 发表于 2019-9-2 10:47:04

chun2495 发表于 2019-9-2 10:15
只想问下:readme.md文件格式是自己写的,还是用什么文件来做的?

在gitbub上创建仓库时自动生成的readme文档

chun2495 发表于 2019-9-2 10:51:22

fuu 发表于 2019-9-2 10:47
在gitbub上创建仓库时自动生成的readme文档

我知道,我是说里面的格式,比如制表的哪些格式,不可能都是手打上去的吧!

bbbbbv 发表于 2019-9-2 11:02:32

收藏学习,感谢分享.

迅得电子 发表于 2019-9-2 11:22:30

MARK一下:史上最强按键驱动

myrgb 发表于 2019-9-2 11:36:23

看一下,谢谢分享

chen849928055 发表于 2019-9-2 14:02:21

Ray______ 发表于 2019-9-1 16:22
期待,我一直也想开源,无奈苦于两点:
1、如何能最大程度低消耗以及能兼容低性能8位机和32位机。
2、如 ...

期待楼主开源

fayuanye 发表于 2019-9-2 14:13:17

谢谢分享!!{:handshake:}

hackdj 发表于 2019-9-2 14:28:26

好东西 收藏

落叶知秋 发表于 2019-9-2 14:32:05

chun2495 发表于 2019-9-2 10:51
我知道,我是说里面的格式,比如制表的哪些格式,不可能都是手打上去的吧! ...

Markdown语言,了解一下

chun2495 发表于 2019-9-2 14:46:17

落叶知秋 发表于 2019-9-2 14:32
Markdown语言,了解一下

多谢!         

weimas 发表于 2019-9-2 15:05:55

貌似很不错的样子,好东西

liujinhan 发表于 2019-9-2 16:01:33

感谢分享! 支持!

foxpro2005 发表于 2019-9-2 16:02:48

强,感谢分享

jackjiao 发表于 2019-9-2 16:14:33

学习学习

caixiong 发表于 2019-9-2 17:32:31

感谢分享,功德无量

et009tw 发表于 2019-9-2 17:41:03

謝謝分享。{:smile:}

xiaotaodzgzs 发表于 2019-9-2 17:49:11


感谢分享,学习了

dam 发表于 2019-9-2 18:18:03

谢谢分享

jsplyy 发表于 2019-9-2 18:24:36

mark                           

zhiweirui 发表于 2019-9-2 21:37:09

学习一下,试着用一用

Mickey25 发表于 2019-9-2 22:38:20

谢谢分享!

bsz84 发表于 2019-9-2 22:56:24

本帖最后由 bsz84 于 2019-9-3 13:14 编辑

感谢分享!

zyw19987 发表于 2019-9-3 06:20:12

MurphyZhao 发表于 2019-9-2 09:09
嗯,后面我镜像一份 源码包 过来

低功耗需要结合自己的低功耗特性,如果是 STM32 没有使用低功耗框架的 ...

没看到源码。
低功耗的想法是,按键定时扫描,所以定时期间MCU是可能休眠的。这样低功耗的重点不是按键,是定时休眠的定时器管理才是难点。
对于低功耗的产品需要所有外设模块配合这种休眠管理模式。
期待你的佳作,一定要真正做过批量生产的低功耗产品才能体会。

zhaoyuanxian 发表于 2019-9-3 08:01:50

非常感谢

shiang 发表于 2019-9-3 08:36:02

感谢,来学习一下{:lol:}

闲鱼翻身 发表于 2019-9-3 09:03:35

感谢分享~~~~

tdchenke 发表于 2019-9-3 09:10:05

感谢分享学习一下

MurphyZhao 发表于 2019-9-3 10:03:15

zuu0 发表于 2019-9-2 09:41
重新学习一下,高手写代码都不喜欢写注解

我是新手,我写了注解给自己看{:lol:}

MurphyZhao 发表于 2019-9-3 10:04:21

zyw19987 发表于 2019-9-3 06:20
没看到源码。
低功耗的想法是,按键定时扫描,所以定时期间MCU是可能休眠的。这样低功耗的重点不是按键, ...

嗯,后面我尝试在 NB-IOT 里面做个测试

MurphyZhao 发表于 2019-9-3 10:06:03

chun2495 发表于 2019-9-2 10:51
我知道,我是说里面的格式,比如制表的哪些格式,不可能都是手打上去的吧! ...

markdown 格式,全手敲,也可以使用 IDE,如 Typora

MurphyZhao 发表于 2019-9-3 10:07:28

chun2495 发表于 2019-9-2 10:15
只想问下:readme.md文件格式是自己写的,还是用什么文件来做的?

markdown 格式,全手敲,不过也可以使用 IDE,如 Typora 软件

不过习惯了之后,都不需要看渲染出来的效果

security 发表于 2019-9-3 10:09:15

占个座,谢谢分享!

1785345205 发表于 2019-9-3 10:14:37

谢谢分享

chun2495 发表于 2019-9-3 10:21:33

MurphyZhao 发表于 2019-9-3 10:07
markdown 格式,全手敲,不过也可以使用 IDE,如 Typora 软件

不过习惯了之后,都不需要看渲染出来的效 ...

原来如此!厉害了!

xinghuifly 发表于 2019-9-3 11:31:13

厉害了,感谢分享

diego2003 发表于 2019-9-3 11:33:08

按键程序MARK........

kevincoooool 发表于 2019-9-3 13:14:20

按键程序MARK

huxiaoping 发表于 2019-9-4 10:20:46


学习收藏

zenghl 发表于 2019-9-4 11:31:03

学习和收藏

MurphyZhao 发表于 2019-9-5 14:08:28

帖子发出去好像没法再编辑,就把源代码包放这里吧



贰梓 发表于 2019-9-12 17:18:01

谢谢分析,收藏学习了,正好最近要做按键的处理

vtouch 发表于 2019-9-13 07:27:08

谢谢楼主分享,谢谢83楼打包

MurphyZhao 发表于 2019-9-16 15:22:59

vtouch 发表于 2019-9-13 07:27
谢谢楼主分享,谢谢83楼打包

照顾下没有梯子的{:smile:}

MurphyZhao 发表于 2019-9-16 15:23:59

贰梓 发表于 2019-9-12 17:18
谢谢分析,收藏学习了,正好最近要做按键的处理

有疑问或者好的点子,可以一起交流

趁还年轻 发表于 2019-9-16 15:55:22

感谢大佬分享 强烈支持

趁还年轻 发表于 2019-9-16 16:16:36

小白想问一下 如果使用结构体了 就一定要配合链表实现扫描 但是一定要把链表的指针放在按键的结构体里吗? 要不要直接新建一个链表结构 指针可以是void*型 这样可以通用所有的类 比如按键啊 灯啊啥的 然后做一个新的链表 在创建对象时候 直接把这个结构体添加到对应类里面 这样链表结构也可以按照面向对象的写法写 方法就是添加一个链表或者删除一个链表 或者插入链表什么的 这样会不会通用性更强一点? 枚举变量确定数组大小 学习了 感谢{:lol:}

gzhsh666 发表于 2019-9-18 17:32:13

markdown一下 感谢楼主分享

oooios 发表于 2019-9-20 11:06:48

谢谢分享 拿来看看

dongwang_fl 发表于 2019-9-22 08:58:58

支持支持

gzwirelesss 发表于 2019-9-22 09:14:54

学习收藏

zhoust 发表于 2019-9-23 08:47:20

按键模块,收藏了。

贰梓 发表于 2019-9-25 17:21:13

MurphyZhao 发表于 2019-9-16 15:23
有疑问或者好的点子,可以一起交流

楼主您好,我使用了你的按键程序,现遇到三问题,
1,双击触发无效,调试查看click_cnt值无变化
其他单击短按长按都正常,不知道是不是我哪里没注意到
2,我看代码目前最大支持16按键,我若扩到32按键只需更改如下代码就可以了吧?
#define MAX_BUTTON_CNT 32
static uint32_t keydata = 0xFFFFFFFF;
static uint32_t key_rst_data = 0xFFFFFFFF;
3,按键输入每个都需要一个函数,这个对于按键较多的不够友好,希望能优化为只需一个函数就好了,
我改了一下 uint8_t(*usr_button_read)(uint8_tbuttonx);,改完后按键高低顺序反了,这个不知道楼主有无考虑优化一下

lushanlq 发表于 2019-9-26 06:03:46

使用效果怎么样???

caoxinkafei 发表于 2019-9-26 08:09:52

谢谢楼主的分享

L7科创 发表于 2019-9-26 08:18:39

了无 发表于 2019-8-31 22:57
前排支持,我去看看咋样。过几天我也准备回报论坛,也开源一个论坛最强菜单架构。 ...

期待大神开源!

了无 发表于 2019-9-26 08:34:34

L7科创 发表于 2019-9-26 08:18
期待大神开源!

已经开源了。查看我的帖子

boji 发表于 2019-9-26 08:59:34


前排支持!!
页: [1] 2
查看完整版本: 回馈开源----史上最强按键驱动