STM32按键控制LED灯(模块化编程)

程 涛 发布于 2025-01-10 142 次阅读


首先打开工程文件夹新建一个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();
		}
	}
}
此作者没有提供个人介绍。
最后更新于 2025-01-10