按键控制LED灯

发布时间:2024年01月24日

目录

文件夹Hardware:

文件LED.c:

文件LED.h:

文件Key.c:

文件Key.h:

文件夹User:

文件main.c:


首先模块化管理代码

文件夹Hardware:

文件LED.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); ?
? ? } ?
}



文件LED.h:

#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
?



文件Key.c:

#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。 ?
}



文件Key.h:

#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
?



文件夹User:

文件main.c:

#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。 ?
? ? ? ? } ?
? ? } ?
}

文章来源:https://blog.csdn.net/lingengchao/article/details/135780224
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。