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;
}