Guía de desarrollo de STM32F1 Nota 19: uso avanzado de teclas de clic, doble clic, pulsación larga, deslizar

Los botones se dividen en botones mecánicos y botones táctiles (capacitivos / resistivos).
Las teclas mecánicas necesitan una operación antivibración, y la alta sensibilidad de las teclas táctiles puede eliminar el proceso antivibración.

El clic del botón es una operación de rutina, pero ¿cómo hacer doble clic y deslizar?

Juicio de doble clic:
después de presionar y soltar el botón, determine si el botón se presiona nuevamente dentro de un período de tiempo específico. Si se presiona nuevamente, es una operación de doble clic. Tenga en cuenta que el período de tiempo especificado es más corto (unas pocas docenas de milisegundos) )

Juicio de presión prolongada: presione
el botón y manténgalo presionado durante un período de tiempo específico, puede juzgar que es una operación de presión prolongada, preste atención a que este período de tiempo especificado sea más largo (unos segundos).

Operación de deslizamiento: deslice
de la tecla A a la tecla B, cómo juzgar si se está deslizando en lugar de la tecla A y la tecla B, haga clic por separado: cuando se presiona la tecla A y la tecla A y la tecla B se mantienen al mismo tiempo durante la liberación rápida, luego suelte Presione la tecla A y mantenga presionada la tecla B. Hay un intervalo de tiempo que mantiene presionada la tecla AB al mismo tiempo. Esta operación puede considerarse deslizante.

El código es el siguiente:

#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "touch_key.h"
#include "usart.h"

#define KEYA_SPEED1	100	  //长按的时间长度(单位10mS),总共1S
#define KEYA_SPEED2	10	  //双击的时间长度(单位20mS),总共200ms

int main (void){//主程序
	u16 k=1000;	//用于滑动加减计数
	u8 a=0,b,c=0;
	u8 s=0; //刚刚结束滑动标志
	RCC_Configuration(); //系统时钟初始化 
	USART1_Init(115200); //串口初始化,参数中写波特率
	LED_Init();//LED初始化
	TOUCH_KEY_Init();//按键初始化

	while(1)
	{
//A
		if(!GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2))	//检测按键是否按下
		{ 
			delay_ms(20); //延时去抖动
			if(!GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2))	//判断长短键
			{
				while((!GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2))&&c<KEYA_SPEED1) //循环判断长按,到时跳转
				{ 
					c++;
					delay_ms(10); //长按判断的计时,1S
				}
				if(c>=KEYA_SPEED1)	 //长键处理
				{
					//长按后执行的程序放到此处
					GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)(0));//LED控制
					printf("A键长按 \r\n");
					while(!GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)); //等待按键松开
				}
				else	//单击处理
				{ 
					if(!GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3))	//判断B键按下
					{
						k++; //用于显示的计数值
						printf("A键右滑 %d \r\n",k); 
						a=1;s=1; //a是单双击判断标志,s是刚刚结束滑动标志
					}
					if(a==0)
					{
						for(b=0;b<KEYA_SPEED2;b++)	//检测双击
						{
							delay_ms(20);
							if(!GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2))
							{
								a=1;
								//双击后执行的程序放到此处
								GPIO_WriteBit(GPIOE,GPIO_Pin_5,(BitAction)(0));//LED控制
								printf("A键双击 \r\n");
								while(!GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2));	//等待按键松开
							}
						}
						if(a==0)	//判断单击
						{ 
							if(s==1)	//判断是不是刚执行完滑动操作
							{ 
								s=0; //如果是则本次不执行单击处理(因为是滑动的放开操作)
							}
							else	//如果不是,则正常执行单击处理
							{	 
								//单击后执行的程序放到此处
								//GPIO_WriteBit(LEDPORT,LED1|LED2,(BitAction)(0));//LED控制
								GPIO_WriteBit(GPIOB,GPIO_Pin_5,(BitAction)(1));
								GPIO_WriteBit(GPIOE,GPIO_Pin_5,(BitAction)(1));
								printf("A键单击 \r\n");
							}
						}
					}
				}
				a=0;c=0; //参数清0
			}
		}
	}
}
	

Análisis de código:

Primero determine si se debe presionar prolongadamente (el nivel bajo se mantiene durante 1 segundo), luego determinar si se desliza hacia la derecha (el botón B se presiona simultáneamente) y luego determinar si se debe hacer doble clic (presione el botón nuevamente dentro de 200 milisegundos).

Fenómeno experimental:

Inserte la descripción de la imagen aquí

Descargo de responsabilidad: este artículo se refiere a la enseñanza STM32 de Du Yang.

35 artículos originales publicados · Me gusta1 · Visitas1713

Supongo que te gusta

Origin blog.csdn.net/qq_38958704/article/details/105616760
Recomendado
Clasificación