STM32F7学习笔记8:按键检测

Dr.Guo
发布于 2024-02-06 / 13 阅读
0
0

STM32F7学习笔记8:按键检测

STM32F7学习笔记8:按键检测

1. 硬件设计

硬件原理图如下:

两个按键加了防抖动功能,原理如下图

2. 软件设计

2.1按键宏定义

//引脚定义

 /*******************************************************/

 #define KEY1_PIN                  GPIO_Pin_0
 #define KEY1_GPIO_PORT            GPIOA
 #define KEY1_GPIO_CLK ()            __GPIOA_CLK_ENABLE()

 #define KEY2_PIN                  GPIO_Pin_13
 #define KEY2_GPIO_PORT            GPIOC
 #define KEY2_GPIO_CLK()           __GPIOC_CLK_ENABLE()

 /*******************************************************/

2.2 GPIO初始化

代码如下:

void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(LED_G_GPIO_Port, LED_G_Pin, GPIO_PIN_SET);

  /*Configure GPIO pin : PtPin */
  GPIO_InitStruct.Pin = KEY2_PIN_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(KEY2_PIN_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pin : PtPin */
  GPIO_InitStruct.Pin = KEY1_PIN_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(KEY1_PIN_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pin : PtPin */
  GPIO_InitStruct.Pin = LED_G_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(LED_G_GPIO_Port, &GPIO_InitStruct);

}

2.3 GPIO按键状态检测

定义按键状态宏

 /** 按键按下标置宏
 * 按键按下为高电平,设置 KEY_ON=1, KEY_OFF=0
 * 若按键按下为低电平,把宏设置成KEY_ON=0 ,KEY_OFF=1 即可
 */
 #define KEY_ON  1
 #define KEY_OFF 0

定义检测按键函数

/**
 * @brief   检测是否有按键按下
 * @param  GPIOx:具体的端口, x可以是(A...K)
 * @param  GPIO_PIN:具体的端口位, 可以是GPIO_PIN_x(x可以是0...15)
 * @retval  按键的状态
 *     @arg KEY_ON:按键按下
 *     @arg KEY_OFF:按键没按下
 */
 uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
 {
     /*检测是否有按键按下 */
     if (HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == KEY_ON ) {
         /*等待按键释放 */
         while (HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == KEY_ON);
         return  KEY_ON;
     } else
         return KEY_OFF;
 }

主函数

  while (1)
  {
    /* USER CODE END WHILE */
    if (Key_Scan(KEY1_PIN_GPIO_Port,KEY1_PIN_Pin) == KEY_ON) {
      HAL_GPIO_TogglePin(LED_G_GPIO_Port,LED_G_Pin);
    }

    /* USER CODE BEGIN 3 */
  }

评论