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,这就完成了。

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

相关推荐
济6178 分钟前
【ROS2 Humble 开发专栏】Ubuntu22.04 基于 OpenCV 实现颜色阈值分割与目标坐标定位|附完整工程源码
嵌入式硬件·嵌入式·ros2·机器人开发·机器人方向
txh05079 分钟前
串口数据调试-直观表示
嵌入式硬件·学习
半条-咸鱼14 分钟前
【STM32】底层 CPU 流程、NVIC 优先级、GPIO 编程与事件(EVT)区别
stm32·单片机·嵌入式硬件
csg110720 分钟前
工厂智能化改造(五):橡塑卷材边缘对齐与纠偏——一个典型非标案例
单片机·嵌入式硬件·物联网·自动化
振南的单片机世界44 分钟前
地址总线定“找谁”,数据总线定“搬多少”
arm开发·stm32·单片机
yong99901 小时前
手机蓝牙发送指令STM32串口接收控制 LED 亮灭
stm32·单片机·智能手机
来点抹茶吗1 小时前
U-Boot、内核移植与根文件系统构建(BeagleBone Green Gateway&AM335X)
linux·嵌入式硬件·ubuntu·debian
嵌入式小站10 小时前
STM32 零基础可移植教程 17:USART + DMA + IDLE,串口不定长接收怎么做
stm32·单片机·嵌入式硬件
史蒂芬_丁10 小时前
Cortex-M内核中断保护机制详解:PRIMASK寄存器的正确使用方法
单片机·嵌入式硬件
榴莲llll10 小时前
LED高亮数码管显示驱动芯片数显屏驱动器最大支持13×3的按键VK16K33A
单片机