STM32利用GetTick函数实现长短按键

编程入门 行业动态 更新时间:2024-10-10 21:25:08

STM32利用GetTick函数实现<a href=https://www.elefans.com/category/jswz/34/1749193.html style=长短按键"/>

STM32利用GetTick函数实现长短按键

前言

事情是这样的,在用STM32F103C8T6做平衡小车时,由于4个定时器都使用在编码器、PWM跟超声波模块上了,但又要实现长短按键功能,所以只能另想办法实现

介绍

长短按键

长短按键的实现,无非就是纪录当前按下的按键的时间,再判断松开按键的时间按下的按键的时间是否达到或已经超过自己设定的时间,达到即为长按,反之为短按

实现

而在HAL库中,GetTick函数不断获取uwTick的值,而uwTick的值是被滴答定时器中断调用并累加的,所以可以间接说,GetTick函数可以获取当前系统运行的时间,而长短按键就是利用按下按键的时间长短实现的,所以我们可以利用按下按键时,记录当前的系统运行的时间,松开按键时,用当前系统时间减去按下按键时记录的时间,然后判断就可以了

程序

长短按键部分

      if(backup != KeySta || flag == 1)                     //按键状态发生改变 或 按键一直按下{backup = KeySta;                                 //更新当前按键状态if(flag == 0){flag = 1;now  = HAL_GetTick();                       //获取当前时间}if(backup==1)                                  //按键弹起{flag = 0;if(flag_long == 0)                        //防止长按键事件触发后,按键弹起而再次触发短按键事件{HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);printf("short\r\n");                 //短按键事件}flag_long = 0;                          //清除长按键事件标志}if(backup == 0)                            //按键按下{if((HAL_GetTick() - now) > 1000)      //判断按下时间是否超过1秒{flag = 0;flag_long = 1;HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);printf("long\r\n");              //长按键事件}}}

主函数跟消抖部分

为了演示,使用的是正点原子的探索者开发板,按键消抖使用了定时器6中断实现,该消抖方法具体实现请参考宋老师的《手把手教你学51单片机》里的按键部分,其实按键消抖也是可以利用GetTick函数这个方法实现的,具体实现就不过多赘述了

#include "main.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
uint8_t KeySta = 1;int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();MX_TIM6_Init();/* USER CODE BEGIN 2 */uint8_t backup = 1;uint8_t  flag = 0;          //是否一直按下标志uint8_t  flag_long = 0;     //长按键事件触发标志uint32_t now  = 0;          //按下按键时的时间HAL_TIM_Base_Start_IT(&htim6);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1) {/* USER CODE END WHILE *//* USER CODE BEGIN 3 */if(backup != KeySta || flag == 1)                     //按键状态发生改变 或 按键一直按下{backup = KeySta;                                 //更新当前按键状态if(flag == 0){flag = 1;now  = HAL_GetTick();                       //获取当前时间}if(backup==1)                                  //按键弹起{flag = 0;if(flag_long == 0)                        //防止长按键事件触发后,按键弹起而再次触发短按键事件{HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);//短按键事件printf("short\r\n");                 //短按键事件}flag_long = 0;                          //清除长按键事件标志}if(backup == 0)                            //按键按下{if((HAL_GetTick() - now) > 1000)      //判断按下时间是否超过1秒{flag = 0;flag_long = 1;HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);//长按键事件printf("long\r\n");              //长按键事件}}}}/* USER CODE END 3 */
}//使用定时器中断实现按键消抖
/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{static uint8_t keybuf = 0xFF;if(htim->Instance == TIM6){keybuf = (keybuf << 1) | HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin);if((keybuf&0xFF) == 0x00)KeySta = 0;else if((keybuf&0xFF) == 0xFF)KeySta = 1;}
}

更多推荐

STM32利用GetTick函数实现长短按键

本文发布于:2024-02-06 13:04:40,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1749070.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:长短   按键   函数   GetTick

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!