8.如何用按键控制LED灯的亮灭
hello,小伙伴们,大家好,这里是左左右,这节课我们讲一下如何通过一个按键实现led灯的亮灭,学过之前课程的小伙伴们可能就要说了,在之前的线路上安装一个开关不就可以了吗?可是加装按钮开关只能实现按下按钮LED灯亮,抬起按钮LED灯灭的功能,我们总不能为了让LED灯亮着用手指一直按着开关按钮吧,还记的我们之前讲过GPIO口不止有输出功能,还有输入功能,这里我们随便选一个IO口设置为输入模式,将我们的开关一端与GPIO口相连,,另一端接地,或接3.3V电源,当另一端接地时,我们将输入模式设置为上拉输入,在按键没有按下时,我们单片机读到的电平是高电平1。
之前我们讲过不管是上拉还是下拉,由于接了大阻值的电阻都是弱上拉和弱下拉,当我们按下按钮时,接地的这条线就被导通了,形成一个强下拉,单片机读到的电平是低电平0。
同理,当另一端接3.3V电源时,我们将输入模式设置为下拉输入,按钮没有按下时,单片机读到的电平是低电平0。
按钮按下时,单片机读到的电平是高电平1。
这时,我们可以通过不断读取IO口的电平来判断按钮是否按下,然后通过判断电平的高低来控制LED灯的亮灭是不是就可以?原理部分是不是还是很简单的?既然原理听明白了,我们就开始实操吧,我们打开cubeide,新建一个工程 ,第一步我们仍然是先设置debug模式为serial wire,找到我们的原理图,从中不难发现按钮一端是与PC13相连的,LED灯是与PA15相连。
在cubeide中我们将PC13设置为输入模式,PA15设置为输出模式,在原理图中我们也可以找到按钮的另一端是与地相连的。
所以我们要将PC13设置为上拉输入模式,这样设置的目的,就是为了在按钮按下前提供一个反向的电平信号,PA15设置为推挽输出模式,设置完成之后我们点击保存,让代码自动生成 ,接着我们找到main.c文件中主函数的while循环,在这里我们一直读取pc13号引脚的变化,当读到pc13号引脚为低电平时,说明我们的按钮此时就被按下了,我们先写一个判断,if hal_gpio_read alt+/ 代码自动补全,这里设置为GPIOC,引脚号为13,我们按下Ctrl鼠标单击进入定义这个函数的地方,有点c语言基础的小伙伴们不难看出,这个函数的返回值是GPIO_PIN_SET和GPIO_PIN_RESET,这也是我们的老朋友了 代表高低电平,为了验证我们的想法,按下Ctrl鼠标单GPIO_PinState,在这里也可以看到确实是这两个返回值,实在看不懂的同学可以把整段函数复制下来,打开我们的vscode安装这两个插件,安装完成后在对话框这里粘贴我们刚才复制的函数,点击回车,然后他就可以帮我们了解这段函数,我们在这里可以看到这段函数的作用,是帮我们读取GPIO引脚的状态,往下滑可以看到返回值,下面还有使用示例,大家可以详细看一下,是不是我们又发现自学的一大利器?,我们回到ide,当识别到按键被按下,我们就将pa15号引脚的电平反转,是不是就可以了,可是我按下时会有一小段停顿,我们将这个停顿while循环中,到这里我们还没有结束,因为按键刚按下时,会有一个抖动,我们将这段抖动加个10ms的延时过滤掉,过滤掉后再次判断按键状态,这样就可以了。
while (1)
{
if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == GPIO_PIN_RESET){
HAL_Delay(10);
if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == GPIO_PIN_RESET){
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_15);
while(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == GPIO_PIN_RESET){}
}
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
只要我们明白原理了,写代码的过程就是实现原理的过程,不断地去修改代码,总会实现我们想要的功能的,我们点击运行,程序没有问题,可以正常运行,我讲最小系统板的接线图也放到这里了,有最小系统板的同学可以这个图接线,好的,今天的课程就到这里了,您的一键三连和关注是我持续更新下去的最大动力,我们下期见