当前位置: 首页 > java >正文

【西门子杯工业嵌入式-3-如何使用KEY】

西门子杯工业嵌入式-3-如何使用KEY

  • 一、课程概述
    • 1.1 本讲主题
    • 1.2 学习目标
  • 二、GPIO输入原理与按键特性
    • 2.1 常开按键工作方式
    • 2.2 按键抖动现象
    • 2.3 消抖方式
  • 三、实验功能设计
    • 3.1 控制逻辑描述
    • 3.2 引脚资源分配
  • 四、程序结构与文件组织
    • 4.1 文件模块划分
  • 五、关键代码解析
    • 5.1 宏定义(key.h & led.h)
    • 5.2 按键初始化(key.c)
    • 5.3 按键状态读取(含软件消抖)
    • 5.4 LED控制逻辑(function.c 中主循环)
  • 六、项目配置与调试要点
    • 6.1 工程结构管理
    • 6.2 断电操作提示
  • 七、实验效果演示
    • 7.1 实验现象
  • 八、课程总结与思考
    • 8.1 本讲收获
    • 8.2 思考题

链接: B站视频

一、课程概述

1.1 本讲主题

本讲主要讲解如何将GD32F4的GPIO口作为输入端使用,通过读取按键的状态控制LED灯的开关,实现基本的人机交互控制逻辑。

1.2 学习目标

了解GPIO输入的基本原理。

学会处理按键抖动问题(软件消抖)。

掌握使用GPIO读取按键状态的方法。

实现3个按键控制2个LED的实验功能。

熟悉结构化编程方式(文件模块化、宏定义管理硬件资源)。
在这里插入图片描述

二、GPIO输入原理与按键特性

2.1 常开按键工作方式

按键在未按下时是断开的,按下时闭合。

所以在未按下时,GPIO引脚读取到的是高电平。

按下后,通过拉低引脚,读取到的是低电平。
在这里插入图片描述

2.2 按键抖动现象

按键在闭合或断开的瞬间会出现快速抖动(机械弹性引起)。

抖动持续时间约为5ms~20ms,导致读取状态不稳定。

必须采取消抖处理以确保程序逻辑的准确性。

2.3 消抖方式

硬件消抖:通过电容、RC电路过滤抖动(更稳定但成本增加)。

软件消抖:程序中加入延时避开抖动阶段(本实验使用)。

检测到按下状态 → 延时 → 再次确认状态 → 返回有效状态。

加入等待松手逻辑,防止按住不放被重复触发。

三、实验功能设计

3.1 控制逻辑描述

使用三个独立按键控制两个LED灯的状态:
按键 功能描述 控制对象

按键功能描述控制对象
K1状态翻转(亮↔灭)LED1
K2点亮LEDLED2
K3熄灭LEDLED2
在这里插入图片描述

3.2 引脚资源分配

自定义5个GPIO端口:

2个用于LED输出。

3个用于按键输入。

所有定义通过宏定义在头文件中实现,便于管理与移植。

四、程序结构与文件组织

4.1 文件模块划分

文件名功能描述
key.h / key.c按键 GPIO 初始化与状态读取
led.h / led.cLED 初始化与控制逻辑
function.c主循环控制逻辑

五、关键代码解析

5.1 宏定义(key.h & led.h)

为每个按键和LED定义宏,例如:

#define KEY1_PIN GPIO_PIN_0
#define KEY1_PORT GPIOA
#define LED1_PIN GPIO_PIN_5
#define LED1_PORT GPIOB

5.2 按键初始化(key.c)

void key_init(void) {rcu_periph_clock_enable(RCU_GPIOA); // 启用端口时钟gpio_init(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, KEY1_PIN | KEY2_PIN | KEY3_PIN);
}

在这里插入图片描述

5.3 按键状态读取(含软件消抖)

uint8_t key_state(uint16_t pin, uint32_t port) {if (gpio_input_bit_get(port, pin) == RESET) {delay_1ms(10);  // 软件延时消抖if (gpio_input_bit_get(port, pin) == RESET) {while (gpio_input_bit_get(port, pin) == RESET); // 等待释放return 1;}}return 0;
}

在这里插入图片描述

5.4 LED控制逻辑(function.c 中主循环)

while (1) {if (key_state(KEY1_PIN, KEY1_PORT)) {gpio_bit_toggle(LED1_PORT, LED1_PIN);}if (key_state(KEY2_PIN, KEY2_PORT)) {gpio_bit_set(LED2_PORT, LED2_PIN);}if (key_state(KEY3_PIN, KEY3_PORT)) {gpio_bit_reset(LED2_PORT, LED2_PIN);}
}

在这里插入图片描述

六、项目配置与调试要点

6.1 工程结构管理

在 Hardware 文件夹下建立 key 文件夹。

创建并加入 key.c 和 key.h 文件到工程中。

添加头文件引用路径,确保编译器能找到新建文件。

6.2 断电操作提示

在断电状态下拔插杜邦线,以免损坏MCU引脚。

七、实验效果演示

7.1 实验现象

按下按键1:LED1状态翻转。

按下按键2:LED2点亮。

按下按键3:LED2熄灭。

八、课程总结与思考

8.1 本讲收获

学会将GPIO作为输入使用。

理解并实现软件消抖处理。

掌握结构化文件编写和端口宏定义方法。

实现基础的按键控制LED功能。

8.2 思考题

如果使用GD32开发矩阵键盘,与在51单片机上实现有什么不同?
提示方向:考虑两者的GPIO资源、扫描方法、中断处理能力、处理效率等差异。

http://www.xdnf.cn/news/12553.html

相关文章:

  • Ubuntu20.04基础配置安装——系统安装(一)
  • uniapp 对接腾讯云IM群公告功能
  • Spring Boot + Thymeleaf 防重复提交
  • wpf ListBox 去除item 单击样式
  • Python控制台输出彩色字体指南
  • 如何判断指针是否需要释放?
  • 2024 CKA题库+详尽解析| 15、备份还原Etcd
  • 6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
  • CSS3 的特性
  • 前端开发者常用网站
  • DeepSeek09-open-webui使用
  • 银行卡二三四要素实名接口如何用PHP实现调用?
  • npm安装electron下载太慢,导致报错
  • 华为云Flexus+DeepSeek征文 | 从零到一:用Flexus云服务打造低延迟联网搜索Agent
  • 【杂谈】-DeepSeek-V3:AI开发的成本效益突破与行业启示
  • ARM SMMUv3简介(一)
  • 常用存储器介绍
  • 10.Linux进程信号
  • 第四十六天打卡
  • 简单了解一下Hugging Face(抱抱脸)
  • 信号(瞬时)频率求解与仿真实践(1)
  • Unity版本使用情况统计(更新至2025年5月)
  • 计算机网络基础(一)
  • C语言速成15之告别变量碎片化:C 语言结构体如何让数据管理从混乱走向有序
  • LTE重建到新小区流程介绍
  • 宁乡地-气-碳-水相互作用综合观测数据集
  • 008-C++String
  • 深入浅出:计算机网络体系结构——信息世界的“交通规则”
  • 0.5S 级精度背后:DJSF1352-RN-6 如何让储能电站的每 1kWh 都「有迹可循」?
  • RK3588 火焰烟雾检测