搜索
bottom↓
回复: 145

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

  [复制链接]

出0入0汤圆

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

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

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

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

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入8汤圆

发表于 2019-8-31 22:55:52 | 显示全部楼层
前排支持!!

出0入8汤圆

发表于 2019-8-31 22:57:56 | 显示全部楼层
前排支持,我去看看咋样。过几天我也准备回报论坛,也开源一个论坛最强菜单架构。

出0入8汤圆

发表于 2019-8-31 22:59:34 | 显示全部楼层
我觉得把switch全部改成if语句就更加好了

出0入0汤圆

发表于 2019-8-31 23:06:07 | 显示全部楼层
技术文章 要支持一下。

出0入0汤圆

发表于 2019-8-31 23:07:10 来自手机 | 显示全部楼层
学习收藏

出0入0汤圆

发表于 2019-8-31 23:25:55 | 显示全部楼层
看起来很不错的样子

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

出0入75汤圆

发表于 2019-8-31 23:31:45 来自手机 | 显示全部楼层
icoyool 发表于 2019-8-31 22:59
我觉得把switch全部改成if语句就更加好了

为什么?习惯?

出0入0汤圆

发表于 2019-8-31 23:47:49 来自手机 | 显示全部楼层
了无 发表于 2019-8-31 22:57
前排支持,我去看看咋样。过几天我也准备回报论坛,也开源一个论坛最强菜单架构。 ...

期待开源

出0入42汤圆

发表于 2019-8-31 23:56:41 来自手机 | 显示全部楼层
谢谢分享,一直再用3行那个代码,学习一下你的

出0入10汤圆

发表于 2019-9-1 00:24:46 | 显示全部楼层
了无 发表于 2019-8-31 22:57
前排支持,我去看看咋样。过几天我也准备回报论坛,也开源一个论坛最强菜单架构。 ...

谢谢楼主的分享  也期待你的菜单框架!!

出0入0汤圆

发表于 2019-9-1 00:45:48 来自手机 | 显示全部楼层
感谢分享

出0入0汤圆

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

出0入0汤圆

发表于 2019-9-1 05:46:40 来自手机 | 显示全部楼层
支持一下

出0入8汤圆

发表于 2019-9-1 06:50:57 | 显示全部楼层
谢谢楼主的分享精神!

出0入4汤圆

发表于 2019-9-1 07:08:43 来自手机 | 显示全部楼层
感谢楼主分享,有空试试

出0入0汤圆

发表于 2019-9-1 07:35:19 | 显示全部楼层
學習一下,感謝樓主的無私奉獻!

出0入0汤圆

发表于 2019-9-1 07:48:12 来自手机 | 显示全部楼层
学习,感谢分享

出0入0汤圆

发表于 2019-9-1 08:45:29 | 显示全部楼层
感谢分享,学些了

出0入0汤圆

发表于 2019-9-1 09:13:28 | 显示全部楼层
感谢分享,再次学习

出0入0汤圆

发表于 2019-9-1 09:20:22 | 显示全部楼层
记得坛子里有个状态机的按键扫描也很经典,我一直在用

出0入0汤圆

发表于 2019-9-1 09:44:57 | 显示全部楼层
谢谢分享,经典的都值得学习

出0入0汤圆

发表于 2019-9-1 09:55:05 | 显示全部楼层
谢谢分享,那3行一直视为经典语句,一直都在使用,不知道这个驱动有没有提供类似键盘的机打输出事件,就是持续按下期间,固定机打间隔时间持续输出按下事件

出0入442汤圆

发表于 2019-9-1 14:56:18 | 显示全部楼层
zyw19987 发表于 2019-9-1 05:17
还是希望莫大这有源码,不知道低功耗是怎么实现,特别是长按事件。

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

出0入0汤圆

发表于 2019-9-1 15:13:49 | 显示全部楼层
感谢分享

出0入0汤圆

发表于 2019-9-1 15:14:46 来自手机 | 显示全部楼层
支持支持

出0入0汤圆

发表于 2019-9-1 15:17:26 来自手机 | 显示全部楼层
支持矩阵吗?

出0入0汤圆

发表于 2019-9-1 16:15:50 | 显示全部楼层
写的确实不错

出0入0汤圆

发表于 2019-9-1 16:21:02 | 显示全部楼层
比较喜欢multibutton,有多击,可查询也可以回调。

出0入0汤圆

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

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

出0入0汤圆

 楼主| 发表于 2019-9-2 09:03:09 | 显示全部楼层
icoyool 发表于 2019-8-31 22:59
我觉得把switch全部改成if语句就更加好了

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

出0入0汤圆

 楼主| 发表于 2019-9-2 09:04:07 | 显示全部楼层
了无 发表于 2019-8-31 22:57
前排支持,我去看看咋样。过几天我也准备回报论坛,也开源一个论坛最强菜单架构。 ...

期待

出0入0汤圆

 楼主| 发表于 2019-9-2 09:05:55 | 显示全部楼层
wudicgi 发表于 2019-8-31 23:25
看起来很不错的样子

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

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

出0入0汤圆

 楼主| 发表于 2019-9-2 09:09:51 | 显示全部楼层
zyw19987 发表于 2019-9-1 05:17
还是希望莫大这有源码,不知道低功耗是怎么实现,特别是长按事件。

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

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

出0入0汤圆

发表于 2019-9-2 09:10:33 | 显示全部楼层
谢谢,辛苦了!

出0入0汤圆

 楼主| 发表于 2019-9-2 09:11:50 | 显示全部楼层
wye11083 发表于 2019-9-1 14:56
长按估计比较难了,因为通常情况下键盘命令有按下、弹起、按住(自动重复)。 ...

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

出0入0汤圆

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

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

出0入169汤圆

发表于 2019-9-2 09:33:52 | 显示全部楼层
感谢分享,MARK一下

出140入115汤圆

发表于 2019-9-2 09:41:30 | 显示全部楼层
感谢分享,MARK一下 +1

出0入0汤圆

发表于 2019-9-2 09:41:41 | 显示全部楼层
重新学习一下,高手写代码都不喜欢写注解

出0入0汤圆

发表于 2019-9-2 09:53:50 | 显示全部楼层
谢谢楼主的分享  

出25入84汤圆

发表于 2019-9-2 10:15:54 | 显示全部楼层
只想问下:readme.md文件格式是自己写的,还是用什么文件来做的?

出0入0汤圆

发表于 2019-9-2 10:22:15 | 显示全部楼层
感谢分享,今后就直接调用了

出0入0汤圆

发表于 2019-9-2 10:47:04 | 显示全部楼层
chun2495 发表于 2019-9-2 10:15
只想问下:readme.md文件格式是自己写的,还是用什么文件来做的?

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

出25入84汤圆

发表于 2019-9-2 10:51:22 | 显示全部楼层
fuu 发表于 2019-9-2 10:47
在gitbub上创建仓库时自动生成的readme文档

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

出0入0汤圆

发表于 2019-9-2 11:02:32 | 显示全部楼层
收藏学习,感谢分享.

出0入0汤圆

发表于 2019-9-2 11:22:30 | 显示全部楼层
MARK一下:史上最强按键驱动

出0入0汤圆

发表于 2019-9-2 11:36:23 | 显示全部楼层
看一下,谢谢分享

出5入10汤圆

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

期待楼主开源

出0入0汤圆

发表于 2019-9-2 14:13:17 | 显示全部楼层
谢谢分享!!

出0入0汤圆

发表于 2019-9-2 14:28:26 | 显示全部楼层
好东西 收藏

出40入42汤圆

发表于 2019-9-2 14:32:05 | 显示全部楼层
chun2495 发表于 2019-9-2 10:51
我知道,我是说里面的格式,比如制表的哪些格式,不可能都是手打上去的吧! ...

Markdown语言,了解一下

出25入84汤圆

发表于 2019-9-2 14:46:17 | 显示全部楼层
落叶知秋 发表于 2019-9-2 14:32
Markdown语言,了解一下

多谢!           

出0入0汤圆

发表于 2019-9-2 15:05:55 | 显示全部楼层
貌似很不错的样子,好东西

出0入0汤圆

发表于 2019-9-2 16:01:33 | 显示全部楼层
感谢分享! 支持!

出0入76汤圆

发表于 2019-9-2 16:02:48 | 显示全部楼层
强,感谢分享

出0入0汤圆

发表于 2019-9-2 16:14:33 | 显示全部楼层
学习学习

出0入0汤圆

发表于 2019-9-2 17:32:31 | 显示全部楼层
感谢分享,功德无量

出0入0汤圆

发表于 2019-9-2 17:41:03 | 显示全部楼层
謝謝分享。

出0入4汤圆

发表于 2019-9-2 17:49:11 | 显示全部楼层

感谢分享,学习了

出0入0汤圆

发表于 2019-9-2 18:18:03 来自手机 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2019-9-2 18:24:36 | 显示全部楼层
mark                           

出0入0汤圆

发表于 2019-9-2 21:37:09 | 显示全部楼层
学习一下,试着用一用

出0入0汤圆

发表于 2019-9-2 22:38:20 来自手机 | 显示全部楼层
谢谢分享!

出0入0汤圆

发表于 2019-9-2 22:56:24 | 显示全部楼层
本帖最后由 bsz84 于 2019-9-3 13:14 编辑

感谢分享!

出0入0汤圆

发表于 2019-9-3 06:20:12 | 显示全部楼层
MurphyZhao 发表于 2019-9-2 09:09
嗯,后面我镜像一份 源码包 过来

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

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

出0入0汤圆

发表于 2019-9-3 08:01:50 来自手机 | 显示全部楼层
非常感谢

出0入0汤圆

发表于 2019-9-3 08:36:02 | 显示全部楼层
感谢,来学习一下

出0入0汤圆

发表于 2019-9-3 09:03:35 | 显示全部楼层
感谢分享~~~~

出0入0汤圆

发表于 2019-9-3 09:10:05 | 显示全部楼层
感谢分享  学习一下

出0入0汤圆

 楼主| 发表于 2019-9-3 10:03:15 | 显示全部楼层
zuu0 发表于 2019-9-2 09:41
重新学习一下,高手写代码都不喜欢写注解

我是新手,我写了注解给自己看

出0入0汤圆

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

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

出0入0汤圆

 楼主| 发表于 2019-9-3 10:06:03 | 显示全部楼层
chun2495 发表于 2019-9-2 10:51
我知道,我是说里面的格式,比如制表的哪些格式,不可能都是手打上去的吧! ...

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

出0入0汤圆

 楼主| 发表于 2019-9-3 10:07:28 | 显示全部楼层
chun2495 发表于 2019-9-2 10:15
只想问下:readme.md文件格式是自己写的,还是用什么文件来做的?

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

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

出0入8汤圆

发表于 2019-9-3 10:09:15 | 显示全部楼层
占个座,谢谢分享!

出180入0汤圆

发表于 2019-9-3 10:14:37 | 显示全部楼层
谢谢分享

出25入84汤圆

发表于 2019-9-3 10:21:33 | 显示全部楼层
MurphyZhao 发表于 2019-9-3 10:07
markdown 格式,全手敲,不过也可以使用 IDE,如 Typora 软件

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

原来如此!厉害了!

出0入0汤圆

发表于 2019-9-3 11:31:13 | 显示全部楼层
厉害了,感谢分享

出0入0汤圆

发表于 2019-9-3 11:33:08 | 显示全部楼层
按键程序  MARK........

出0入104汤圆

发表于 2019-9-3 13:14:20 | 显示全部楼层
按键程序  MARK

出0入8汤圆

发表于 2019-9-4 10:20:46 | 显示全部楼层

学习收藏

出0入0汤圆

发表于 2019-9-4 11:31:03 | 显示全部楼层
学习和收藏

出0入0汤圆

 楼主| 发表于 2019-9-5 14:08:28 | 显示全部楼层
帖子发出去好像没法再编辑,就把源代码包放这里吧



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2019-9-12 17:18:01 | 显示全部楼层
谢谢分析,收藏学习了,正好最近要做按键的处理

出0入0汤圆

发表于 2019-9-13 07:27:08 | 显示全部楼层
谢谢楼主分享,谢谢83楼打包

出0入0汤圆

 楼主| 发表于 2019-9-16 15:22:59 | 显示全部楼层
vtouch 发表于 2019-9-13 07:27
谢谢楼主分享,谢谢83楼打包

照顾下没有梯子的

出0入0汤圆

 楼主| 发表于 2019-9-16 15:23:59 | 显示全部楼层
贰梓 发表于 2019-9-12 17:18
谢谢分析,收藏学习了,正好最近要做按键的处理

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

出0入0汤圆

发表于 2019-9-16 15:55:22 | 显示全部楼层
感谢大佬分享 强烈支持

出0入0汤圆

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

出0入0汤圆

发表于 2019-9-18 17:32:13 | 显示全部楼层
markdown一下 感谢楼主分享

出0入0汤圆

发表于 2019-9-20 11:06:48 | 显示全部楼层
谢谢分享 拿来看看

出0入0汤圆

发表于 2019-9-22 08:58:58 来自手机 | 显示全部楼层
支持支持

出0入0汤圆

发表于 2019-9-22 09:14:54 | 显示全部楼层
学习收藏

出0入0汤圆

发表于 2019-9-23 08:47:20 | 显示全部楼层
按键模块,收藏了。

出0入0汤圆

发表于 2019-9-25 17:21:13 | 显示全部楼层
MurphyZhao 发表于 2019-9-16 15:23
有疑问或者好的点子,可以一起交流

楼主您好,我使用了你的按键程序,现遇到三问题,
1,双击触发无效,调试查看click_cnt值无变化
其他单击短按长按都正常,不知道是不是我哪里没注意到
2,我看代码目前最大支持16按键,我若扩到32按键只需更改如下代码就可以了吧?
  1. #define MAX_BUTTON_CNT 32
  2. static uint32_t keydata = 0xFFFFFFFF;
  3. static uint32_t key_rst_data = 0xFFFFFFFF;
复制代码

3,按键输入每个都需要一个函数,这个对于按键较多的不够友好,希望能优化为只需一个函数就好了,
我改了一下
  1. uint8_t  (*usr_button_read)(uint8_t  buttonx);
复制代码
,改完后按键高低顺序反了,这个不知道楼主有无考虑优化一下

出0入0汤圆

发表于 2019-9-26 06:03:46 来自手机 | 显示全部楼层
使用效果怎么样???

出0入0汤圆

发表于 2019-9-26 08:09:52 | 显示全部楼层
谢谢楼主的分享

出0入0汤圆

发表于 2019-9-26 08:18:39 | 显示全部楼层
了无 发表于 2019-8-31 22:57
前排支持,我去看看咋样。过几天我也准备回报论坛,也开源一个论坛最强菜单架构。 ...

期待大神开源!

出0入8汤圆

发表于 2019-9-26 08:34:34 | 显示全部楼层

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

出0入0汤圆

发表于 2019-9-26 08:59:34 | 显示全部楼层

前排支持!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 14:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表