STM32开发实战系列3-第一次人机交互-按键

举报
神龙居市 发表于 2022/02/22 16:32:31 2022/02/22
【摘要】 上一节的神灯LED是一个不受控制的死循环闪烁,希望做一个人机交互功能,来控制LED的状态。1.硬件设备接上一个按键,当接收到按下按键后,LED改变状态。按键如何和核心板通信号的?需要看一下图纸。用一个5向按键通过一个信号输出引脚接到了PA8.在LED闪烁代码工程上,用CubeMX重新打开,再次编辑。在Pinout view视图中,找到PA8引脚,左键点击后,在出现的菜单上选择GPIO_Inp...

上一节的神灯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 */
}

再次编译工程,下载到开发板,即可看到效果。

有了输入改变逻辑的人机交互,才有了一点编程的感觉了。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。