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就灭了。

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

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

  • 9
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: STM32可以通过使用标志位实现按键按功能。具体步骤如下: 1. 首先,需要定义一个标志位变量。可以使用一个全局变量来表示按键的状态,例如"KeyState"。 2. 在按键的初始化函数中,将该标志位初始化为0,表示按键未被按下。 3. 在主循环中,检测按键的状态。可以使用GPIO读取按键引脚的状态,如果检测到按键被按下,则将标志位变量设置为1。 4. 继续在主循环中,判断标志位变量的状态。如果标志位变量为1,则表示按键已经被按下。 5. 接着,利用定时器的中断功能来计时按键按下的时间。可以使用一个计数器变量"KeyCount"来保存按键按下的时间。 6. 在定时器中断的回调函数中,对"KeyCount"进行递增操作。 7. 在主循环中,检测标志位变量的状态。如果标志位变量为1并且"KeyCount"达到一定的阈值,则表示按键已经按。 8. 最后,对按事件进行处理,例如执行相应的功能操作,并将标志位变量重新设置为0,以准备下一次按键检测。 通过以上步骤,可以实现STM32的按键按功能。需要注意的是,定时器的设置和中断的处理需要根据具体的STM32型号和开发环境进行适配。参考相应的STM32资料手册和开发工具文档来完成相应的配置。 ### 回答2: 要用标志位实现按键按功能,可以按照以下步骤进行: 1. 首先,定义一个用于标识按键按状态的标志位变量,比如命名为"longPressFlag",并初始化为0。 2. 在主循环中,不断读取按键的状态。可以使用函数如GPIO_ReadInputPin()等读取按键的电平。 3. 当检测到按键按下时,将标志位变量设置为1,表示按键按下的状态。 4. 然后,再添加一个延时计数器,用于判断按键的持续按下时间。可以使用定时器和中断来实现延时功能。例如,利用定时器计数到一定值时,触发中断,将标志位变量设置为0,表示按键按结束。 5. 在程序中不断检测标志位变量的值,如果标志位变量为1,表示按键按仍在进行中;如果标志位变量为0,表示按键按已结束。 6. 根据标志位变量的值,可以执行相应的逻辑操作,比如按触发某个功能或者执行某段代码。 需要注意的是,标志位设置和清零应该放在适当的位置,以保证程序的正确性。同时,按键的消抖处理也是非常重要的,可以通过软件或硬件的方式来进行按键消抖。 ### 回答3: 在STM32微控制器中,可以使用标志位来实现按键按功能。以下是具体步骤: 1. 首先,需要定义一个标志位变量,例如 "flag",用于标识按键的状态。可以将其定义为全局变量,确保在不同的函数中都可以访问到。 2. 在主程序或主循环中初始化标志位,将其初始值设置为0,表示按键未被按下。 3. 在循环中检测按键的状态。可以使用外部中断或GPIO输入来检测按键的状态。当按键被按下时,将标志位设置为1,表示按键被按下。 4. 使用一个定时器来检测按键的持续按下时间。启动定时器后,定时器开始计时,同时检测标志位的值。如果标志位仍然为1,说明按键仍然被按下,可以根据定时器的计数值判断按键按的时间。 5. 当按键按超过设定的时间后,可以执行相应的操作。可以在定时器中断中将标志位重新设置为0,表示按键的状态已被重置。 通过以上的步骤,就可以实现按键按功能了。需要注意的是,定时器的计数时间和按键按时间需要根据具体的需求进行调整和配置。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麦克斯同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值