目录
前言
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就灭了。
码字不易,希望喜欢的小伙伴别忘了点赞+收藏+关注,你们的肯定就是我创作的动力。文章来源:https://www.toymoban.com/news/detail-616487.html
欢迎大家积极交流,本文未经允许谢绝转载!!!
文章来源地址https://www.toymoban.com/news/detail-616487.html
到了这里,关于STM32系列——用最简单的方法学会按键长按的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!