首先打开工程文件夹新建一个Hardware文件夹

然后点击红绿白三个方块,接着选择工程管理建一个Hardware组

点击魔术棒,选择C/C++点击 包含路径 把新建的Hardware文件夹添加到头文件里面

右击Hardware 选择新建LED.c和LED.h文件跟key.c和key.h,文件路径指向Hardware文件夹

LED.c和LED.h用来封装LED驱动,LED.c是用来存放驱动程序主体代码而LED.h是存放LED.c驱动程序的可以对外提供的函数或变量声明。
首先在LED.c和key.c里面新建一个include "stm32f10x.h" // Device header
头文件,然后在LED.h和key.h里建一个防止头文件重复包含的代码
#ifndef __LED_H
#define __LED_H
#endif
接着继续封装LED.c驱动
#include "stm32f10x.h" // Device header
void LED_Init (void) //初始化LED函数
{
//RCC_APB2PeriphClockCmd初始化时钟,RCC_APB2Periph_GPIOA打开GPIOA外设,ENABLE表示要启用相应的时钟
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA, ENABLE);
//GPIO_InitTypeDef数据类型用于存储GPIO的初始化信息,GPIO_Initstucture为变量名
GPIO_InitTypeDef GPIO_Initstucture;
//.GPIO_Mode 是用来设置GPIO引脚的工作模式,GPIO_Mode_Out_PP表示将GPIO引脚设置为推挽输出模式
GPIO_Initstucture.GPIO_Mode = GPIO_Mode_Out_PP;
//.GPIO_Pin用于指定要配置的具体GPIO引脚,GPIO_Pin_1 | GPIO_Pin_2代表GPIO端口中的第1号引脚和第2号引脚
GPIO_Initstucture.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
//.GPIO_Speed用于指定 GPIO 引脚的输出速度,GPIO_Speed_50MHz频率为50赫兹
GPIO_Initstucture.GPIO_Speed = GPIO_Speed_50MHz;
//GPIO_Init初始化GPIO端口的函数,GPIOA表示要初始化的GPIOA端口,&GPIO_Initstucture将其地址传递给GPIO_Init函数,以便函数能够读取这些配置信息并将其应用到GPIOA端口上
GPIO_Init (GPIOA, &GPIO_Initstucture);
//关闭GPIOA-1和GPIOA-2串口
GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);
}
void LED1_ON(void) //初始化LED1_ON函数用于打开
{
GPIO_ResetBits (GPIOA, GPIO_Pin_1);
}
void LED1_OFF(void) //初始化LED1_OFF函数用于关闭
{
GPIO_SetBits (GPIOA, GPIO_Pin_1);
}
void LED1_Turn (void) //初始化LED1_Turn用于取反
{
//GPIO_ReadOutputDataBit读取当前端口输出状态,读取GPIOA-1如果为0就置1,反之为0
if(GPIO_ReadOutputDataBit (GPIOA, GPIO_Pin_1) == 0) GPIO_SetBits (GPIOA, GPIO_Pin_1); else GPIO_ResetBits (GPIOA, GPIO_Pin_1);
}
void LED2_ON(void)
{
GPIO_ResetBits (GPIOA, GPIO_Pin_2);
}
void LED2_OFF(void)
{
GPIO_SetBits (GPIOA, GPIO_Pin_2);
}
void LED2_Turn (void)
{
if(GPIO_ReadOutputDataBit (GPIOA, GPIO_Pin_2) == 0) GPIO_SetBits (GPIOA, GPIO_Pin_2); else GPIO_ResetBits (GPIOA, GPIO_Pin_2);
}
接着把这些初始化函数放到LED.h里声明
#ifndef __LED_H
#define __LED_H
void LED_Init (void);
void LED1_ON(void);
void LED1_OFF(void);
void LED1_Turn (void);
void LED2_ON(void);
void LED2_OFF(void);
void LED2_Turn (void);
#endif
然后是key.c文件
#include "stm32f10x.h" // Device header
#include "Delay.h"
void key_Init (void)
{
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_Initstructure;
GPIO_Initstructure.GPIO_Mode = GPIO_Mode_IPU; //代表上拉输入模式
GPIO_Initstructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init (GPIOB, &GPIO_Initstructure);
}
uint8_t key_GetNum(void) //可以返回按下按键的代码
{
uint8_t keyNum = 0; //按键默认给0,没有按下返回0
if (GPIO_ReadInputDataBit (GPIOB, GPIO_Pin_1) == 0) //判断读取GPIOB-1的值是否为0,0为低电平,1为高电平,按下为0
{
Delay_ms(20); //消除抖动
// for 循环持续检查 GPIOB 的 1 号引脚是否仍为低电平。只要该引脚保持低电平,循环将持续执行,并将 keyNum 赋值为 1
// 同时,每次循环会进行 20 毫秒的延迟,目的是确保按键已经稳定按下
for ( ;GPIO_ReadInputDataBit (GPIOB, GPIO_Pin_1) == 0;keyNum = 1)
{
Delay_ms(20);
}
}
if (GPIO_ReadInputDataBit (GPIOB, GPIO_Pin_11) == 0)
{
Delay_ms(20);
for ( ;GPIO_ReadInputDataBit (GPIOB, GPIO_Pin_11) == 0;keyNum = 2)
{
Delay_ms(20);
}
}
return keyNum; //返回值
}
声明key.h
#ifndef __KEY_H
#define __KEY_H
void key_Init (void);
uint8_t key_GetNum(void);
#endif
main.c主代码
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "LED.h"
#include "key.h"
uint8_t keyNum; //全局变量,在函数外面的是全局变量,在函数里面的是局部变量
int main (void)
{
LED_Init ();
key_Init ();
for( ; ; )
{
keyNum = key_GetNum(); //读取key_GetNum的值赋给keyNum
if (keyNum == 1) //判断keyNum是否为1,是执行LED1_Turn();
{
LED1_Turn();
}
if (keyNum == 2)
{
LED2_Turn();
}
}
}
Comments NOTHING