OpenEdv-开源电子网

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

按键扫描(不支持连按)

[复制链接]

22

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2018-7-16
在线时间
58 小时
发表于 2018-7-19 22:48:30 | 显示全部楼层 |阅读模式
1金钱
上图是stm32学习视频里的一个按键扫描的函数,但总觉得怪怪的,假设确实按下,第二个if里面的返回键值,这个没问题,为何后面又返回没有按下?这不和假设矛盾吗?
QQ图片20180719224420.png

最佳答案

查看完整内容[请看2#楼]

程序逻辑是:共有三种情况 一:key_up=1 且 正有键被按下; 处理方法:延时消抖,令key_up=0;延时后键确实按下,返回键值。延时后已无键按下,说明是抖动,走最后一句,返回无键。 二:没有键被按下;说明键已释放,令key_up=1,也走最后一句,返回无键 三:key_up=0 且 正有键被按下;说明是老键还没有松开, 走最后一句,返回无键 所有本代码的实际效果是:当且仅当在前续按键已松开的情况下又有按键被按下,并且延时 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4520
金钱
4520
注册时间
2018-5-11
在线时间
946 小时
发表于 2018-7-19 22:48:31 | 显示全部楼层

程序逻辑是:共有三种情况
一:key_up=1 且 正有键被按下;   处理方法:延时消抖,令key_up=0;延时后键确实按下,返回键值。延时后已无键按下,说明是抖动,走最后一句,返回无键。
二:没有键被按下;说明键已释放,令key_up=1,也走最后一句,返回无键
三:key_up=0 且 正有键被按下;说明是老键还没有松开, 走最后一句,返回无键

所有本代码的实际效果是:当且仅当在前续按键已松开的情况下又有按键被按下,并且延时后仍有效时才返回键值。 其它情况均返回无键,但会影响标志位。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

105

主题

522

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1386
金钱
1386
注册时间
2012-10-23
在线时间
97 小时
发表于 2018-7-20 09:11:30 | 显示全部楼层
第一个return返回了,第二个return就不执行了。没毛病
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
发表于 2018-7-20 09:38:33 | 显示全部楼层
延时消抖...
我有故事,你有酒吗
回复

使用道具 举报

9

主题

796

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2038
金钱
2038
注册时间
2017-8-2
在线时间
522 小时
发表于 2018-7-20 09:59:43 | 显示全部楼层
判断为确实按下时,函数已经在 return key_value;处返回,不会再执行到第二个return处
猪猪熊呢?
回复

使用道具 举报

0

主题

113

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3321
金钱
3321
注册时间
2017-12-14
在线时间
406 小时
发表于 2018-7-20 10:42:01 | 显示全部楼层
我觉得你还是好好学习C语言吧,这个纯脆是语法问题
回复

使用道具 举报

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
发表于 2018-7-20 14:24:08 | 显示全部楼层
不是假设,三处的按键检测是不同时期的检测。也就是说即使延时前按下了,延时后检测的结果也可能没按下。都是直接读取硬件值,并不是同一个缓存值。
回复

使用道具 举报

22

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2018-7-16
在线时间
58 小时
 楼主| 发表于 2018-7-20 22:20:48 | 显示全部楼层
miaoguoqiang 发表于 2018-7-20 09:11
第一个return返回了,第二个return就不执行了。没毛病

我是习惯把if语句里的内容用花括号
回复

使用道具 举报

22

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2018-7-16
在线时间
58 小时
 楼主| 发表于 2018-7-20 22:29:26 | 显示全部楼层
feichangkunge 发表于 2018-7-20 10:42
我觉得你还是好好学习C语言吧,这个纯脆是语法问题

嗯嗯,谢谢
回复

使用道具 举报

22

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2018-7-16
在线时间
58 小时
 楼主| 发表于 2018-7-20 22:34:56 | 显示全部楼层
warship 发表于 2018-7-19 22:48
程序逻辑是:共有三种情况
一:key_up=1 且 正有键被按下;   处理方法:延时消抖,令key_up=0;延时后 ...

谢谢,我一直以为,满足第一个条件,程序还会把剩下的语句执行完(除了那个else if)。
回复

使用道具 举报

22

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2018-7-16
在线时间
58 小时
 楼主| 发表于 2018-7-20 22:41:05 | 显示全部楼层
miaoguoqiang 发表于 2018-7-20 09:11
第一个return返回了,第二个return就不执行了。没毛病

谢谢      
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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