赞
踩
目录
本教程基于stm32f103c8t6最小系统板,hal库开发。
操作简单,讲解直接清楚,旨在让大家少走弯路。
(1)要用1个定时器,设置好定时器周期并打开定时器中断。
(2)每隔一段时间进入定时器中断回调函数判断按键是否按下,若按下,count++,将count转化为想要的时间,例如:定时器周期设置为0.1s,长按按键3s就点亮一个LED。这样的话,每隔0.1s,count++,3s=0.1s*30,至少需要进入中断30次,count>30则LED亮起,否则LED不亮。
这里用的是定时器1作为定时器中断,时钟源使用内部时钟,定时器周期设置为(720*1000)/72000000=0.01s。定时3s,则0.01*300;
勾选更新中断。
按键的配置按实际情况去配置,将GPIO mode配置为输入模式这边是按下输入低电平,默认是高电平,所以我默认上拉。
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就灭了。
码字不易,希望喜欢的小伙伴别忘了点赞+收藏+关注,你们的肯定就是我创作的动力。
欢迎大家积极交流,本文未经允许谢绝转载!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。