跳到主要内容

【GPIO】按键控制

下载例程代码: 下载代码 如何使用例程【点击查看教程】

通过学习板上的按键KEY1、KEY2控制LED的亮灭。

如何使用例程

编译并下载程序到学习板,即可看到程序效果:

  • 按住 KEY1 绿灯亮,松开绿灯熄灭

  • 按一下 KEY2,蓝灯亮/灭翻转一次

  • 按一下 KEY3,红灯亮/灭翻转一次

正面照

例程讲解

下面介绍了如何自己实现该例程的功能

1、工程配置

  • 分配引脚:在Pinout&Configuration页面,配置如下引脚

    • 输出引脚:将 PA6、PA7、PB0 分别设置为 GPIO_Output,并分别设置 User label 为 BLUE、GREEN、RED

    • 输入引脚:将 PB12、PB13、PB15 设置为 GPIO_Input,并分别设置 User label 为 KEY1、KEY2、KEY3

      左键点击对应的引脚,选择 GPIO_Output 或 GPIO_Input;

      右键点击对应的引脚,选择 User label,分别输入 BLUE、GREEN、KEY1、KEY2

gpio config
  • 配置GPIO:在Pinout&Configuration -> GPIO,将 PB13、PB15 的 GPIO Pull-up/Pull-down 配置为 Pull-up

    学习板仅 KEY1 配置了外部上拉电阻,因此 KEY1 可以不配置 Pull-up。

配置

2、代码

通过 HAL_GPIO_WritePin 函数读取 GPIO 状态,如果是低电平,则说明按键被按下

  • 如果读取到 KEY1 低电平,就点亮绿灯;否则,熄灭绿灯
// 如果KEY1按下,就点亮绿灯
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET){
HAL_GPIO_WritePin(GREEN_GPIO_Port, GREEN_Pin, GPIO_PIN_SET);
}
// 否则,就熄灭绿灯
else{
HAL_GPIO_WritePin(GREEN_GPIO_Port, GREEN_Pin, GPIO_PIN_RESET);
}
  • KEY2 按下,蓝灯亮/灭翻转一次,然后等待按键释放(否则会导致连续翻转)

    按键消抖

    • 读取到 KEY2 是低电平时,先延时 50 ms,再次判断 KEY2 是否还是低电平

    • 如果是,则说明 KEY2 确实被按下

    • 否则,说明 KEY2 是抖动,不做任何操作

// KEY2消抖
if (!HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin)) {
// 如果检测到KEY2低电平,先延时等待50ms
HAL_Delay(50);
// 再判断KEY2是否还处于低电平
if (!HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin)) {
// 确认不是抖动,蓝灯亮灭翻转
HAL_GPIO_TogglePin(BLUE_GPIO_Port, BLUE_Pin);
// 等待KEY2松开,才能开始下一次检测
while (!HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin))
{
}
}
}
  • KEY3 按下,红灯亮/灭翻转一次,然后等待按键释放(否则会导致连续翻转)

    按键消抖

    • 读取到 KEY3 是低电平时,先延时 50 ms,再次判断 KEY2 是否还是低电平

    • 如果是,则说明 KEY3 确实被按下

    • 否则,说明 KEY3 是抖动,不做任何操作

// KEY3 编码器按键
if (!HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin)) {
// 如果检测到低电平,先延时等待50ms
HAL_Delay(50);
// 再判断KEY3是否还处于低电平
if (!HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin)) {
// 确认不是抖动,蓝灯亮灭翻转
HAL_GPIO_TogglePin(RED_GPIO_Port, RED_Pin);
// 等待KEY3松开,才能开始下一次检测
while (!HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin))
{
}
}
}

故障排除

工程建立和配置