目录
文件夹Hardware:
文件LED.c:
文件LED.h:
文件Key.c:
文件Key.h:
文件夹User:
文件main.c:
首先模块化管理代码
// 引入STM32F10x系列微控制器的头文件,包含了一些基本的寄存器和函数声明。
#include "stm32f10x.h"
// LED初始化函数
void LED_Init(void)
{
// 使能GPIOA端口的时钟,这样才能对GPIOA进行操作。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 定义一个GPIO初始化结构体,用于配置GPIO的参数。
GPIO_InitTypeDef GPIO_InitStructure;
// 设置GPIO模式为推挽输出,且设置LED灯连接到GPIOA的1和2脚。
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
// 设置GPIO的输出速率为50MHz。
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// 使用上述参数初始化GPIOA的1和2脚。
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 将GPIOA的1和2脚设置为高电平,即初始状态为LED灯灭。
GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);
}
// LED1打开函数
void LED1_ON(void)
{
// 将GPIOA的1脚设置为低电平,即点亮LED灯。
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}
// LED1关闭函数
void LED1_OFF(void)
{
// 将GPIOA的1脚设置为高电平,即熄灭LED灯。
GPIO_SetBits(GPIOA, GPIO_Pin_1);
}
// LED1转换函数
void LED1_Turn(void)
{
// 如果GPIOA的1脚为低电平(0),则设置为高电平(熄灭LED灯)。否则设置为低电平(点亮LED灯)。
if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0) {
GPIO_SetBits(GPIOA, GPIO_Pin_1);
} else {
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}
}
// LED2打开函数,与LED1类似,只是操作的是GPIOA的2脚。
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);
}
}
#ifndef __LED_H
#define __LED_H
//这里都是LED.c里函数的声明
void LED_Init(void);
void LED1_ON(void);
void LED1_OFF(void);
void LED2_ON(void);
void LED2_OFF(void);
#endif
#include "stm32f10x.h" // 引入STM32F10x系列微控制器的头文件,包含了一些基本的寄存器和函数声明。
#include "Delay.h" // 引入延时函数库的头文件。
// 按键初始化函数
void Key_Init()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能GPIOB端口的时钟,这样才能对GPIOB进行操作。
GPIO_InitTypeDef GPIO_InitStructure; // 定义一个GPIO初始化结构体,用于配置GPIO的参数。
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 设置GPIO模式为上拉输入。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11; // 设置要初始化的针脚为GPIOB的1和11脚,这两个脚分别连接Key1和Key2。
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置GPIO的输出速率为50MHz。
GPIO_Init(GPIOB, &GPIO_InitStructure); // 使用上述参数初始化GPIOB的1和11脚。
}
// 获取按键编号函数
uint8_t Key_GetNum(void)
{
uint8_t KeyNum = 0; // 初始化按键编号为0,表示没有按键按下。
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0) { // 如果Key1被按下(即读取的Key1针脚电平为低)
Delay_ms(20); // 消除按键抖动,等待按键稳定(延迟20毫秒)。
while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0); // 等待Key1针脚电平由低变高 (按键释放)。
Delay_ms(20); // 再次消除按键抖动(延迟20毫秒)。
KeyNum = 1; // 设置按键编号为1,表示Key1被按下。
}
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0) { // 如果Key2被按下(即读取的Key2 针脚电平为低)
Delay_ms(20); // 消除按键抖动,等待按键稳定(延迟20毫秒)。
while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0); // 等待Key2针脚电平由低变高(按键释放)。
Delay_ms(20); // 再次消除按键抖动(延迟20毫秒)。
KeyNum = 2; // 设置按键编号为2,表示Key2被按下。
}
return KeyNum; // 返回按下的按键编号。如果两个按键都没有被按下,返回0。
}
#ifndef __KEY_H
#define __KEY_H
//这里都是对Key.c中的函数进行声明
void Key_Init();
uint8_t Key_GetNum(void);
void LED1_Turn(void);
void LED2_Turn(void);
#endif
#include "stm32f10x.h" // 引入STM32F10x系列微控制器的头文件,包含了一些基本的寄存器和函数声明。
#include "Delay.h" // 引入延时函数库的头文件。
#include "LED.h" // 引入LED控制函数库的头文件。
#include "Key.h" // 引入按键检测函数库的头文件。
uint8_t KeyNum; // 定义一个全局变量,用于存储按下的按键编号。
int main(void) // 主函数入口。
{
LED_Init(); // 初始化LED,可能包括设置GPIO模式、速度等。
Key_Init(); // 初始化按键检测,可能包括使能GPIO时钟、配置GPIO模式等。
while(1) // 无限循环,持续检测按键和LED状态。
{
KeyNum=Key_GetNum(); // 获取按下的按键编号,并存储在KeyNum变量中。
if(KeyNum==1) // 如果KeyNum等于1(即Key1被按下)
{
LED1_Turn(); // 转换LED1。
}
if(KeyNum==2) // 如果KeyNum等于2(即Key2被按下)
{
LED2_Turn(); // 打开LED2。
}
}
}