编写示例—同一按键长按和短按不同功能

[复制链接]
crodigy 发表于 2019-1-22 12:00:30 | 显示全部楼层 |阅读模式
一、逻辑编写思路梳理(长短按以1s做举例)
1、需求分析:
a、对于一个按键的长按和短按,都有一个按下(上升沿)的过程;
b、当按键在规定的时间内松开(下降沿),就短按;
c、按下的时长大于规定的时间就是长按。
d、那么要实现该功能,就需要在按键按下时,开始计时。在时间范围内出现下降沿就是短按,否则就是长按。 1.png
e、对于现有的逻辑块中具有计时功能个采集下降沿功能的只有“one shot”和“retrig one shot”;其中“retrig one shot”是重复计时,不符合我们的需求。
f、同样的连续计时的还有“debounce”。

2、逻辑编写(写法一a、用两个“one shot”分别采集按键的上升沿和下降沿。
2.png
说明:
这里上升沿计时为0.8s,即按键按下去,输出0.8s的高电平;短按计时0.3s,即按键送开时,输出0.3s的高电平。
这样如果在0.8s内,按键松开,可以直接认为是短按。
?为什么不将0.8直接填写成1s,是因为下面采用“debounce”计时1s;防止按键恰好在1s左右时松开,短按和长按同时被触发的情况发生。建议时间写成0.5和0.2

b、将两个信号经过“and”,如果“and”输出为1,则表示当前为短按输出。
3.png
c、用“debounce”计时1s,作为连续长按计时;输出结果为长按。
4.png

说明:
以上,我们已经拿到短按的输出“key_up_down”和长按输出“key_debounce”;
我们可以直接用这两个变量分别进行触发短按需要的场景功能和长按要触发的“stepper”场景功能。

缺点:
  • 在按键恰好在0.8s-1s之间松开时,无法执行任何动作。
  • 由于上升沿计时输出0.8s高电平,所以不支持连续快速短按。


3、逻辑编写(写法二:解决写法一的缺点1

a、将写法一的上升沿计时修改为1s;
6.png
b、上面我们已经拿到了1s内的短按输出“key_up_down”和“key_debounce”;那么我们使用“Binary Decoder ”进行情况过滤输出过滤后的长按和短按。
5.png
说明:
当“key_up_down”为1;“key_debounce”为0时,“key_short”输出高电平1;
当“key_up_down”为0;“key_debounce”为1时,“key_long”输出高电平1;
否则不会触发长按或短按输出。


4、逻辑编写(写法三:在写法二的基础上解决写法一的缺点2
a、将上升沿和下降沿的“one shot”增加复位变量
7.png
在这里,当“key_reset”触发时,会对“one shot”进行复位,以便于重新开始计时。
b、每当短按或长按生效时,都对“one shot”进行复位。
8.png
说明:
  • 将方法二中的“key_short”、“key_long”、“de_o4”进行一次或运算。输出的结果延时0.2s触发“key_reset”。
  • 为什么加上“de_o4”是防止在短按和长按同时生效的情况发生也能复位重新来过;
  • 为什么不加“de_o1”,是因为正常情况下这个变量的输出状态值就为1;
  • 为什么要加个“stepper”延时0.2s,是给输出的长短按信号个脉冲宽度,以防宽度太窄无法生效


备注:由于“debounce”特性,以上写法中存在:“长按和长按,短按和长按的间隔要大于1s,否则不执行下次的长按”问题




短按长按.zip

3.42 KB, 下载次数: 1445

admin 发表于 2019-1-22 13:59:15 | 显示全部楼层
回复

使用道具 举报

WSTAR 发表于 2019-1-27 16:11:45 | 显示全部楼层
本帖最后由 WSTAR 于 2019-1-27 17:01 编辑

按照说明写的程序

一键长按短按.cpro

75.3 KB, 下载次数: 1349

回复

使用道具 举报

小叮当 发表于 2019-2-14 17:00:19 | 显示全部楼层
很明白。。。。。。
回复

使用道具 举报

小叮当 发表于 2019-2-22 08:45:34 | 显示全部楼层
有助于系统调试
回复

使用道具 举报

yang_vg6X6 发表于 2019-3-1 14:32:47 | 显示全部楼层
感谢分享,感谢感谢
回复

使用道具 举报

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

本版积分规则