按键长按的方法(已解决)

        在嵌入式蓝桥杯第14届中考察了按键长按的处理,尝试了自己的想法没有成功,所以写个文章研究一下。

我原来的想法是:

        按下按键后打开定时器,定时器计时2s,如果定时器正在运行,就轮询检测按键是否松开,如果松开就是短按。如果定时器计时完成就关闭定时器,等待按键松开,就是长按。这个方式也是没问题的。

代码如下:

//PWM_C初始化为1,在定时器超时后PWM_C=0判定为长按
if(PWM_C==1)//长按
{
    HAL_TIM_Base_Start_IT(&htim6);
    while(HAL_TIM_Base_GetState(&htim6)==HAL_TIM_STATE_BUSY)//定时器正在运行
	{
    	if(HAL_GPIO_ReadPin(B4_GPIO_Port,B4_Pin)==GPIO_PIN_SET)//按键提前松开,就是短按
   		{
			HAL_TIM_Base_Stop_IT(&htim6);
			return;
		}
	}
    //如果是长按就等待按键松开
	if(PWM_C==0)
	    while(HAL_GPIO_ReadPin(B4_GPIO_Port,B4_Pin)==GPIO_PIN_RESET);
}
else//短按
    PWM_C=1;

(我以为错了,但其实是忘记了我的LED灯设置为自动熄灭,以为是按键长按的问题,写这篇文章的时候才发现)

        这种设计只适合于一种长按时间,有时候需要长按3s做出一种响应而长按4s又做出另一种响应。这就需要在定时器中做一个计数的操作,每过1s就加1,判断这个值就可以知道是是什么状态了。

原理和上面的差不多,可以参考麦克斯同学的文章

对于Arduino按键按不接收信号的问题,有多种解决方案。其中一种方法是通过使用超时计时器来检测按键按事件。具体实现方法如下: 1.定义一个变量用于保存按键状态,比如isPressed,初始化为false。 2.在循环中不断检测按键状态,如果按键被按下,将isPressed设置为true,并启动一个计时器,开始计时按时间。 3.如果计时器超时,执行按操作。 4.如果按键被松开,将isPressed设置为false,并停止计时器。 以下是一个简单的示例代码: ``` const int buttonPin = 2; const int longPressTime = 1000; // 毫秒 bool isPressed = false; unsigned long pressStartTime = 0; void setup() { pinMode(buttonPin, INPUT_PULLUP); } void loop() { if (digitalRead(buttonPin) == LOW) { // 按钮按下 if (!isPressed) { // 首次按下 isPressed = true; pressStartTime = millis(); } else { // 按检测 unsigned long pressDuration = millis() - pressStartTime; if (pressDuration >= longPressTime) { // 按处理 // TODO: 在这里执行按操作 } } } else { // 按钮松开 if (isPressed) { isPressed = false; pressStartTime = 0; } } } ``` 在这个示例中,我们使用INPUT_PULLUP模式连接按键,因此按键松开时为高电平,按下时为低电平。我们使用一个常量longPressTime来设置按时间,这里设置为1秒。在循环中,我们首先检测按键状态,如果按键被按下且不处于按状态,我们将isPressed设置为true,并记录开始按下时间。如果按键已经被按下,我们将计算按下时间、检查是否达到按时间,并执行按操作(这里留给读者自己填写)。最后,如果按键松开,我们将isPressed设置为false,结束按状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值