你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

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

收藏 评论9 发布时间:2020-1-7 12:09

举报

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

这样效果不错,也简单。
mylovemcu 回答时间:2020-1-7 12:54:51
一般就是长按和短按  也可以增加快速按键两次  功能做多了 容易出现误操作  不太实用了
星夜骑士 回答时间: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
一般就是长按和短按  也可以增加快速按键两次  功能做多了 容易出现误操作  不太实用了 ...

我意思是按键怎么才能在不同场景下实现不同的作用,比如一楼说的“菜单键”、“选择键”两种作用
DavidTan 回答时间:2020-1-7 14:07:46
我觉得吧,没必要想这么多一个方法就能兼容很多很多实际应用场景的问题,还是要从当前的项目应用出发,例如:音量加减按键,长按就要做到连续递增递减;电源键长按就不能有多次的键值触发了,所以还是要贴合实际。

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

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

奏奏奏 回答时间:2020-1-7 14:23:11
定时器中断里面去检测按键IO的电平状态,
这样就可以区分长按与短按,我就是这么处理的
tanic 回答时间:2020-1-7 17:25:14

struct KEY{
key_name;
last_change_tick;
last_io;
};
struct KEY  key_data[32];

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

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

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

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

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

STMWoodData 回答时间:2020-1-15 15:41:46
提示: 作者被禁止或删除 内容自动屏蔽

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版