左左右学堂 · 课程目录

第08期 如何用按键控制LED灯的亮灭

观看B站原视频 · 文稿与高清画面

helllo,小伙伴们,大家好。这里是左左右。这节课我们讲一下如何通过一个按键实现led灯的亮灭?学过之前课程的小伙伴们可能就要说了。在之前的线路上安装一个开关不就可以了吗?可是加装按钮开关只能实现按下按钮LED灯亮。抬起按钮LED灯灭的功能。我们总不能为了让LED灯亮着用手指一直按着开关按钮吧。

视频画面 00:32.5
视频画面 00:32.5 · 1080P 原图 · 查看对应视频

还记的我们之前讲过GPIO口不止有输出功能,还有输入功能。这里我们随便选一个IO口设置为输入模式。将我们的开关一端与GPIO口相连,另一端接地,或接3.3V电源。当另一端接地时,我们将输入模式设置为上拉输入。在按键没有按下时,我们单片机读到的电平是高电平1。之前我们讲过不管是上拉还是下拉。

由于接了大阻值的电阻都是弱上拉和弱下拉,当我们按下按钮时,接地的这条线就被导通了。形成一个强下拉。单片机读到的电平是低电平0。同理,当另一端接3.3V电源时。我们将输入模式设置为下拉输入。按钮没有按下时,单片机读到的电平是低电平0,按钮按下时,单片机读到的电平是高电平1,这时,我们可以通过不断读取IO口的电平来判断按钮是否按下?

然后,通过判断电平的高低来控制LED灯的亮灭是不是就可以?原理部分是不是还是很简单的?既然原理听明白了,我们就开始实操吧。我们打开cubeide,新建一个工程。第一步我们仍然是先设置debug模式为serial wire。找到我们的原理图。从中不难发现按钮一端是与PC13相连的。

视频画面 01:54.6
视频画面 01:54.6 · 1080P 原图 · 查看对应视频

LED灯是与PA15相连的,在cubeide中我们将PC13设置为输入模式。PA15设置为输出模式。在原理图中我们也可以找到按钮的另一端是与地相连的。所以,我们要将PC13设置为上拉输入模式,这样设置的目的,就是为了在按钮按下前提供一个反向的电平信号。PA15设置为推挽输出模式。

视频画面 03:16.7
视频画面 03:16.7 · 1080P 原图 · 查看对应视频

设置完成之后我们点击保存,让代码自动生成。接着,我们找到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引脚的状态。

视频画面 04:38.8
视频画面 04:38.8 · 1080P 原图 · 查看对应视频

往下滑可以看到返回值。下面还有使用示例。大家可以详细看一下。是不是我们又发现自学的一大利器?我们回到ide。当识别到按键被按下,我们就将pa15号引脚的电平反转。是不是就可以了?可是我按下时会有一小段停顿。我们将这个停顿while循环中。到这里我们还没有结束。因为按键刚按下时,会有一个抖动。

视频画面 06:00.9
视频画面 06:00.9 · 1080P 原图 · 查看对应视频

我们将这段抖动加个10ms的延时过滤掉。过滤掉后再次判断按键状态。这样就可以了。只要我们明白原理了,写代码的过程就是实现原理的过程。不断地去修改代码 总会实现我们想要的功能的。我们点击运行 程序没有问题。可以正常运行。我讲最小系统板的接线图也放到这里了。有最小系统板的同学可以这个图接线。

好的 今天的课程就到这里了。您的一键三连和关注是我持续更新下去的最大动力。我们下期见。