STM32系列教程:轻松学会按键长按的最简单方法

目录

前言

1. 按键长按原理

2. Cubmx配置

3. keil5编写代码


前言

本教程基于stm32f103c8t6最小系统板,hal库开发。

操作简单,讲解直接清楚,旨在让大家少走弯路。

1. 按键长按原理

(1)要用1个定时器,设置好定时器周期并打开定时器中断。

(2)每隔一段时间进入定时器中断回调函数判断按键是否按下,若按下,count++,将count转化为想要的时间,例如:定时器周期设置为0.1s,长按按键3s就点亮一个LED。这样的话,每隔0.1s,count++,3s=0.1s*30,至少需要进入中断30次,count>30则LED亮起,否则LED不亮。

2. Cubmx配置

这里用的是定时器1作为定时器中断,时钟源使用内部时钟,定时器周期设置为(720*1000)/72000000=0.01s。定时3s,则0.01*300;

 勾选更新中断。

 按键的配置按实际情况去配置,将GPIO mode配置为输入模式这边是按下输入低电平,默认是高电平,所以我默认上拉。

3. keil5编写代码

main.c文件里。

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/*
	每10ms进入一次该函数,检查一下引脚状态
	可以用定时器,也可以用查询
*/
void Key_scan(void)
{
	//1 表示高电平,0表示低电平。低电平时按下	
	uint8_t  val = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_13);
	static uint16_t count=0;
	if(!val)//按键按下 记录按下的时间
	{
		count++;
	}
	else //按键松开 计数值清零并返回按下的时间值
	{
		if(count>300)//按下经过3s  300*0.01s=3s
		{
    		//长按3s
			key_flag = 2;
		}
		count=0;
	}
}

/**
 * @function:void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
 * @description: 定时器中断回调函数,0.01S中断一次
 * @param {TIM_HandleTypeDef *htim} 
 * @return {*}
 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim==&htim1)
	{
		Key_scan();
	}
}
/* USER CODE END 0 */
/* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim1);//开启TIM1的定时器中断
/* USER CODE END 2 */
/* USER CODE BEGIN 3 */
	  if(key_flag == 2)//长按3s了
	  {
		  LED2_on();//放自己想要的操作
//	  key_flag = 0;
	  }
	  else//没有长按3s
	  {
		  LED2_off();//放自己想要的操作
	  }
  }
  /* USER CODE END 3 */

注意长按3s以后key_flag=2,注意有其他功能需要的时候,要在合适的地方把key_flag清零,不能在上面注释的地方清零,那样的话LED亮一下子就灭了,因为如果在那清零,每次循环再判断key_flag时,它就不是2了,LED就灭了。

码字不易,希望喜欢的小伙伴别忘了点赞+收藏+关注,你们的肯定就是我创作的动力。

欢迎大家积极交流,本文未经允许谢绝转载!!!

物联沃分享整理
物联沃-IOTWORD物联网 » STM32系列教程:轻松学会按键长按的最简单方法

发表评论