目录
重看LED正负极区分:若没剪,长正短负;内小为正,内大为负
文件Hardware:用来存放硬件驱动
创建文件LED.c & LED.h 两个文件:用来封装LED的驱动程序
文件LED.c:用来存放驱动程序的主体代码
文件LED.h:用来存放这个驱动程序可以对外提供的函数或变量的声明
该俩文件创好后还得添加必要的一些代码:
1) ".c"文件的第一行 include一个stm32f10x的头文件
2)“.h”文件里添加一个防止头文件重复包含的代码
(格式固定:#ifndef_LED_H
#define_LED_H
…定义的方法…
#endif)
(翻译:#if no define 如果没有定义LED这个字符串,那么#define 定义这个字符串,最后加上#endif)
#endif 是和 #ifndef 组成的括号,函数与变量声明就放在括号内
注意,文件要以空行结尾
在“.c”文件里写一个LED初始化函数 ,如下
void LED_Init(void)
{…}
该函数是用来初始化LED,里面写的是打开时钟,配置端口模式等
详细如下:
初始化完后,对模块外部声明,这个函数是可以被外部调用的函数
到此,我们只需要调用一个LED_Init函数,LED的两个GPIO口就可以直接初始化完成了
因为这个函数式需要被外部引用的,所以需要复制一下函数的第一行,将函数第一行放在 .h 文件里,加上分号;
//即:void LED_Init(void);
然后在main.c 文件里 补充包含.h文件的头文件 (#include "LED.h")
然后在主函数里直接调用LED_Init,这样就完成了LED的初始化(LED_Init();)
如果产生无效预处理(关于 #include “LED.h”的),就要留意 “ifndef”、“define”跟文件名之间有空格
默认低电平,所以没操作LED,LED就亮灯了
所以在LED_Init函数的最后加上(GPIO_SetBits(GPIOA,GPIO_Pin_1 |GPIO_Pin_2);)
这样初始化后,如果不操作LED,LED就是熄灭了的(其实就是置为高电平)
(即初始化最后一步)
法一:两组 LEDx_ON 跟 LEDx_OFF
最后都要放在LED.h文件中声明
两灯交替开关
法二:一个LED_Set函数,定义两个参数,一个参数选择操作哪个灯,另一个参数选择开还是关
因为先前已初始化,所以只用将写出一按键控制一灯的函数
函数GPIO_ReadInputDataBit:用来读取输入数据寄存器中某一个端口的输入值
参数为 GPIOx 和 GPIO_Pin ,用来指定某一个端口,返回值是uint8_t,代表这个端口的高低电平
为读取按键需要用到的函数
函数GPIO_ReadInputData:用来读取整个输入数据寄存器,参数只有一个GPIOx,用来指定外设,返回值是uint16_t,是一个16位的数据,每一位代表一个端口值
函数GPIO_ReadOutputDataBit:用来读取输出数据寄存器的某一个位
(所以原则上来说,它并不是用来读取端口的输入数据的),这个函数一般用于输出模式下,用来看一下自己输出的是什么
函数GPIO_ReadOutputData:用来读取整个输出寄存器
如果想读取GPIO口的话,需要用ReadInput的这两个函数
如果在输出模式下,要看输出什么的时候,才需要用到ReadOutput这两个函数
【两按键控制一灯】控制 1.0 |
【一按键控制一灯】控制 2.0 |
蜂鸣器:VCC、GND接电源,控制脚接PB12号口
光敏传感器:VCC、GND接电源,DO数字输出端 接PB13口
上电,光敏传感器的灯会亮
当遮住光线时,输出指示灯灭,代表输出高电平;
松手时,输出指示灯亮,代表输出低电平
电位器:可以调节高低电平的判断阈值
开完后就关
GPIO_Mode:可以选择8种输入输出模式
GPIO_Pin:选择引脚,可以用按位或的方式(“ | ”)同时选中多个引脚
GPIO_Speed:选择输出速度(不是很重要,要求不高下,直接选50MHz)
将指定的GPIO外设初始化好
tips:模块化编程-尽量把每个硬件的驱动函数单独提取出来,封装在".c" 和 "h" 里,有利于简化主函数模式