按键控制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,这就完成了。




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