C语言 如何实现长按和短按?长按时间应为3秒

yqkkidmi  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(200)

我在STM32 F407 VG开发板上工作。我需要用那个处理器设计一个产品。我的应用程序包括SHORT PRESS和LONG PRESS功能。我实现了逻辑。但我不知道问题出在哪。
我在船上使用了用户按钮。我用的是定时器6,它每隔20毫秒就会产生中断。有人可以检查代码并告诉我问题。我知道我还没加去抖动。这一点也需要补充。
目前,当我按下按钮,然后我的执行,但它只在第一,如果条件,这是短按它不处理长按。

volatile uint32_t buttonPressTime = 0;
volatile uint8_t buttonPressed = 0;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM6_Init(void);

#define SHORT_PRESS_THRESHOLD 50 // For example, 50 milliseconds
#define LONG_PRESS_THRESHOLD 3000 // 3 seconds

int main(void)
{
  
  HAL_Init();

 
  SystemClock_Config();

  /
  MX_GPIO_Init();
  MX_TIM6_Init();
 
  HAL_TIM_Base_Start_IT(&htim6); // Start Timer 6 with interrupts enabled
  

  
  /* USER CODE BEGIN WHILE */
  while (1)
  {
      if (buttonPressed) {
                  if (buttonPressTime < SHORT_PRESS_THRESHOLD) {
                      // Handle short press
                      printf("Short Press");
                  } else if (buttonPressTime >= LONG_PRESS_THRESHOLD)
                  {
                      // Handle long press
                      printf("Long presss");
                  }
                  buttonPressed = 0; // Reset flag
              }
  }
 
}

Tim 6初始化

static void MX_TIM6_Init(void)
{

  

  TIM_MasterConfigTypeDef sMasterConfig = {0};

  
  htim6.Instance = TIM6;
  htim6.Init.Prescaler = 55;
  htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim6.Init.Period = 59999;
  htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }

}

回调函数如下

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM6)
    {
        if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
        {
            buttonPressTime++; // Increment button press time
        }
        else
        {
            if (buttonPressTime > 0)
            {
                buttonPressed = 1; // Set button pressed flag
            }
            buttonPressTime = 0; // Reset button press time
        }
    }
}

我的设计应用程序基本上是控制亮度单按和打开/关闭显示使用长按按钮。长按时间应在2-3秒左右。目前,我的代码只是一个基本的代码。我稍后会添加功能。当项目的这一部分开始正常工作时。

jhdbpxl9

jhdbpxl91#

对我来说,无论何时设置buttonPressed = 1,看起来你总是设置buttonPressTime=0
所以当你测试if (buttonPressed)时,buttonPressTime总是0。
我会尝试一些像:

/* USER CODE BEGIN WHILE */
 while (1){ 
      if (buttonPressed) {
              if (buttonPressTime < SHORT_PRESS_THRESHOLD) {
                  // Handle short press
                  printf("Short Press");
              } 
              else if (buttonPressTime >= LONG_PRESS_THRESHOLD) {
                  // Handle long press
                  printf("Long presss");
              }
              buttonPressed = 0; // Reset flag
              buttonPressTime = 0; // Reset button press time
       }
 }
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
    if (htim->Instance == TIM6){
        if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET){
            buttonPressTime++; // Increment button press time
        }
        else{
            if (buttonPressTime > 0){
                buttonPressed = 1; // Set button pressed flag
            }
            //buttonPressTime = 0; // Reset button press time here leads to always buttonPressTime==0
        }
    }
}

相关问题