STM32-按键控制LED&光敏传感器控制蜂鸣器(五)

按键控制LED&光敏传感器控制蜂鸣器

改个名字:

下面完成led和按键的驱动代码,这两部分驱动代码都混到主函数里面,代码太乱了,对于驱动代码而言,一般封装起来,单独放在.c和.h里,模块化编程方式:

模块化编程:

led闪烁:

在.c加led初始化函数:

.h文件:

可以看到led亮起来了,因为gpio配置好了之后默认就是低电平,所以还没有操作LED就亮起来了

可以在初始化里面加上这行,设置高电平,初始化后就熄灭了

添加led的开关函数:

两个led交替闪烁:

独立按键控制led:

按键驱动代码:

我们的按键是接在 GPIOB 上的,所以第一个参数是 RCC_ APB2 外设 GPIOB。 然后第二个参数写 enable 开启时钟。接着跟 GPIO 输出也是一样啊,另一个结构体变量 GPIO_ LED InitTypeDef,变量名叫 GPIO_ LED 的 structure。 然后把结构体的成员用点运算符都引出来,先放在这。

最后调用 GPIOInit的函数,第一个参数是 GPIO B, 初始化 GPIO B外设。第二个参数是结构体变量名,前面加上取地址的符号。

然后填一下参数,第一个 GPIO mode, 这里因为我们需要读取按键,所以我们需要选择 GPIO mode ipu 上拉输入啊。第二个 GPIO pin, 因为我们按键接在了 p P1 和 P11 口上,所以写 GPIO_ Pin1 或上 GPIO_ Pin11,选中 1 号和 11 号口。第三个 GPIO_ Speed 的,这里的速度是 GPIO 的输出速度哈,在输入模式下这个参数其实是没用的,那我们还是填上 GPIO_ Speed 的 50 兆赫兹哈,这个也没啥影响。这样按键的初始化就完成了。

接着我们再来写个读取按键值的函数。我们在这下面写上

在中间这里我们就需要用到读取 GPI O 端口的功能了。那先找一下 GPI O 的库函数文件,打开 GPI O 点 h 的文件,翻到最后。来看一下这四个 GPI O 的读取函数。

第一个是 GPI O_ Read_ input_ DataBit,这个函数是用来读取输入数据寄存器某一个端口的输入值哈。它的参数是 GPI O _X 和 GPI O _PIN,用来指定某一个端口。返回值是是 Unit 8 杠 7,代表这个端口的高低电平。读取按键我们就需要用到这个函数啊。我们再看一下第二个,

GPIO_ Read_ input_ Data。这个函数比上一个函数少了个 bit,它是用来读取整个输入数据寄存器的。参数只有一个 GPIO_ X,用来指定外设。返回值是 uint16_ t,是一个 16 位的数据。每一位代表的端口值。

第三个, GPIO_ ReadOutputDataBit, 这个函数是用来读取输出数据寄存器的某一个位啊。所以原则上来说它并不是用来读取端口的输入数据的。这个函数一般用于输出模式下,用来看一下自己输出的是什么。具体有什么用啊

那最后一个 GPIO_ ReadOutputData, 这个函数也是少了一个 bit 啊,意思也是一样,是用来读取整个输出寄存器的。

我们打开 PPT 看一下这个图啊,对照一下这个图应该就好理解了。 GPL_ Read_ input_ Data_ bit 就是读取这里输入数据寄存器的某一位。 GPL_ Read_ input_ Data 就是读取这整个输入数据寄存器。 GPL_ Read_ output_ Data_ bit 就是读取这里输出数据寄存器的某一位。 GPL_ Read_ output_ Data 就是读取这整个输出数据寄存器。

所以说如果你想读取 GPL 口的话,需要用 Read_ input 的这两个函数。如果在输出模式下想要看一下现在输出了什么,才需要用到 Read_ output 的这两个函数啊。这就是这四个函数的用途。

定义外面的是全局变量啊, 函数里面的是局部变量,两者的作用域不一样。在函数里面的是局部变量,只能在本函数里使用。在函数外面的是全局变量,每个函数都可以使用啊。在函数里优先使用自己的局部变量,如果没有,才会使用外部的全局变量。那我就用这个全局变量来接返回值啊,

按下右边:led1点亮

按下左边:led1熄灭

那我们演示的程序是按一下熄灭,再按一下点亮,也就是按键按下, LED 的状态取反,这个该怎么实现呢?这就需要用到 GPIO_ ReadOutputData 的函数了。

我们可以在 LED 的驱动里再加一个函数啊, void LED1Turn,调用这个函数, LED1 的状态取反。在里面我们可以写 if 复制一下 GPIO_ ReadOutputDataBit 这个函数,放到这里啊。

GPIO 刚被初始化为推挽输出模式时,输出寄存器的默认值是 0也就是说,引脚一上电、初始化完成,默认就是低电平

这样就实现了端口的电平翻转,这也是 GPIO_ ReadOutputData 函数的用途,一般用于输出模式下。

GPIO 刚被初始化为推挽输出模式时,输出寄存器的默认值是 0

led初始化代码会把pin1、pin2拉高

就可以实现按下亮,松手灭

光敏电阻控制蜂鸣器:

封装蜂鸣器模块:

函数跟led类似,改动一下就行:

测试下:

蜂鸣器就会响了没有问题

封装光敏传感器模块

然后复制一下按键这里的初始化程序,粘贴到这里。修改一下,始终 GPIOB 不用改, GPIOB 模式可以选择上拉输入模式。如果这个模块始终都接在插头上,也可以选择浮空输入哈,只要保证引脚不会悬空即可。那我们这里就选择上拉输入模式吧。然后引脚这里,因为光敏传感器连接的是 PB13 号口,所以改成 GPIOB13。下面初始化这里 GPIOB 也没问题。这样初始化就完成了。

接下来写一个读取端口的函数,这里我们的需求比较简单哈,直接写个返回端口值的函数就行了。比如, UNIT8 t get void。然后直接 return 了 GPIOReadInputDataBit。GPIOB、 GPIOP13,这就完成了。

就实现了遮住光明电阻,蜂鸣器响,拿开,不响

相关推荐
猪八戒1.02 小时前
Allergo Cadence学习笔记
嵌入式硬件
危桥带雨2 小时前
WDG理论知识
stm32·单片机·嵌入式硬件
minglie12 小时前
单片机内存管理CmemTable
单片机·嵌入式硬件
济6172 小时前
FreeRTOS 控制任务设计 (2)--- 运动学逆解 + PID 闭环 + PWM 驱动全流程实现
stm32·单片机·嵌入式·freertos
szxinmai主板定制专家2 小时前
基于RK3588超小体积,轻巧,长续航的无人机AI模块,支持视频跟踪
arm开发·人工智能·嵌入式硬件·fpga开发·无人机
小柯博客3 小时前
STM32MP2 RIF资源隔离框架详解:从架构到实践
网络·stm32·单片机·嵌入式硬件·架构·嵌入式·yocto
SunAqua3 小时前
《MCU与DSP芯片笔记》一、DSP芯片TI C2000系列TMS320F28035
笔记·单片机·嵌入式硬件
listhi5203 小时前
基于STM32的高精度电子秤设计与实现
stm32·单片机·嵌入式硬件
Hello_Embed5 小时前
嵌入式上位机开发入门(二十九):JsonRPC TCP Server
网络·单片机·网络协议·tcp/ip·json·嵌入式