打印
[其他ST产品]

一种基于中断的按键检测方法

[复制链接]
636|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xdvca|  楼主 | 2023-11-23 22:53 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
slam_navigation原创:
按键检测是初学单片机的同学玩的前几个例程,按键的种类有许多(普通按钮,矩阵键盘等等),按键检测的方法也有许多。对于普通按钮当然你会说设计一个外围电路通过GPIO口读一下还不简单,或许你说通过外部中断做边沿检测,对于矩阵键盘来说,往往你会通过行列分别扫描的方法做按键检测,通常我们会加一个按键防抖(经典的方法是通过延时二次确认的方法进行按键防抖,还有就是按键释放的时候你可能会通过while语句去防抖,也就是按键如果一直按下,让程序一直死在while里),这些都是初学者常用的方法,但是如果是一个大的程序,往往是不允许你有这么多延时和死循环的。

中断是一个经常使用的按键检测方法,中断之间的时间就可以作为防抖的处理,而且这种方法适用于程序融合,因为其他传感器的数据读取通常也是通过中断的手段去做的(如摄像头)。我这里给出一个问题和一个解决办法。

问题:设计一个按键检测程序(多按键),通过中断去读取,要求只有在按键更新的时候才会在主程序里做出响应,否则不理睬,要求设计防抖动,只有两次检测为真时,才进行键值的更新,真值表如下。


————————————————
版权声明:本文为CSDN博主「slam_navigation」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/slam_navigation/article/details/55657896

使用特权

评论回复
沙发
xdvca|  楼主 | 2023-11-23 22:54 | 只看该作者
IN_old_stable为旧的确定值。

IN_new_stable为新的确定值。

IN_old为上次读取的按键值。

IN_new为最新读取的按键值。

当然每次中断后都需要做一次迭代:

IN_old=IN_new;

IN_old_stable=IN_new_stable;
只有新的确定值是我们值得信赖的。

由真值表的计算规则:

IN_new_stable:     D

IN_old_stable:       A

IN_old:                    B

IN_new:                  C

有:


所以有:

使用特权

评论回复
板凳
xdvca|  楼主 | 2023-11-23 22:54 | 只看该作者
解决:我以STM32F103为例,需要读取GPIO,B口的低四位。

我们首先在中断里最如下处理:

IN_old=IN_new;

IN_old_stable=IN_new_stable;  //前面两行先做迭代。
IN_new=(GPIO_ReadInputData(GPIOB))&0x00001111;//读取GPIOB的低四位。

IN_temp=(IN_old^IN_new)&IN_old_stable; //中间变量

IN_temp|=IN_old&IN_new;
IN_new_stable=IN_temp;这就得到了我们最新的键值,它是由过去旧的确定值,按键前后两次的值所决定的,所以您看,是不是至少得经历三次中断才能把一个键值更新。

使用特权

评论回复
地板
xdvca|  楼主 | 2023-11-23 22:55 | 只看该作者
好了,到了这里我们把按键的值检测出来了,我们还有一步,如何告知主函数有没有键值更新呢。

我们分析一下可以知道:如果我们比较IN_new_stable和IN_old_stable两次确定值是不是就知道了

定义temp=IN_new_stable^IN_old_stable;如果低四位上有键值更新,则IN_new_stable和IN_old_stable前后两次确定值是不是就不一样了,通过异或计算就反映在了相应的位上。
好了我们假设低四位在硬件设计时是拉高的,我们初始化一个中间变量sthchange=0x00001111;

我们把sthchange和temp进行异或就知道哪一位被置低了。

使用特权

评论回复
5
xdvca|  楼主 | 2023-11-23 22:55 | 只看该作者
sthchange^=temp.

则把sthchange给主程序判断就行了,当没有键值更新的时候sthchange=0,有键值更新的时候sthchange>1,通过位运算不就知道哪个键值发生改变了。

使用特权

评论回复
6
EmmaTT| | 2024-4-8 14:12 | 只看该作者
要存储几次值啊

使用特权

评论回复
7
童雨竹| | 2024-7-16 07:26 | 只看该作者

脉冲变压器的原/副边相位关系,

使用特权

评论回复
8
Wordsworth| | 2024-7-16 08:29 | 只看该作者

有不普通的门道

使用特权

评论回复
9
Clyde011| | 2024-7-16 09:32 | 只看该作者

只能处理较小的能量

使用特权

评论回复
10
公羊子丹| | 2024-7-16 10:25 | 只看该作者

测试结果可能包括输出电压和电流、电压波浪、效率、负载能力等指标

使用特权

评论回复
11
万图| | 2024-7-16 11:28 | 只看该作者

电路正常工作

使用特权

评论回复
12
Uriah| | 2024-7-16 12:31 | 只看该作者

灌封前基材外观保持清洁和干燥。将混合好的胶料灌注于需灌封的器件内

使用特权

评论回复
13
帛灿灿| | 2024-7-16 14:27 | 只看该作者

给瞬间电流提供低阻抗导通路径

使用特权

评论回复
14
Bblythe| | 2024-7-16 15:30 | 只看该作者

最典型的应用就是放大电路中的高低音频控制

使用特权

评论回复
15
周半梅| | 2024-7-16 17:26 | 只看该作者

需要设置电压钳位电路予以保护D3、N3构成的回路

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

357

帖子

0

粉丝