搜索
bottom↓
12
返回列表 发新帖
楼主: 半导体

【MultiButton】并发状态事件驱动按键驱动模块,量产产品实践

  [复制链接]

出0入0汤圆

发表于 2016-11-18 07:23:10 来自手机 | 显示全部楼层
谢谢分享。很好的学习资料。

出0入8汤圆

发表于 2016-11-18 07:46:25 来自手机 | 显示全部楼层
非常好的资料,多谢分享,学习了

出0入8汤圆

发表于 2016-11-18 22:35:52 | 显示全部楼层
希望楼主继续分享,今天移植到我的开发板上,简直太好用了,感觉和用C#编程一样爽

出0入0汤圆

发表于 2016-11-19 09:10:45 | 显示全部楼层
感谢楼主分享经验

出0入0汤圆

发表于 2016-11-21 15:07:14 | 显示全部楼层
感谢分享  学习一下了  

出0入0汤圆

发表于 2016-11-23 16:56:57 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2016-11-23 17:09:30 | 显示全部楼层
在STM8单片机中没响应?

出0入0汤圆

 楼主| 发表于 2017-1-9 17:43:47 | 显示全部楼层
qiang517503838 发表于 2016-11-23 17:09
在STM8单片机中没响应?

跟单片机平台没有关系的。

出0入0汤圆

发表于 2017-2-4 16:32:53 | 显示全部楼层
感谢楼主分享!
在学校实验项目上用了下,调试确实方便。

出0入0汤圆

发表于 2017-2-4 22:42:04 | 显示全部楼层

谢谢分享。很好的学习资料。

出0入4汤圆

发表于 2017-2-6 13:34:26 | 显示全部楼层
半导体 发表于 2016-9-30 10:38
谢谢提醒,修复了,查询事件方式是后来才加入,所以。。。。

谢谢楼主。
没看明白,问题指的是?

出0入0汤圆

发表于 2017-2-7 19:53:50 | 显示全部楼层
谢谢楼主分享

出0入0汤圆

发表于 2017-2-7 20:16:04 | 显示全部楼层
搞来研究学习下,感谢LZ分享啦

出0入0汤圆

发表于 2017-3-6 15:46:12 | 显示全部楼层
本帖最后由 duxingkei 于 2017-3-6 15:48 编辑
半导体 发表于 2017-1-9 17:43
跟单片机平台没有关系的。


长时间按键触发 不合理,长时间按下后发现一直调用,没法周期调用,我在基础上改了下,保证长按触发后,每隔LONG_TICKS_TRIG的计数就触发一次:

  1. 头文件加入定义:
  2. //byCHOW
  3. #define LONG_TICKS_TRIG                (300 /TICKS_INTERVAL)


  4. 状态机
  5. void button_handler(struct Button* handle)
  6. 的内容:
  7.         case 5:
  8.             if(handle->button_level == handle->active_level)
  9.             {
  10.             
  11. #ifndef LONG_TICKS_TRIG
  12.                 //continue hold trigger
  13.                 handle->event = (uint8_t)LONG_PRESS_HOLD;
  14.                 EVENT_CB(LONG_PRESS_HOLD);
  15. #else
  16.                                 //长按后tick每周期触发
  17.                                 //增加长按周期触发
  18.                 if(handle->ticks > (LONG_TICKS+LONG_TICKS_TRIG))
  19.                 {
  20.                     handle->ticks = LONG_TICKS;//重新启动
  21.                     handle->event = (uint8_t)LONG_PRESS_HOLD;
  22.                     EVENT_CB(LONG_PRESS_HOLD);
  23.                 }
  24. #endif

  25.             }
  26.             else     //releasd
  27.             {
  28.                 handle->event = (uint8_t)PRESS_UP;
  29.                 EVENT_CB(PRESS_UP);
  30.                 handle->state = 0; //reset
  31.             }
  32.             break;
复制代码

出0入0汤圆

发表于 2017-3-10 16:36:47 | 显示全部楼层
如果想要使用组合按键可以实现么

出0入17汤圆

发表于 2017-3-10 21:36:15 | 显示全部楼层
写的不错哦

出50入255汤圆

发表于 2017-3-11 09:18:55 来自手机 | 显示全部楼层
这么好的按钮程序,学习!

出0入0汤圆

发表于 2017-3-16 22:49:05 | 显示全部楼层
谢谢分享,很好的资料

出0入0汤圆

发表于 2017-3-17 09:38:32 | 显示全部楼层
正在学习,谢谢分享

出0入0汤圆

发表于 2017-4-7 10:36:49 | 显示全部楼层
LZ,你的那个button_stop()函数小弟看不懂,主要是指针操作那部分
大神能不能稍微讲解下,谢谢了

出0入0汤圆

发表于 2017-5-3 16:54:33 | 显示全部楼层
谢谢楼主,学习了。

出0入0汤圆

发表于 2017-5-3 20:11:06 | 显示全部楼层
接口清晰,很赞~

出0入0汤圆

发表于 2017-5-10 11:32:34 | 显示全部楼层
小弟对链表不是很理解,下面有个问题,想请教下大神
head_handle既然是NULL,那target不也就是NULL了嘛,那while(target){}中还会检查新加入的hanle是否存在吗?
不知道是不是我理解有问题,还请指教...
  1. static struct Button* head_handle = NULL;
  2. int button_start(struct Button* handle)
  3. {
  4.         struct Button* target = head_handle;
  5.         while(target) {
  6.                 if(target == handle) return -1;        //already exist.
  7.                 target = target->next;
  8.         }
  9.         handle->next = head_handle;
  10.         head_handle = handle;
  11.         return 0;
  12. }
复制代码

出0入0汤圆

发表于 2017-9-18 20:44:31 | 显示全部楼层
mark,基于并发状态事件驱动按键驱动模块

出0入0汤圆

发表于 2017-9-19 15:54:58 | 显示全部楼层
很nice的模块,非常实用,看到链表头还是有点大

出0入0汤圆

发表于 2017-9-20 08:41:17 | 显示全部楼层
mark

出0入4汤圆

发表于 2018-4-8 10:24:52 | 显示全部楼层
楼主在结构体里这个是什么意思,怎么没找到这个函数
uint8_t  (*hal_button_Level)(void);

出0入0汤圆

发表于 2018-4-8 13:13:53 | 显示全部楼层
谢谢分享,好资料。

出140入8汤圆

发表于 2018-4-8 13:23:20 | 显示全部楼层
已经在三个项目上使用了楼主东西……太好用了

出0入0汤圆

发表于 2018-4-8 14:42:26 | 显示全部楼层
很不错哦,实际体验下

出0入0汤圆

发表于 2018-10-19 16:49:15 | 显示全部楼层
对程序里有阻塞(按键扫描时间(5ms一次)小于其余一个周期的15ms以上)的情况下,比如STM8L 1M频率运行,然后运行2处log运算(实际我只有一处log,因为还有ADC采集),while (1)扫描的情况下,用查询方式,体验就不好,放在定时扫描情况下好很多,但也会按键不灵的现象,所以用中断扫描处理用回调函数较好

出0入0汤圆

发表于 2018-12-22 16:53:25 | 显示全部楼层
感谢楼主提供资料。

出0入0汤圆

发表于 2019-4-17 15:28:36 | 显示全部楼层
正好需要一个按键模块,用了下,很好用,谢谢分享。

出0入0汤圆

发表于 2019-4-19 14:07:03 | 显示全部楼层
谢谢分享,很好用

出0入0汤圆

发表于 2020-2-23 18:21:37 | 显示全部楼层
谢谢分享,确实不错!

出0入0汤圆

发表于 2020-3-3 00:49:14 | 显示全部楼层
学习一下。按键模块

出0入0汤圆

发表于 2020-3-6 00:27:27 | 显示全部楼层
如果是组合键要怎么实现呢

出0入0汤圆

发表于 2020-3-6 11:43:22 | 显示全部楼层
学习了,已经github加星操作

出0入0汤圆

发表于 2020-3-6 15:04:15 | 显示全部楼层
谢谢分享,备用!

出0入0汤圆

发表于 2020-3-7 13:45:53 | 显示全部楼层
安卓代码不就这样的吗?建议调用button_attach的时候,返回一个buttonID,或者传入一个buttonID,然后回调函数的时候,用buttonID去区别不同按键。就不用搞很多回调函数了

出0入0汤圆

发表于 2020-3-7 22:46:01 | 显示全部楼层
类似操作系统中的事件驱动模型,非常有用,收下了

出0入0汤圆

发表于 2020-4-18 16:54:06 | 显示全部楼层
半导体 发表于 2016-9-12 14:40
首先感谢您这么建设性地给我意见,帮助我做出不少改进!
我们重点再说下那个组合键问题。

你好,我使用了您的这个驱动,按键使用正常,就是如果出现误操作的时候,不知道怎么判断。比如两个按键KEY1,KEY2使用了单击事件,这时我就故意同时单击KEY1,KEY2的时候,程序还是会运行KEY1,KEY2相应的单击程序。怎样避免这种情况,是不是避免误操作,需要判断按键的引脚电平了。

出100入101汤圆

发表于 2020-4-18 17:13:48 | 显示全部楼层
还不错 ,代码简洁

出0入55汤圆

发表于 2020-4-18 17:27:07 | 显示全部楼层
楼主,你好,因为你这代码好理解也好用,想用作我的模板,所以代码修改了下,但出现了问题,可以帮忙看看吗?
请各位帮忙看看按键回调函数为啥会引起引脚的反应
https://www.amobbs.com/thread-5732156-1-1.html
(出处: amobbs.com 阿莫电子论坛)

出0入0汤圆

发表于 2020-11-6 05:33:50 | 显示全部楼层
感谢分享,很好的学习资料。

出0入0汤圆

发表于 2020-11-6 07:47:41 来自手机 | 显示全部楼层
感谢分享!备用。

出0入0汤圆

发表于 2020-11-6 08:28:53 | 显示全部楼层
这也是一个不错按键与功能代码架构化实现方案

出0入0汤圆

发表于 2021-5-21 20:24:02 | 显示全部楼层
请教一下楼主,我的按键的是低电平触发,但是我的按键高电平是读出的io可能是值128,不是1,是一个非0值,按下按键读到的是0,需要修改什么吗?

出100入0汤圆

发表于 2021-6-18 16:22:02 | 显示全部楼层
用楼主的代码编译时会提示这个错误,大家怎么解决的啊
Error[Pe167]: argument of type "void (*)(struct Button *)" is incompatible with parameter of type "BtnCallback"
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-20 07:44

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

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