如何实现长按和短按?长按应该是3秒

问题描述 投票:0回答:1

我正在开发STM32F407VG开发板。我需要使用该处理器来设计产品。我的应用程序包括短按和长按功能。我已经实现了逻辑。但我不知道是什么问题。

我已经使用了船上的用户按钮。我使用了定时器 6,它每 20mS 生成一次中断。有人可以查看代码并告诉我问题所在吗?我知道我还没有添加去抖动。这也需要补充。

当前,当我按下按钮时,我会执行,但它只进入第一个 if 条件,即短按,它不处理长按。

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

Tim6 初始化

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 秒左右。目前我的代码只是一个基本代码。稍后我会添加这些功能。当这部分项目开始正常工作时。

c algorithm button stm32f4discovery long-press
1个回答
0
投票

对我来说,每当你设置

buttonPressTime=0
时,你总是设置
buttonPressed = 1

因此,当您测试

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
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.