按键控制LED
LED模块
左上角PA0用上拉输入模式,如果此时引脚悬空,PA0就是高电平,这种方式下,按下按键,引脚为低电平,松下按键,引脚为高电平
右上角PA0,把上拉电阻想象成弹簧
当按键松手时,引脚由于上拉作用,自然保持为高电平,当按键按下时,引脚直接接到GND,有一股无穷大的力把这个引脚往下拉,弹簧对抗不了无穷大的力,所以已经为低电平,这种情况引脚不会出现悬空状态,所以此时PA0引脚可以配置为浮空输入或者上拉输入
如果是上拉输入,那就会有两个上拉电阻,然后它们共同作用,这时高电平就会更强一些,对应高电平就更加稳定,不过也会有点瑕疵,当引脚被强行拉低时,损耗也就会更大一些
左边的PA0要设置乘下拉输入模式,当按键按下时,引脚为高电平,松开时,引脚回到默认低电平
不过最好还是设置成上拉输入模式,了解一下就行
右边的PA0需要配置下拉输入模式或浮空输入模式
总结
这两个电路接法按键按下时引脚是低电平,松手是高电平
这两个接法是按下时是高电平,松手是低电平
传感器模块
D0数字输出随便接一个端口,比如PA0
A0模拟输出,目前不考虑
编程部分
复制之前的文件夹,改成现在的按键控制LED名字
打开工程,然后开始修改,这里用模块化编程的思想来编写按键的程序和LED的程序
在工程文件夹新建Hardware,用来存放硬件驱动,也就是把按键程序和LED程序都放在这里面
然后点击这里
新建一个叫Hardware
创建成功就会出现右边这个
然后点击魔术棒
选择C/C++,点击这个
把刚才新建的Hardwar文件夹添加到头文件的路径列表中,这样就添加了一个Hardware文件夹
然后右键,添加新的文件
选择第一个,名字LED,,路径存在Hardwar文件夹里面,然后点击ADD
然后继续创建
这样就建好了LED.C和LED.h两个文件用来封装LED的驱动程序
LED.c用来存放驱动程序的主体代码
LED.H用来存放这个驱动程序可以对外提供的函数或变量的声明
然后点开.c文件,右键,选择这个
.h文件,要添加一个放在头文件重复包含的代码,这里格式都是固定的,我们的函数和变量声明就放在这个括号里面
这里完成之后要注意在endif那块换行,不然会有警告
然后就开始写LED.c文件开始写LED初始化函数,这个函数用来初始化LED,只要是用外设来控制一定要打开时钟,配置端口模式这写东西
这个就是上个LED灯的设置模式,直接按原来的设置就行,需要改变的就是引脚,因为是两个灯,所以控制Pin_1和Pin_2
这样LED初始化代码就写完了
这时只需要调用这个函数,LED的两个GPIO口就初始化完成了
因为这个函数需要被外部引用,所以复制这个函数,放到LED.h文件里面,这样就是对模块外部声明,这个函数是可以被外部调用的函数
然后删除之前的代码,在上面写这个来声明
然后在主函数里面直接,调用LED_Init,这样就完成了LED的初始化,然后编译,下载
这里就会看到灯都会亮,说明端口配置和模块化编程没有问题,亮是因为GPIO配置好了默认激素低电平
可以回到这里加上这个,这样,如果不操作LED,灯就是灭的
然后开始正式编写功能代码
我们需要电路和熄灭LED函数
还是在这个里面编写,这个函数就是用来点亮LED1的函数
这个函数使用来熄灭LED1的函数
然后复制粘贴编写LED2,点亮和熄灭函数,把名字和引脚改一下
这就是打开和关闭LED2D函数了
然后把这四个函数放在LED.h文件声明一下,这样LED的驱动函数模块就封装好了
然后在主函数调用
LED1就闪烁了
写上LED2的
两个灯会交替闪烁
然后开始写按键部分的代码
还是跟之前一样在Hardware里面创建Key.C和Key.h文件
还是一样的操作
在Key.C文件创建按键初始化函数,在这里面,我们把按键的两个端口都初始化为上拉输入模式
时钟启动写GPIOB
第七行因为我们要读取按键,所以问你选择GPIO_Mode_IPU上拉输入
第八行因为我们按键接在了PB1和PB11口上,所以写这两个,选中1号和11号口
然后来写读取按键值的函数,调用这个函数就可以返回按下按键的键码,它的返回值就是uint8_t等价于unsigned char
初始化按键返回值,然后返回KeyNum,按键键码默认给0,如果没有按键按下,就返回0,
然后写读取函数
读取函数介绍
这四个GPIO的读取函数
GPIO_ReadInputDataBit 它的作用是用来读取输入数据寄存器某一个端口的输入值的,它的参数是GPIOx和GPIO_Pin,用来指定某一个端口,
它的返回值是uint8_t,代表这个端口的高低电平,读取按键就需要用到这个函数
GPIO_ReadInputData它的作用,它是用来读取整个输入数据寄存器的,参数只有一个GPIOx,用来指定外设,返回值是uint16_t是一个16位的数据,每一位代表一个端口值
GPIO_ReadInputDataBit它的作用是用来读取输出寄存器的某一个位,它并不是用来读取端口的输入数据的,这个函数一般用于输出模式下,用来看一下自己输出的是什么
GPIO_ReadOutputData它的作用是用来读取整个输出寄存器的
看图来理解
所以说,如果想要输入GPIO口的话,就需要GPIO_ReadInputData,GPIO_ReadOutputDataBit这两个参数
如果在输出模式下,想看要看现在看输出什么就用GPIO_ReadOutputDataBit,GPIO_ReadOutputData
这就是这四个函数的用途
回到Key.c
因为需要读取外部输入的一个端口值,所以需要GPIO_ReadInputDataBit这个函数
上面代码意思是如果==0就代表按键按下,然后又因为按键按下有抖动所以要消抖,然后让KeyNum=1返回到函数,代表按键1按下
复制粘贴按键1的,然后按键二改一下名字
然后再Key.h里面声明
然后初始化按键,并且创建全局变量KeyNum
然后
上面代码意思就是如果按键1按下,LED1灯亮,如果按键2按下LED2熄灭
这就是这个操作了
我们需要的程序是按一下熄灭,再按一下点亮,也就是按键按下,LED的状态取反,所以继续编写
这就需要用到GPIO_ReadOutputBit的函数了
上面的函数逻辑就是,调用这个GPIO_ReadOutputBit函数,读取当前的端口的输出状态,如果当前输出0,就给它置1,否则就置0,这样就实现了端口的电平翻转
然后给LED2也加上翻转的功能
然后声明一下
然后修改一下,就完成了
蜂鸣器模块
还是复制文件夹,改名字
还是一样的步骤,再Harewar文件夹,添加蜂鸣器.c和.h文件
然后还是一样的步骤
逻辑跟LED.c是一样的还是开启时钟配置端口,名字改一下,改成Buzzer开头的,把引脚改成Pin_12
这样蜂鸣器的驱动程序就完成了
然后去.h文件声明一下
添加这个头文件
初始化蜂鸣器
测试一下蜂鸣器,响就没问题,
然后来弄光敏传感器的模块,还是一样的步骤再Hardware里面添加传感器.c和.h文件
还是一样的步骤
创建初始化传感器函数
选择的是GPIOB
GPIO模式,可以选择上拉输入模式,如果这个模块始终都接在端口上,也可以选择浮空输入,只要保证引脚不会选课即可,这里选择上拉输入模式,引脚因为光敏传感器连接的是PB13号端口,所以改成Pin_13
这样初始化就完成了
然后就写读取端口的函数,因为要求比较简单,所以直接写一个返回端口值的就行了
这就完成了
然后声明一下
添加这个
13行意思是如果光敏电阻感觉暗,就响,否则就不响
结束