OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6992|回复: 25

借鉴+自己的思考写的状态机按键(有单击,双击,长按,连按功能)

[复制链接]

28

主题

93

帖子

0

精华

高级会员

Rank: 4

积分
572
金钱
572
注册时间
2015-8-3
在线时间
113 小时
发表于 2017-3-14 12:15:29 | 显示全部楼层 |阅读模式
基于UCOSIII,不过稍微修改就可以移植到裸机,删除任务,添加到定时器就行了,以前找了好久都没有找到理想的,很多都是用延时实现,但是实际项目根本不能用延时来做,此次的没有用到延时函数,所以可以用到实际的项目中,不过单独的按键写成了单独的文件(以前是嵌套,但感觉执行效率不高,所以写成了单独的文件),之前用的switch来实现,现在修改成指针函数数组实现,单个按键的功能可以同时为(单击,连击,双击)(单击,长击,双击),如果大家有更优化的方法希望能够能过分享出来,代码不足之处可以直言,以便我再修改.


补充内容 (2017-3-28 15:54):
更新双击啦

补充内容 (2017-4-10 12:20):
之前的有一个BUG,双击会触发单击或短按事件,解决方法是:将单击或者短按置位标志的语句放到key_scan()函数下面的if(doublePressTimeCount > SPACE_TIME)语句中就行了。

KEY_LIB.rar

4.29 KB, 下载次数: 579

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

28

主题

93

帖子

0

精华

高级会员

Rank: 4

积分
572
金钱
572
注册时间
2015-8-3
在线时间
113 小时
 楼主| 发表于 2017-3-28 15:43:58 | 显示全部楼层
新增双击等内容,内有文档

KEY_LIB(增加双击).rar

6.16 KB, 下载次数: 524

回复 支持 反对

使用道具 举报

28

主题

93

帖子

0

精华

高级会员

Rank: 4

积分
572
金钱
572
注册时间
2015-8-3
在线时间
113 小时
 楼主| 发表于 2017-3-28 15:23:56 | 显示全部楼层
szc1990123 发表于 2017-3-24 17:37
最近正在调试按键,也是没有思路,感谢楼主的分享。

后面我又调整了一下,按键的长按可实现长按时间到达后就执行操作,之前的是长按时间到了松手后才会执行,后面的增加了双击了,额,不过不知道怎么在回复里面上传附件。
回复 支持 1 反对 0

使用道具 举报

28

主题

93

帖子

0

精华

高级会员

Rank: 4

积分
572
金钱
572
注册时间
2015-8-3
在线时间
113 小时
 楼主| 发表于 2017-3-14 12:16:31 | 显示全部楼层
含有双击功能的,晚上上传,此为原创,仅供参考.
回复 支持 反对

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2017-3-14 12:20:47 | 显示全部楼层
mark一下,顶一个
回复 支持 反对

使用道具 举报

28

主题

93

帖子

0

精华

高级会员

Rank: 4

积分
572
金钱
572
注册时间
2015-8-3
在线时间
113 小时
 楼主| 发表于 2017-3-14 12:21:56 | 显示全部楼层
顺便求一份,能够直接用于项目的数据包处理程序,比如串口,SPI什么的接收一个完整的数据包(包含帧头,帧尾,校验等)然后提取内容,判定程序的下一步执行。
回复 支持 反对

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
11948
金钱
11948
注册时间
2013-3-8
在线时间
1273 小时
发表于 2017-3-14 20:29:52 | 显示全部楼层
不错,下载下来看看
回复 支持 反对

使用道具 举报

28

主题

93

帖子

0

精华

高级会员

Rank: 4

积分
572
金钱
572
注册时间
2015-8-3
在线时间
113 小时
 楼主| 发表于 2017-3-14 20:32:25 | 显示全部楼层
额,添加不了附件了,
回复 支持 反对

使用道具 举报

28

主题

93

帖子

0

精华

高级会员

Rank: 4

积分
572
金钱
572
注册时间
2015-8-3
在线时间
113 小时
 楼主| 发表于 2017-3-14 20:32:45 | 显示全部楼层
augustedward 发表于 2017-3-14 20:29
不错,下载下来看看

多谢支持,
回复 支持 反对

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
11948
金钱
11948
注册时间
2013-3-8
在线时间
1273 小时
发表于 2017-3-15 09:25:57 | 显示全部楼层
影__ 发表于 2017-3-14 12:21
顺便求一份,能够直接用于项目的数据包处理程序,比如串口,SPI什么的接收一个完整的数据包(包含帧头,帧尾,校 ...

Inner diameter separation_V1.02016-07-18-22-23-06.rar (642.06 KB, 下载次数: 442)
回复 支持 反对

使用道具 举报

11

主题

1044

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3718
金钱
3718
注册时间
2011-5-23
在线时间
2012 小时
发表于 2017-3-15 09:53:51 | 显示全部楼层
最近也需要,拜读一下。
RT-Thread RTOS 音频,WIFI,蓝牙
回复 支持 反对

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2017-3-15 11:51:35 | 显示全部楼层
状态机可以分为竖着写和横着写,一般是用switch来操作,函数指针也可以,楼主这种消抖方式也是我常用的,基本上也没人会用延时一直耗在那里吧,要么定时器要么用系统的定时调用来消抖,纠错一下,楼主写了“指针函数数组”,应该是“函数指针数组”,最后谢谢楼主分享
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

28

主题

93

帖子

0

精华

高级会员

Rank: 4

积分
572
金钱
572
注册时间
2015-8-3
在线时间
113 小时
 楼主| 发表于 2017-3-16 14:29:49 | 显示全部楼层
augustedward 发表于 2017-3-15 09:25
这个你看看,没有操作系统的,还有一种有操作系统的,不方便上传。

好的,非常感谢
回复 支持 反对

使用道具 举报

28

主题

93

帖子

0

精华

高级会员

Rank: 4

积分
572
金钱
572
注册时间
2015-8-3
在线时间
113 小时
 楼主| 发表于 2017-3-16 14:32:21 | 显示全部楼层
229382777@qq.co 发表于 2017-3-15 11:51
状态机可以分为竖着写和横着写,一般是用switch来操作,函数指针也可以,楼主这种消抖方式也是我常用的,基 ...

看来我这个C语言功底还欠缺啊,多谢指点,我之前用定时器,延时,中断,沿检测都用过,但是效果真的很差,误触发经常出现,这个还没有出现过。
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2014-9-4
在线时间
6 小时
发表于 2017-3-24 17:37:56 | 显示全部楼层
最近正在调试按键,也是没有思路,感谢楼主的分享。
回复 支持 反对

使用道具 举报

15

主题

109

帖子

0

精华

高级会员

Rank: 4

积分
826
金钱
826
注册时间
2016-6-28
在线时间
160 小时
发表于 2017-4-9 11:42:12 | 显示全部楼层
楼主,你这程序在采用USE_SINGLE_AND_CONTINUOUS模式的时候,双击按键的动作总会触发单击的按键的标志K2_SinglePressOK = 1;
你有没有办法让单击不受双击的影响呢?谢谢
回复 支持 反对

使用道具 举报

4

主题

211

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2600
金钱
2600
注册时间
2016-7-6
在线时间
546 小时
发表于 2017-4-9 13:22:59 | 显示全部楼层
看了一下,注释比较少,个人水平有限,没看懂,不过还是要感谢楼主的分享
把复杂的事,做简单!
回复 支持 反对

使用道具 举报

28

主题

93

帖子

0

精华

高级会员

Rank: 4

积分
572
金钱
572
注册时间
2015-8-3
在线时间
113 小时
 楼主| 发表于 2017-4-9 19:44:02 | 显示全部楼层
zhanming1990 发表于 2017-4-9 11:42
楼主,你这程序在采用USE_SINGLE_AND_CONTINUOUS模式的时候,双击按键的动作总会触发单击的按键的标志K2_Si ...

嗯嗯,单击和连击我还没实际测试过呢,还不知道有这问题,解决了告诉你,
回复 支持 反对

使用道具 举报

28

主题

93

帖子

0

精华

高级会员

Rank: 4

积分
572
金钱
572
注册时间
2015-8-3
在线时间
113 小时
 楼主| 发表于 2017-4-9 19:45:23 | 显示全部楼层
月无缺 发表于 2017-4-9 13:22
看了一下,注释比较少,个人水平有限,没看懂,不过还是要感谢楼主的分享

没注释的地方基本上就是状态机的实现那一部分,你就理解成几个根据条件跳转执行不同的步骤,
回复 支持 反对

使用道具 举报

15

主题

109

帖子

0

精华

高级会员

Rank: 4

积分
826
金钱
826
注册时间
2016-6-28
在线时间
160 小时
发表于 2017-4-9 23:11:21 | 显示全部楼层
影__ 发表于 2017-4-9 19:44
嗯嗯,单击和连击我还没实际测试过呢,还不知道有这问题,解决了告诉你,

我的想法是:将单击动作在释放按键300ms后执行,设置一个静态全局 变量来计时,到时才置位单击成功标示位。双击判断间隔时间250ms,当按下双击时,首先去清零这个全局变量。整体式用定时器定时10ms去中断扫描按键的。可是自己写的程序还是有问题,不知想法有没有问题??
回复 支持 反对

使用道具 举报

28

主题

93

帖子

0

精华

高级会员

Rank: 4

积分
572
金钱
572
注册时间
2015-8-3
在线时间
113 小时
 楼主| 发表于 2017-4-10 12:11:43 | 显示全部楼层
zhanming1990 发表于 2017-4-9 23:11
我的想法是:将单击动作在释放按键300ms后执行,设置一个静态全局 变量来计时,到时才置位单击成功标示位 ...

我昨天已经修改了,双击不会触发单击事件,现在短按,双击,长按完全独立,只是你的想法应该是想让连按与单击也独立,互不影响,这样的话你可以像长按一样的处理,先计时,时间到了然后看看按键按了几次,我可能之后重构一下这个代码,自己感觉不理想。
回复 支持 反对

使用道具 举报

15

主题

109

帖子

0

精华

高级会员

Rank: 4

积分
826
金钱
826
注册时间
2016-6-28
在线时间
160 小时
发表于 2017-4-10 21:15:09 | 显示全部楼层
影__ 发表于 2017-4-10 12:11
我昨天已经修改了,双击不会触发单击事件,现在短按,双击,长按完全独立,只是你的想法应该是想让连按与 ...

我没想的那么多。不过这个双击不影响单机的,我想了很久也没解决。没想到你移动一条语句就搞定了
回复 支持 反对

使用道具 举报

28

主题

93

帖子

0

精华

高级会员

Rank: 4

积分
572
金钱
572
注册时间
2015-8-3
在线时间
113 小时
 楼主| 发表于 2017-4-10 21:35:31 | 显示全部楼层
zhanming1990 发表于 2017-4-10 21:15
我没想的那么多。不过这个双击不影响单机的,我想了很久也没解决。没想到你移动一条语句就搞定了{:3_41 ...

移动那条语句后,就是在等待双击的时间到了如果没有发生双击,就将单击置为有效,这样如果发生了双击那么单击就不会发生。下面是我添加的。
[mw_shl_code=c,true]#if USE_SINGLE_AND_CONTINUOUS
          // 单击标志置为有效
          K2_SinglePressOK = 1;
        #else
          // 短按标志置为有效
          K2_ShortPressOK = 1;
        #endif[/mw_shl_code]
回复 支持 反对

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-7-19 14:19:05 | 显示全部楼层
用在项目中的?
回复 支持 反对

使用道具 举报

28

主题

93

帖子

0

精华

高级会员

Rank: 4

积分
572
金钱
572
注册时间
2015-8-3
在线时间
113 小时
 楼主| 发表于 2018-7-19 20:24:31 | 显示全部楼层

现在项目中我改用这种方式了,分享一下,几句代码便能完成按键多种状态的检测,按下,弹起,任然按下,未按下四种状态。。。
http://www.openedv.com/forum.php ... 7&fromuid=39048
(出处: OpenEdv-开源电子网)
回复 支持 反对

使用道具 举报

0

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
107
金钱
107
注册时间
2013-1-16
在线时间
17 小时
发表于 2020-12-29 19:44:10 | 显示全部楼层
谢谢 分享!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-15 10:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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