今天我们用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循环后,在松开前灯泡反转一次后,一直处于死循环,直到下一次按键被按下,灯泡再进行反转。
大家有什么问题,欢迎大家留言讨论!!!!
您的支持是我学习的最大动力!!!
标签:小灯,GREEN,LED,KEY2,KEY1,STM32,HAL,按键,GPIO From: https://blog.csdn.net/zzh820383817/article/details/141271564