CUBEMX之 按键长按短按

本文介绍了如何在STM32G431单片机上使用CUBEMX配置,通过定时器实现按键的长按和短按功能。通过读取GPIO状态,定义了短按和长按的判断条件,其中短按通过延时检测,长按则利用定时器计数判断。在中断回调函数中,根据计数次数触发相应的操作,如LED翻转。
摘要由CSDN通过智能技术生成

CUBEMX之 按键长按短按

本人使用的单片机型号是STM32G431
CUBEMX图:
在这里插入图片描述

常规延时短按

1.定义

#define B1 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0)
#define B2 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1)
#define B3 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2)
#define B4 HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)

2.代码块

u8 key_scan(void)
{
	if(key_up && (B1==0 || B2==0 || B3==0 || B4==0))
	{
		HAL_Delay(10);
		key_up = 0;
		if(B1==0)	return 1;
		else if(B2 == 0)	return 2;
		else if(B3 == 0)	return 3;
		else if(B4 == 0)	return 4;
	}
	else if(B1 && B2 && B3 && B4)
	{
		key_up = 1;
	}
	return 0;
}

3.执行

 while (1){
		ab=key_scan();
		led(ab);
  }

定时器长按+短按

在这里插入图片描述
(说明:频率因为比赛要求设成80M,f=80M/(80*1000)=1KHz)
1.原理
tim1计数100次就是一个检测周期就是0.1s。
每调用一次回调函数检测是否按下,按下countplus++,没按下就不管。
在这100次里检测按下此数>60次,即是短按。
同理tim2计数1000次,次数>600次就是长按。
2.代码块

中断回调函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
	key1=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
	key2=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
	if(key1==0){
    	countplus++;
    }
    if(time1<100){time1++;}
	  else {
		if(countp>60){
			 HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_10);
		}
        countp=0;
	    time1=0;
	 }
	 
	 if(key2==0){
	 countpp++;
     }	
	 if(time2<1000){time2++;}
	 else {
		if(countpp>600){
			 HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_11);
		}
      countpp=0;
	  time2=0;
	}
}

行文至此,点个赞呗

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值