c++ 判断双击_STM32多功能按键的原理解析和实现(单击双击长按)

本文介绍了STM32中判断按键单击、双击和长按的原理,通过分析时序图,设定了不同操作的电平时间阈值。在程序源码中,展示了如何利用C++进行按键状态判断,包括长按和双击的处理,以及相应的LED控制。通过对按键按下后高低电平时间的判断,实现了单击、双击和长按的区分,并提供了参数调整以适应不同的应用场景。
摘要由CSDN通过智能技术生成

目录

- 单击、双击、长按原理解析

- 程序源码

- 思考总结

引言:在很多项目开发过程中我们通常会涉及到按键的使用,为了使按键的功能更多远化我们通常会区别按键的单击、双击、长按等操作过程从而实现更多的功能。现在让我们来分析一下他们的实现原理和过程。

一、原理解析(注意i:这里我们的硬件设计为当按键按下为低电平,如硬件设计不一致反过来即可,原理是相同的)

首先我们来看一下单击、双击、长按电平时序图

cb90579eeb322363e8ae2255300f5f75.png

从三种时序图我们可以看出三种操作方式的区别就在于当按键按下后低电平和高电平的时间,通过判断高低电平的变化时间就可以把这三种方式区别开。

单击、和长按的区别:

616cbaed957fe3c0b2c0a929c3e70167.png

单击和双击时序图非常的相似,最大的区别就是按键按下后低电平的持续时间,这里我们对比单击和长按的时序图,可知长按的低电平时间要比单击的要长很多所以这里我们假设单击时低电平的时间为S1,长按时低电平的时间为S2,我们只要在单击和双击之间加一个判断时间这里我们加入S3作为判断,当按键按下时低电平的时间超过了S3则判断为长按,若低电平时间小于S3则判断为单击。我们可以根据自己的需要设定S3的时间来规定什么是长按,什么是单击。

单击和双击的区别:

7a6dabecaa2dd8754b44b9420d99673d.png

通过时序图我们可以看到双击相当于两次单击,双击时第一次按键放开到第二次按键按下有一个时间间隔这里我们用D1表示,而双击和单击的区别在于在D1时间过后单击的电平一直处于高电平状态,而双击则会再次出现一段低电平,这里我们可以加一个定时器在第一次按键放开后开始计时,计时的最大值为D2,这里我们只要判断在D2时间内是否出现了低电平。如果出现了低电平则双击,如果没有出现低电平则为单击。如果出现低电平的时间超过了D2则为两次单击而不是双击。这里我们可以更改D2的时间来改变双击的速度。

**二、程序源码**

```c

在这里插入代码片

#define TOUCH_KEY_A GPIO_Pin_1

#define TOUCH_KEYPORT GPIOA

#define KEYA_SPEED1 100 //长按的时间长度(单位10mS)

#define KEYA_SPEED2 10 //双击的时间长度(单位20mS)

u8 A,B,C;

void KEY_READ(void)

{

if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A)){ //检测按键是否按下

delay_ms(20); //延时去抖动

if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A)){//再次判断

while((!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A))&&C<KEYA_SPEED1){ //循环判断长按,到时跳转

C++;delay_ms(10); //长按判断的计时

}

if(C>=KEYA_SPEED1){ //长键处理

//长按后执行的程序放到此处

GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1));//LED控制

while(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A));

}else{ //单击处理

for(b=0;b<KEYA_SPEED2;b++){//检测双击

delay_ms(20);

if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A)){

a=1;

//双击后执行的程序放到此处

GPIO_WriteBit(LEDPORT,LED2,(BitAction)(1));//LED控制

while(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A));

}

}

if(a==0){ //判断单击

//单击后执行的程序放到此处

GPIO_WriteBit(LEDPORT,LED1|LED2,(BitAction)(0));//LED控制

}

}

A=0;C=0; //参数清0

}

} //按键判断在此结束

喜欢单片机开发的同学可以关注我,持续更新更多技术文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值