【STM32】按键控制灯光闪烁实战教程

今天我们用STM32单片机上的按键来控制小灯泡的亮灭,楼主在b站STM32教学中进行学习,其中有几点是楼主觉得对于新手有点难理解的地方进行讲解,详细视频教学请参考,文中配图来源于keysking视频教学(up主做的挺好的,点赞!!!)

【【STM32入门教程-2024】第4集 按键控制小灯 GPIO输入 | keysking的stm32教程】 https://www.bilibili.com/video/BV1Z84y157dx/?p=5&share_source=copy_web&vd_source=9509e6dea87ae27d12da0fcdc70da468

今天需要用STM32完成的任务是:

1、按住单片机上的KEY1键,LED_GREEN亮起,松开KEY1,LED_GREEN熄灭

2、按下单片机上的KEY2键,LED_RED亮起,再按下KEY2,LED_RED熄灭(反转亮灭)

任务1:

下图中的电容作用:消除按键抖动

下图中的10K电阻,为上拉电阻

下图中的PB12为浮空输入模式(并入一个非常非常大的电阻,假设是a,KEY1断开情况下,10K电阻与电阻a进行分压,10K电阻在无穷大的电阻面前,分到的电压几乎为0,所以PB12几乎为3.3V)

此处PB12用于检测KEY1状态(KEY1断开,则PB12直接接入3.3V;KEY1闭合,则PB12接入0V)

代码部分:

  while (1)
  {
	HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin);
	if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET){
		HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin, GPIO_PIN_SET);
	}else{
		HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin, GPIO_PIN_RESET);
	}

  }

代码理解:

HAL_GPIO_ReadPin:用来获取KEY1状态,如果按键被按下,则PB12为低电平,则让LED_GREEN处于高电平点亮;反之如果按键被松开,则执行else语句,LED_GREEN处于低电平熄灭

任务2:

该图为KEY2的原理图,与KEY1图的区别在于,没有了上拉电阻

所以PB13为上拉输入模式(个人理解:自带高电平)

代码部分:

  while (1)
  {	
    if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin) == GPIO_PIN_RESET){
		HAL_GPIO_TogglePin(LED_RED_GPIO_Port, LED_RED_Pin);
		while(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin) == GPIO_PIN_RESET){}
    }

代码理解:

HAL_GPIO_TogglePin的作用是反转,如果灯是熄灭的则变为点亮,如果灯点亮则变为熄灭

问题:如果不加while循环,可以实现功能吗?

答案:不能,因为在按键被按下时,while(1)飞速循环,HAL_GPIO_ReadPin一直在检测KEY2的状态,一直是被按下的状态,则灯泡一直在反转,由于频率太快,肉眼看不出来闪烁,所以一直亮。当松开的时候会出现两种情况,第一种是在松开前灯泡反转为熄灭,松开后灯泡一直亮;第二种是在松开前灯泡反转为亮,松开后灯泡一直熄灭,所以按下按键后,灯泡不一定是亮的。

加上while循环后,在松开前灯泡反转一次后,一直处于死循环,直到下一次按键被按下,灯泡再进行反转。

大家有什么问题,欢迎大家留言讨论!!!!

您的支持是我学习的最大动力!!!

作者:乐观之上

物联沃分享整理
物联沃-IOTWORD物联网 » 【STM32】按键控制灯光闪烁实战教程

发表回复