搜索
bottom↓
楼主: y574924080

[分享][交流]发一个通用按键模块,简单易用 [2014-3-24 Update]

  [复制链接]

出0入0汤圆

发表于 2016-1-10 12:50:53 | 显示全部楼层
不错学习了

出0入0汤圆

发表于 2016-1-12 23:16:25 | 显示全部楼层
新手搞懂这个,并非那么容易,下载了没有用,会用才是王道。

出0入0汤圆

发表于 2016-1-16 00:28:49 | 显示全部楼层
能加上组合键的功能吗?

出0入0汤圆

发表于 2016-1-16 08:04:20 | 显示全部楼层
好思想!以后肯定能用到。谢谢分享

出0入0汤圆

发表于 2016-1-16 11:13:59 | 显示全部楼层
mark,以后慢慢看

出5入10汤圆

发表于 2016-2-29 16:16:26 | 显示全部楼层
mcu_lover 发表于 2013-7-17 19:38
呵呵,不错。我已经用了好几年了。和你的方式一模一样,调用接口也一致,不同的是我把键值和按键状态封装在 ...

你也可以发上来看看,感觉你的写的也挺整齐的。

出0入0汤圆

发表于 2016-3-1 09:30:35 | 显示全部楼层
oxcdd7 发表于 2016-1-16 00:28
能加上组合键的功能吗?

你仔细看看,组合键、多组合键用这个模块都是支持的,从按键队列里类似滑窗的去识别就行,想想街机游戏的连招~

出0入0汤圆

发表于 2016-3-1 12:56:40 | 显示全部楼层
高手,长见识了

出0入0汤圆

发表于 2016-3-4 11:43:16 | 显示全部楼层
通用的模块化设计!好东西啊,学习学习。

出0入0汤圆

发表于 2016-3-4 23:36:41 | 显示全部楼层
学习看看

出0入0汤圆

发表于 2016-3-8 23:54:18 | 显示全部楼层
按键处理那里的状态机部分确实是和农民讲习所讲的那个差不多。

出0入0汤圆

发表于 2016-3-9 16:42:32 | 显示全部楼层
好贴。。。。。。。

出0入0汤圆

发表于 2016-3-18 20:48:52 | 显示全部楼层
宏定义的按键检测次数,长按,连续触发计数与实际的时间对应不上。

出0入0汤圆

发表于 2016-3-18 22:13:27 | 显示全部楼层
举个例子:

#define KEY_UINT_COUNT                    10 // 间隔10ms执行一次key_task()
#define KEY_QUEUE_SIZE                           10
#define KEY_COUNT                                    3
#define KEY_LONG_TIME                           100
#define KEY_REPEAT_TIME                          20

使用STM32L151,内部时钟32MHz,Systick 定时中断 1ms。key_task()间隔10ms运行一次,key_app() 1ms运行一次在超级循环中。

在连续触发事件中翻转IO口,理论上来说,翻转间隔应该是10*3*20 = 600ms,加上代码本身运行的时间,也是600ms超过一点点,但是目前计算的IO翻转频率是1.04Hz,一个周期就是900.9ms,翻转一次IO口也就是连续触发单次响应时间是900.9/2 = 450ms左右。

目前还没查到原因。

出0入0汤圆

发表于 2016-3-19 12:46:26 | 显示全部楼层
这个吊。

出0入0汤圆

发表于 2016-3-19 12:47:47 | 显示全部楼层
我想知道傻孩子工作室现在是什么情况,经常能看到这个工作室的精华帖,我是新人

出0入0汤圆

发表于 2016-4-8 10:14:25 | 显示全部楼层
有谁能讲解一下状态流程图的原理吗?key_check, key_frontend, key_detetor

出0入0汤圆

发表于 2016-4-8 10:39:19 | 显示全部楼层
本帖最后由 Yvan 于 2016-4-8 10:44 编辑
yiming988 发表于 2016-3-1 09:30
你仔细看看,组合键、多组合键用这个模块都是支持的,从按键队列里类似滑窗的去识别就行,想想街机游戏的 ...


如果是key1按住不放,然后key2也按下,这种组合键就不行了吧?

uint8_t get_key_scan_value(void)
{
        if (IS_KEY1_DOWN()) {   //若key1按下
                return KEY_1;        //返回
        }
       
        if (IS_KEY2_DOWN()) {   //若key2按下
                return KEY_2;        //返回
        }
       
        return KEY_NULL;
}

因为key1按住不放之后,永远得不到key2的返回值了啊

出0入42汤圆

发表于 2016-4-8 18:15:23 | 显示全部楼层
谢谢学习了,mark,按键

出0入0汤圆

发表于 2016-4-8 18:21:48 | 显示全部楼层
高大上,先mark一下

出0入0汤圆

发表于 2016-4-16 19:23:38 | 显示全部楼层
Yvan 发表于 2016-4-8 10:39
如果是key1按住不放,然后key2也按下,这种组合键就不行了吧?

uint8_t get_key_scan_value(void)

你没仔细看代码:
get_key_scan_value是按键模块的“输入”,不是按键模块的“输出”

出0入0汤圆

发表于 2016-4-16 20:58:53 | 显示全部楼层
qingaixww 发表于 2014-3-3 17:19
我觉得这样可以,最多只产生KEY_COUNT-1个计数误差,对于按键处理是没有问题的。谢谢你的回复! ...

确实是多了这个计时误差,当初看了半天没想明白作者为啥这么处理。原来是为了消除那个BUG。。。。。。。

出0入0汤圆

发表于 2016-4-16 20:59:49 | 显示全部楼层
yiming988 发表于 2016-4-16 19:23
你没仔细看代码:
get_key_scan_value是按键模块的“输入”,不是按键模块的“输出” ...

这个。。。。我还没想明白,能再解析一下么?我再看看。

出0入0汤圆

发表于 2016-4-17 04:46:06 | 显示全部楼层
状态机真是个好东西。

出0入0汤圆

发表于 2016-4-18 17:32:33 | 显示全部楼层
Yvan 发表于 2016-4-16 20:59
这个。。。。我还没想明白,能再解析一下么?我再看看。

用户从按键事件队列里拿检测结果,前一个key1_down事件后接着key2_down事件  不就是两个键组合了?单键的话是一个key_down后面会有key_up,之后才有其他键的key_down  

所以 这个模块可以无数键组合……   

所以 你要的组合按键“大招识别”功能是有的……

出0入0汤圆

发表于 2016-5-8 20:14:05 来自手机 | 显示全部楼层
下载 学习了!

出0入0汤圆

发表于 2016-5-19 10:29:29 | 显示全部楼层
学习了,用模块化的方式处理按键!!!!

出0入0汤圆

发表于 2016-5-19 14:46:41 | 显示全部楼层
程序中队列部分能通过数组实现么,如果能实现的话相比于队列有什么优缺点呢,小白请教楼主,谢谢~

出0入0汤圆

发表于 2016-5-22 19:38:16 | 显示全部楼层
不错的帖子,学习下

出0入0汤圆

发表于 2016-8-12 22:31:42 | 显示全部楼层
enovo2468 发表于 2014-5-2 21:46
test 2F.rar 找不到..\..\device.h
Fatal Error: cannot open source file "..\..\device.h" H:\test 2F\te ...

我也碰到这样的王缇不知道怎么改  用的是iar  arm 7.2

出0入0汤圆

发表于 2016-8-19 10:48:37 | 显示全部楼层
mark!!!!!!

出0入296汤圆

发表于 2016-8-21 16:28:59 来自手机 | 显示全部楼层
bigwei 发表于 2016-5-19 14:46
程序中队列部分能通过数组实现么,如果能实现的话相比于队列有什么优缺点呢,小白请教楼主,谢谢~ ...

这里的环形队列就是用数组实现的啊。队列是流处理,数组其实是块处理

出10入0汤圆

发表于 2016-8-22 01:00:01 | 显示全部楼层
本帖最后由 huike 于 2016-8-22 01:09 编辑

看楼主位的说明很简单,但是可能自己水平不够没有在KEIL上弄成功。
KEY的通用代码,在里面交织了太多东西了。难以入手。
OOPO.H在KEY.RAR包里没有,KEY和KEYQUEUE里面有两个APP_CFG.H,这两个不一样,有什么区别吗

出0入0汤圆

发表于 2016-9-7 22:07:37 | 显示全部楼层
下载回去慢慢理解

出30入0汤圆

发表于 2016-10-28 13:00:01 | 显示全部楼层
很强大,写的好!

出0入0汤圆

发表于 2016-11-6 13:20:27 | 显示全部楼层
最近在做一个显控的小项目,学习一下按键模块的使用,这个资料太棒了。。

出0入0汤圆

发表于 2016-11-23 17:56:49 | 显示全部楼层
已经移植成功,受益匪浅

出0入0汤圆

发表于 2016-11-23 17:58:38 | 显示全部楼层
下面是我改的一个例程已经验证过了 使用的iar 7.4编译的。

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2016-11-24 15:28:57 | 显示全部楼层
y574924080 发表于 2014-4-9 12:33
我这边验证过这个,确实没有问题

另外有个想确认一下,你的开关全局中断的函数能保证原子性么? ...


我把代码移植到带有操作freertos的操作系统上 ,运行到这个函数KEY_DEQUEUE的SAFE_ATOM_CODE  处时系统会崩溃,我看了代码 现在我怀疑是关了中断没有开中断引起的

出0入0汤圆

发表于 2016-12-10 21:21:53 | 显示全部楼层
yao2013lin 发表于 2016-11-24 15:28
我把代码移植到带有操作freertos的操作系统上 ,运行到这个函数KEY_DEQUEUE的SAFE_ATOM_CODE  处时系统会 ...

我移植ucos上,也是因为这个函数不执行了,直接换成ucos的开关中断, 就好了。程序里的bug楼主也没改,可能事件过于久远了吧

出0入296汤圆

发表于 2016-12-27 17:32:01 | 显示全部楼层
soga238 发表于 2016-12-10 21:21
我移植ucos上,也是因为这个函数不执行了,直接换成ucos的开关中断, 就好了。程序里的bug楼主也没改,可 ...


SAFE_ATOM_CODE的宏一般就是要根据具体平台重新定义的。
你提到程序里的BUG,能说一下是哪个么?我看看抽空修改下。毕竟这个帖子对大家来说有一定的示范效应,有错误就应该修正掉。

另外,做个广告,近期将发布另外一个模块。并以此模块为基础(平台),开展一系列有趣的小设计。

出0入296汤圆

发表于 2016-12-27 17:33:42 | 显示全部楼层
huike 发表于 2016-8-22 01:00
看楼主位的说明很简单,但是可能自己水平不够没有在KEIL上弄成功。
KEY的通用代码,在里面交织了太多东西了 ...

app_cfg.h在模块中是类似基础设施的东西,只用来从模块外部传递配置信息到模块内部,本身通常并不包含有用的信息。

出0入0汤圆

发表于 2017-2-10 16:34:44 | 显示全部楼层
本帖最后由 xiaochu312 于 2017-2-10 17:22 编辑

新手呀,看不懂有在STM32上移植ok 的吗?

出0入0汤圆

发表于 2017-2-14 17:36:43 | 显示全部楼层
呵呵,终于找到这个神帖子了,开心,mark

出0入296汤圆

发表于 2017-2-23 14:21:51 来自手机 | 显示全部楼层
xiaochu312 发表于 2017-2-10 16:34
新手呀,看不懂有在STM32上移植ok 的吗?

硬件无关的软件模块

出0入0汤圆

发表于 2017-3-13 23:13:10 | 显示全部楼层
马上收藏,好的帖子!

出0入0汤圆

发表于 2017-3-24 06:20:54 | 显示全部楼层
收下,用到的时候参考下.

出0入0汤圆

发表于 2017-3-24 07:50:07 | 显示全部楼层
谢谢分享。收藏了。

出0入0汤圆

发表于 2017-4-5 11:09:55 | 显示全部楼层
按键模块程序,收藏学习,谢谢!

出0入0汤圆

发表于 2017-4-5 11:18:21 | 显示全部楼层
从原理讲到代码。。赞。。

出0入0汤圆

发表于 2017-4-5 13:26:08 | 显示全部楼层
非常好,使用方便!

出0入0汤圆

发表于 2017-4-6 09:16:33 | 显示全部楼层
加油了,,,,

出0入0汤圆

发表于 2017-5-28 09:01:55 | 显示全部楼层
平时用C不多,收藏下,有空拜读学习!

出0入0汤圆

发表于 2017-6-11 17:45:57 | 显示全部楼层
果然不错,项目正好用到。呵呵。

出0入0汤圆

发表于 2017-6-16 00:26:31 | 显示全部楼层
精华帖,收藏!

出0入0汤圆

发表于 2017-8-15 11:31:41 | 显示全部楼层
顶四哥,顶老师。另外,最后一个状态图,长按计时的两个输出状态应该是“没有超时”和“超时”吧,就像连按计时那样~

出0入0汤圆

发表于 2017-9-18 21:49:21 | 显示全部楼层
mark,通用按键模块,简单易用。

出0入0汤圆

发表于 2018-4-10 08:15:17 | 显示全部楼层
学习学习数据流图

出200入0汤圆

发表于 2018-6-12 11:25:53 | 显示全部楼层
标记一下,好好拜读~~

出0入0汤圆

发表于 2018-6-12 14:07:15 | 显示全部楼层
按键代码,mark

出0入0汤圆

发表于 2018-7-31 17:41:20 | 显示全部楼层
先MARK一下,下次再来看

出0入0汤圆

发表于 2018-9-20 17:55:55 | 显示全部楼层
it's easy to understand.

出0入4汤圆

发表于 2018-9-24 21:31:16 | 显示全部楼层
正想好好研究一下多功能按键的实现。

出100入0汤圆

发表于 2018-9-25 08:34:08 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2018-11-1 10:06:10 | 显示全部楼层

学习,谢谢!!!

出0入0汤圆

发表于 2018-11-5 09:17:44 | 显示全部楼层
先慢慢看,很厉害

出0入0汤圆

发表于 2018-11-5 14:02:24 | 显示全部楼层
学习!!!感谢分享!!!

出0入0汤圆

发表于 2018-11-5 21:21:24 | 显示全部楼层
楼主辛苦 谢谢分享

出10入12汤圆

发表于 2018-11-13 21:20:29 | 显示全部楼层
看起挺复杂的

出0入0汤圆

发表于 2018-12-11 08:32:00 | 显示全部楼层
感觉按键处理这块还是挺复杂的。

出0入0汤圆

发表于 2019-3-26 12:01:38 | 显示全部楼层
学习,标记一下等会回来学习。

出0入0汤圆

发表于 2019-5-5 14:52:22 | 显示全部楼层
MARK    高手!!!!!!!!

出10入12汤圆

发表于 2019-5-5 16:25:34 | 显示全部楼层
相当不错

出0入0汤圆

发表于 2019-7-10 14:50:57 | 显示全部楼层
坛里都是大神,好好学习

出0入4汤圆

发表于 2019-7-15 07:04:33 | 显示全部楼层
好资料,谢谢楼主分享

出0入0汤圆

发表于 2019-7-15 09:59:14 | 显示全部楼层
扫描按键

出0入0汤圆

发表于 2020-5-21 14:14:17 | 显示全部楼层
顶一下,学习学习!

出0入0汤圆

发表于 2020-6-19 17:22:06 | 显示全部楼层
学习一下 很经典的通用模块

出0入0汤圆

发表于 2020-6-28 17:26:16 | 显示全部楼层
经典就是经典啊  再次学习

出0入0汤圆

发表于 2020-6-28 20:38:15 | 显示全部楼层
非常不错,学习一下!

出0入296汤圆

发表于 2020-7-1 20:06:41 | 显示全部楼层
xyz2008 发表于 2013-11-22 10:39
虽然没有,完全看懂,但应该是可以用了,很好,很强大

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

本版积分规则

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

GMT+8, 2024-4-24 11:22

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

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