【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:在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))
{
}
}
}