OpenEdv-开源电子网

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

精英板键盘组合键的实现分享

[复制链接]

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
发表于 2018-8-19 18:41:09 | 显示全部楼层 |阅读模式
说实话,单片机试验使用到组合键的情况确实不多,一般也就需要单个按键来操作,特殊需要使用组合键都是在键盘资源少又需要作比按键数量多的选择操作的时候需要。
这种情况给使用者带来许多不便的地方:体验差,需要记住很多组合才能正确操作。脑补:一边看使用说明一边操作。
所以,如果真需要作多种选择操作,还是需要一块触摸屏。
不过倒不是说这样就没有价值,我也分享下我写的组合按键试验代码。
感谢这些论坛朋友的分享:http://www.openedv.com/forum.php?mod=viewthread&tid=277263

----------------------------------------------------
我的测试完成和原子教程一样的KEY例程:单独使用按键。
也可以实现:组合多个按键来实现想要的功能。组合按键这里指的是先后按下多个按键,可以有顺序也可以没有顺序。当然,由于没有做过多的设计,按顺序也只能检测最后一个按键是否是指定按键,不能检测超过两个按键的其他两个是否按顺序。比如A_B_C组合只能检测C是最后一个,至于其中的A_B是否先A后B没有检测。
代码只实现了组合按键都按下的要求(就像PC键盘的Ctrl+A),没有实现按顺序分别按下特定键的组合(类似先A释放A,然后B释放B)。
进一步的试验可以实现按顺序分别键入多个键:设计一个键盘缓冲区,对缓冲区进行操作。
-------------------------------------------------
关于防抖处理参考上面给出的参考帖子中我的回复,这里做简单说明。
防抖使用了SysTick实现的自定义定时器,也就是使用SysTick产生脉冲,用这个脉冲做计数脉冲来定时。程序中实现的TimeOn()延时闭合定时器,类似的可以实现TimeOff()延时断开定时器和TimeOnOff()延时闭合和延时断开定时器,甚至于更复杂的定时功能。
防抖使用的是延时闭合定时器TimeOn(),只有稳定的输入才能使定时器定时,出现抖动会复位定时器,这样滤过了抖动干扰。
在组合键检测部分,防抖实现了状态改变抖动:出现状态改变会延时,延时时间内检测值为上次的状态值,只有滤波时间后才使用新的状态值。
KeyComb_Test.zip (293.49 KB, 下载次数: 76)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-8-20 09:50:02 | 显示全部楼层
一个按键其实要求就是简单,稳定
回复 支持 反对

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-8-22 17:36:35 | 显示全部楼层
我顶你,楼主还有其他方案吗?不一定非得加那三句函数。
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-8-22 20:26:14 | 显示全部楼层
思路不错,
不过,感觉为了按键用这么多定时好像有点浪费。

我的程序也刚进行了一些简化改进,
谢谢你说的两次检测方案的隐患提醒。
现在改成可定义的多次检测消抖。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-8-22 20:26:49 | 显示全部楼层
ssssssssssss 发表于 2018-8-22 17:36
我顶你,楼主还有其他方案吗?不一定非得加那三句函数。

为什么对那三句函数这么深恶痛绝?
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

94

主题

369

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2016-8-25
在线时间
485 小时
发表于 2018-8-22 21:27:01 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-8-23 08:40:30 | 显示全部楼层
warship 发表于 2018-8-22 20:26
为什么对那三句函数这么深恶痛绝?

和郭天祥的十天学会单片机的“”十“”差不多,吓唬人。。。那三句话加上感觉消逗反倒麻烦了,个人想法
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-8-23 12:22:14 来自手机 | 显示全部楼层
ssssssssssss 发表于 2018-8-23 08:40
和郭天祥的十天学会单片机的“”十“”差不多,吓唬人。。。那三句话加上感觉消逗反倒麻烦了,个人想法

看看我昨天刚更新的消抖代码,感觉没有比这更简单可靠键盘程序的了
回复 支持 反对

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-8-23 14:26:58 | 显示全部楼层
warship 发表于 2018-8-23 12:22
看看我昨天刚更新的消抖代码,感觉没有比这更简单可靠键盘程序的了

恩,不错,这个方式还是可以接受的,但是那三句代码,没有那三句,也可以,只不过那三句代码用了一个标题:三句代码实现按键,吓唬人,,,,。
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-8-23 19:35:03 | 显示全部楼层
ssssssssssss 发表于 2018-8-23 14:26
恩,不错,这个方式还是可以接受的,但是那三句代码,没有那三句,也可以,只不过那三句代码用了一个标题 ...

那是你太小看那三句了,
如果没有那三句,恐怕要付出三十句的代价也不一定达到同样的效果。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-8-24 08:34:25 | 显示全部楼层
warship 发表于 2018-8-23 19:35
那是你太小看那三句了,
如果没有那三句,恐怕要付出三十句的代价也不一定达到同样的效果。

        Trg=KeyStable & (KeyStable ^ Cont);
        Cont=KeyStable;

       Trg表示触发,Cont表示按下抬起,


回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-8-24 08:43:22 来自手机 | 显示全部楼层
ssssssssssss 发表于 2018-8-24 08:34
Trg=KeyStable & (KeyStable ^ Cont);
        Cont=KeyStable;


其实核心在于Trg的那句算法,它可以保证一次按键只触发一次,不会多次读到重复按键,并且如果定义它是32位的话,则它可以带32个按键同时工作,互不影响各自独立。
回复 支持 反对

使用道具 举报

160

主题

967

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2097
金钱
2097
注册时间
2014-3-7
在线时间
491 小时
发表于 2018-8-24 10:31:48 | 显示全部楼层
warship 发表于 2018-8-24 08:43
其实核心在于Trg的那句算法,它可以保证一次按键只触发一次,不会多次读到重复按键,并且如果定义它是32 ...

有道理哦,加双击试过没
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-8-24 11:09:27 来自手机 | 显示全部楼层
ssssssssssss 发表于 2018-8-24 10:31
有道理哦,加双击试过没

双击相当于两次单击,属于按键序列,没有什么难的。
回复 支持 反对

使用道具 举报

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
 楼主| 发表于 2018-8-27 10:59:41 | 显示全部楼层
warship 发表于 2018-8-22 20:26
思路不错,
不过,感觉为了按键用这么多定时好像有点浪费。

我定义的定时器其实不是专为消除抖动设计的,而是通用定时器的原型,可以扩展成一些需要的定时器功能,比如延时ON、延时OFF、延时ON和OFF等等,扩展性很强。
回复 支持 反对

使用道具 举报

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
 楼主| 发表于 2018-8-30 08:22:55 | 显示全部楼层
最近事情有点忙,没有精力回复。
键盘使用如果需要用到单击、双击、三击,输入按键序列等操作的话可以使用键盘缓冲区来实现。
如果要区别短按、长按也可以加入时间延时检测环节来区分,这个我觉得用在复位之类的地方还可以。
总之,这些都是在正确检出按键后的处理。
键盘缓冲区用FIFO来实现,难度不大,关键是如何匹配预定义的按键序列才通用,这个需要耗些时间来设计。
当然,如果按键序列只是数量有限的几条,那使用逐个匹配的算法也是比较经济的做法。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 11:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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