feier567 发表于 2020-1-7 12:09:56

一个按键检测函数如何实现多种场景的功能

写了个无阻塞按键检测函数,必须放在定时器中断里定期调用,但这样如何在不同的场景中实现不同的按键功能?
比如有两个按键,在屏幕主页中,一个是菜单键另一个是开关屏键。在菜单界面中,又变成了一个是选择键另一个是进入键。还有其他场景的,两个键都有长按短按等等不同功能。
求教该如何实现。

feier567 发表于 2020-3-7 21:11:46

我通过发送键值的方式做出来了,按键扫描函数里,不同的按键动作发送不同键值,可以设置按下、释放等不同键值。
虽然在不同场景下按键动作的功能不一样,但是动作的键值都是一样的。
假设主页中的菜单键和另一个界面的进入键都是实体按键A,那么按下菜单键或进入键,对应的都是实体键A的按下动作,就发送按下的键值,其他动作同理。

这样效果不错,也简单。

mylovemcu 发表于 2020-1-7 12:54:51

一般就是长按和短按也可以增加快速按键两次功能做多了 容易出现误操作不太实用了

Roy.Liu 发表于 2020-1-7 13:42:04

1. 定义一个变量分别用于代表不同场景下的状态,比如在主界面为0,在菜单界面则为1,在其他界面均可依次定义数值来表示。每次场景切换都要重新给场景状态变量赋值。
2. 定义两个变量分别用于对两个按键按下进行计数,释放为0,按下则自动按扫描周期累加1;这样就可以用于判断按键是长按还是短按。
3. 根据场景状态、按键功能定义、按键计数变量,就可以在按键程序中进行各种功能处理了。

feier567 发表于 2020-1-7 14:02:00

mylovemcu 发表于 2020-1-7 12:54
一般就是长按和短按也可以增加快速按键两次功能做多了 容易出现误操作不太实用了 ...

我意思是按键怎么才能在不同场景下实现不同的作用,比如一楼说的“菜单键”、“选择键”两种作用

tgw860910 发表于 2020-1-7 14:07:46

我觉得吧,没必要想这么多一个方法就能兼容很多很多实际应用场景的问题,还是要从当前的项目应用出发,例如:音量加减按键,长按就要做到连续递增递减;电源键长按就不能有多次的键值触发了,所以还是要贴合实际。

当然了,尽量做一个大一统的方法也是另一种思路,只是我个人觉得这样写出来的代码会有点复杂,不是那么好维护。以上只是个人观点

奏奏奏 发表于 2020-1-7 14:23:11

定时器中断里面去检测按键IO的电平状态,
这样就可以区分长按与短按,我就是这么处理的

tanic 发表于 2020-1-7 17:25:14


struct KEY{
key_name;
last_change_tick;
last_io;
};
struct KEYkey_data;

struct KEY_EVENT{
key_name;
key_event;//
};
任务层20ms扫描更新一次所有按键值一个u32 key_io可以表示32个键按下松开状态,检测并更新key_data[]数组,同时根据实际发出按键信号,

其实参考简化 linux输入子系统即可:lol

butterflyspring 发表于 2020-1-15 11:50:14

每个人都有自己的思路,方法,实现的方式也有不同,达到应用目的就好。我这里一般分两个方向考虑:1 按键的检测 (IO引脚的扫描,去抖等)2 按键值的定义,可以在不同的前提条件或场景下赋予不同的意义,也就是检测到有效按键输入后根据当前的条件赋予不同的内容。

流水源 发表于 2020-1-15 15:41:46

可以参考我这个方法。我用在菜单操作当中的。不同状态的菜单中重新设置按键的回调函数,可以实现不同功能。

https://www.stmcu.org.cn/module/forum/thread-618645-1-1.html
页: [1]
查看完整版本: 一个按键检测函数如何实现多种场景的功能