🔬 实验05:GPIO 口——按键输入
📌 实验目标
- 掌握 GPIO 输入模式的配置方法
- 理解按键抖动原理及消抖方法
- 实现按键控制 LED 开关
- 掌握上拉/下拉输入的区别
一、实验内容
- 将独立按键连接到 STM32 GPIO 引脚
- 配置 GPIO 为上拉输入模式
- 编写按键扫描程序(含消抖处理)
- 实现按键控制 LED 的亮灭切换
二、按键消抖原理
机械按键在按下和释放时会产生抖动(通常 5-10ms)。消抖有两种方法:
- 硬件消抖:RC 滤波电路(电阻+电容)
- 软件消抖:检测到电平变化后延时 10-20ms,再次确认电平状态
三、示例程序
按键控制 LED(库函数)
#include "stm32f10x.h"
void Delay_ms(uint32_t ms)
{
uint32_t i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 7200; j++); // 约 1ms
}
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 使能 GPIO 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOE, ENABLE);
// PB0 LED 推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// PE4 按键 上拉输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入
GPIO_Init(GPIOE, &GPIO_InitStructure);
while (1)
{
if (GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4) == 0) // 按键按下
{
Delay_ms(20); // 消抖
if (GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4) == 0)
{
GPIO_ToggleBits(GPIOB, GPIO_Pin_0); // LED 翻转
while (GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4) == 0); // 等待松手
}
}
}
}
💡 这段代码怎么用?
- 按键接法:KEY 一端接
PE4、另一端接地(低有效),所以配上拉输入、按下读到 0 - 消抖流程:读到低 → 延时 20ms → 再确认低 → 才算按下,再等松手防连击
- 进阶写法可封装成
KEY_Scan(mode),用static变量记录状态——那就是实验 05 指导书里的「不支持连续按」版本
四、参考资料
| 资料 | 文件 |
|---|---|
| 按键实验 PPT | 实验2 GPIO口——KEY.pptx |
| 实验指导文档 | 实验2GPIO-按键输入.docx |
| LED 模板工程 | LED Template.zip |