一看就懂:stm32按键长按短按实现

本文介绍了如何在STM32中实现按键的长按和短按功能,通过定时器扫描按键状态,实现10ms的时间间隔检测。当按键被按下时,记录按下时间,超过特定阈值判断为长按或短按,并相应控制LED1的开关。通过回调函数和串口重定向函数,实现了按键状态的实时反馈。整个过程中涉及到了CUBEMX配置、定时器、串口通讯和LED控制等知识点。
摘要由CSDN通过智能技术生成

stm32按键长按短按实现

实现功能:长按开LED1,短按关LED1


前言

为什么查资料,因为不会啊,为什么不会,这还是个问题。。。害,今天有个实例要用到按键的长按短按,刚开始写遇到了一点问题,在这里分享一下!


一、具体实现过程:

1.CUBEMX配置 LED、 KEY、定时器:10ms(选用)、串口(调试打印)
(对这部分配置不熟悉的,可以去看看基础配置,)

2.点击生成代码:

二、具体使用函数:

代码如下(示例):

/*
	每10ms进入一次该函数,检查一下引脚状态
	可以用定时器,也可以用查询
*/
void Key_scan(void)
{
	//1 表示高电平,0表示低电平。低电平时按下	
	uint8_t  val = HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin);
	static uint16_t count=0;
	if(!val)//按键按下 记录按下的时间
	{
		count++;
	}
	else //按键松开 计数值清零并返回按下的时间值
	{
		if(count>100)//按下经过1s  10*10ms=100ms
		{
    		//长按
			KEY_flag = 2;
			printf("key_flag == 2\r\n");
		}
		else if(count>10 && count <100)//表示超过10ms
		{
			//短按
			KEY_flag = 1;
			printf("key_flag == 1\r\n");
		}
		else
		{
			
			//消抖时间
		}
		count=0;
	}
}
/*
*依据标志位改变LED的状态
*/
void Led_scan()
{
	switch(KEY_flag)
	{
		case 1:
			HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);
		break;
		case 2:
			HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);
		break;
		default:
			break;
	}
}

三、主函数:

/*
*依据标志位改变LED的状态
*/
HAL_Delay(3000);    		   //防止一上电定时器,就开始计数
HAL_TIM_Base_Start_IT(&htim4); //定时器使能
printf("正常\r\n");

  while (1)
  {
    /* USER CODE BEGIN 3 */
//1.查询方式扫描按键状态		
//		Key_scan();
//		Led_scan();
//		HAL_Delay(10);
//2.定时器方式扫描按键状态			
		Led_scan();
  }
  /* USER CODE END 3 */

五、回调函数:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	Key_scan();
	HAL_TIM_Base_Start_IT(&htim4); //再次使能
}

六、串口重定向函数:

在uart.c中添加:

/**
  * 函数功能: 重定向c库函数printf到DEBUG_USARTx
  * 输入参数: 无 
  * 返 回 值: 无
  * 说    明:无
  */
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}

总结

现在看看其实代码也挺好理解,可为什么当时没写出来呢,害,还需继续努力。在嵌入式这条路上我还是个菜鸡,路漫漫其修远兮,在这里主要是把我学习遇到的坑分享一下!
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值