一、按键控制
1. LED.C 模块代码
① LED 初始化函数:
(1) 时钟使能:
void LED_Init(void){
// 1. 开启GPIOA的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- STM32 的所有外设都需要时钟驱动
- RCC:时钟控制器
(2) 配置结构体:
// 2. 创建GPIO配置结构体
GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitTypeDef:STM32 库定义的结构体类型
- 创建实例 GPIO_InitStructure 来设置参数
(3) 输出模式:
// 3. 设置GPIO参数
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出模式
- GPIO_Mode_Out_PP:推挽输出模式
- 特点:输出 0 时,引脚连接到 GND(低电平);输出 1 时,引脚连接到 VCC(高电平)
② LED1 控制函数
// 点亮LED1(PA1)
void LED1_ON(void){
GPIO_ResetBits(GPIOA, GPIO_Pin_1); // 设置PA1为低电平
}
- GPIO_ResetBits():将指定引脚设为低电平(0V)
- LED 正向导通,发光
③ GPIO 读取函数
- 用来读取输入数据寄存器某一个端口的输入值
- 用来读取整个输入数据寄存器
- 用来读取输出寄存器某一个端口的输出值
- 用来读取整个输出数据寄存器
2. Key.c 模块代码
① 按键检测流程详解:
(1) 初始化:
- 配置 PB1 和 PB2 为上拉输入模式
- 无按键时,引脚为高电平(1)
- 按键按下时:引脚被拉低到GND(0)
(2) 检测按键按下:
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
检测到低电平(0) 表示按键被按下
(3) 延时消抖:
Delay_ms(20);
- 机械按键在按下瞬间会产生抖动(电平快速变化)
- 延时 20ms 跳过抖动期,避免误检测
3. main.c 模块
① 全局变量声明
uint8_t KeyNum; // 声明无符号8位整型全局变量,用于存储从按键驱动层获取的扫描结果。
用途:作为键值状态传递媒介,将 Key_GetNum( ) 函数的返回值暂存以供主循环逻辑判断。
② 翻转 LED1 的开关状态
LED1_Turn(); // (16) 翻转LED1的开关状态
(1) 调用函数 LED1_Turn( )(在 LED.h 中声明,在 LED.c 中实现)。这个函数的功能是改变 LED1 的当前状态:
- 如果 LED1 当前是亮的,就把它灭掉
- 如果 LED2 当前是灭的,就把它亮起来
二、光敏传感器控制蜂鸣器
1. Buzzer.c 模块
2. LightSensor.c 模块