STM32开发实战系列3-第一次人机交互-按键
上一节的神灯LED是一个不受控制的死循环闪烁,希望做一个人机交互功能,来控制LED的状态。
1.硬件设备
接上一个按键,当接收到按下按键后,LED改变状态。按键如何和核心板通信号的?需要看一下图纸。
用一个5向按键通过一个信号输出引脚接到了PA8.
在LED闪烁代码工程上,用CubeMX重新打开,再次编辑。
在Pinout view视图中,找到PA8引脚,左键点击后,在出现的菜单上选择GPIO_Input.因为系统要接收到外部信号,这里就是Input了。
下一步可以直接点击Generate Code,重新保存代码。同样在Keil中打开。
从工程中的main.c中MX_GPIO_Init方法,导航到gpio.c 可以看到,这次多了几行代码,这是系统帮助初始化的PA8引脚
/*Configure GPIO pin : PA8 */
GPIO_InitStruct.Pin = GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
那么在while循环中如何才能完成判断Key是否被按下呢?这也是可以用框架提供了类库函数来完成,非常方便。
HAL_GPIO_ReadPin用来读取引脚状态
HAL_GPIO_TogglePin反转gpio状态,0变1,1变0。
这里有个容易出现bug的地方,初学者肯定要先入坑。
按下KEY引脚就是高电平,抬起来就回复低电平。如果只判断PA8被按下就进行LED反转,会出现如果一直按住KEY不放手,那就一直在执行反转了。
这里的目的是按下抬起算一个按下过程,所以,就在按下KEY后还要等抬起来再去执行反转LED。别看小小的几行代码,逻辑思路还是要多考虑的。
/* USER CODE BEGIN WHILE */
while (1)
{
if(HAL_GPIO_ReadPin( GPIOA, GPIO_PIN_8) == GPIO_PIN_SET)//当KEY被按下时
{
while(HAL_GPIO_ReadPin( GPIOA, GPIO_PIN_8) == GPIO_PIN_RESET); //等待按键抬起
HAL_GPIO_TogglePin( GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2); //执行反转
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
再次编译工程,下载到开发板,即可看到效果。
有了输入改变逻辑的人机交互,才有了一点编程的感觉了。
- 点赞
- 收藏
- 关注作者
评论(0)