STM32开发:使用按键控制LED灯闪烁
创作时间:
作者:
@小白创作中心
STM32开发:使用按键控制LED灯闪烁
引用
CSDN
1.
https://blog.csdn.net/m0_66201374/article/details/143372638
本文将介绍如何使用STM32F407ZGT6开发板上的按键来控制LED灯的闪烁。通过本教程,读者将学习到GPIO的使用、按键控制的基本原理以及如何编写相应的代码。
1、原理图分析
- 首先找到自己开发板的原理图,找到三个按键对应的GPIO接口,在这里以STM32F407ZGT6开发板为例,三个按键KEY0、KEY1、KEY2分别对应PE4、PE3、PE2接口。
- 其次分析KEY电路图,我们可以发现,在未进行任何操作时,KEY0、KEY1、KEY2都是接地,低电平,若我们想在摁键后产生电势差,需要设置为上拉模式,在这里高电平我们设置为1,低电平设置为0。
关于模式参数如何设定上一篇文章中有解释STM32开发第一篇:GPIO---LED闪烁-CSDN博客
2、代码思路
我们首先需要明确思路,采用分文件的形式进行编写,共五个文件 main.c、LED.c、LED.h、KEY.c、KEY.h
1、main.c
在主函数里,我们需要明确,为了观察更加清晰,我们一开始设置LED灭,通过摁下按键后,再将LED灯亮灭进行反转,通过if判断语句分为三种情况,当摁下KEY0时,DS0(红灯)亮,当摁下KEY1时,DS1(绿灯)亮,当摁下KEY2时,两个灯同时亮。
#include "stm32f4xx.h"
#include "led.h"
#include "key.h"
#define Key_0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) //宏定义,为了减少代码量
#define Key_1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)
#define Key_2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)
void Delay(uint32_t nCount) //定义延时函数,防抖动,消除机械摁键摁下和抬起的过程对结果的影响
{
for(;nCount!=0;nCount--);
}
int main(void)
{
LED_Init();
KEY_Init();
GPIO_SetBits(GPIOF,GPIO_Pin_9); //红灯灭
GPIO_SetBits(GPIOF,GPIO_Pin_10); //绿灯灭
while (1)
{
if(Key_0==0)
{
Delay(0xCC6);
GPIO_ToggleBits(GPIOF,GPIO_Pin_9); //反转函数,反转LED灯的状态,红灯亮
}
Delay(0xCC6); //延时防抖动
if(Key_1==0)
{
Delay(0xCC6);
GPIO_ToggleBits(GPIOF,GPIO_Pin_10); //反转函数,反转LED灯的状态,绿灯亮
}
Delay(0xCC6);
if(Key_2==0)
{
Delay(0xCC6);
GPIO_ToggleBits(GPIOF,GPIO_Pin_9);
GPIO_ToggleBits(GPIOF,GPIO_Pin_10); //反转函数,反转LED灯的状态,红灯亮、绿灯亮
}
Delay(0xCC6);
if(Key_0==1&&Key_1==1&&Key_2==1) //当三个按键都未被摁下
{
GPIO_SetBits(GPIOF,GPIO_Pin_9); //红灯灭
GPIO_SetBits(GPIOF,GPIO_Pin_10); //绿灯灭
}
}
}
2、LED.c
此模块中,初始化LED灯状态和各项参数。关于模式参数如何设定上一篇文章中有解释STM32开发第一篇:GPIO---LED闪烁-CSDN博客
#include "stm32f4xx.h"
#include "led.h"
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE); //打开时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10; //初始化LED灯的GPIO引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽模式
GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉模式
GPIO_Init(GPIOF, &GPIO_InitStructure);
}
3、KEY.c
此模块中对按键进行初始化,方式和对LED初始化一样,配置对应的参数即可。
#include "stm32f4xx.h"
#include "key.h"
void KEY_Init(void)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); //打开控制GPIOE的时钟
GPIO_InitTypeDef key_init; //配置结构体
key_init.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_3|GPIO_Pin_2; //GPIOE 4\3\2引脚
key_init.GPIO_Mode = GPIO_Mode_IN;
key_init.GPIO_PuPd = GPIO_PuPd_UP; //上拉模式
key_init.GPIO_Speed = GPIO_High_Speed;
key_init.GPIO_OType = GPIO_OType_PP; //推挽模式
GPIO_Init(GPIOE, &key_init); //对成员进行初始化
}
4、LED.h
#ifndef __LED_H
#define __LED_H
void LED_Init( void);
#endif
5、KEY.h
#ifndef __KEY_H
#define __KEY_H
void KEY_Init(void);
#endif
3、运行效果视频
由于原文中没有提供具体的视频链接,因此这里无法展示运行效果视频。但根据代码逻辑,当按下不同的按键时,对应的LED灯会亮起,实现按键控制LED灯闪烁的功能。
热门推荐
素食孕婦怎麼吃才營養?均衡飲食,懷孕吃素也能讓寶寶健康成長
《离思五首·其四》创作背景是什么?该如何赏析呢?
白居易诗《望月有感》解析
东北酱骨头,酱香浓郁
好好吃饭真能延缓衰老,建议照着清单多吃点
冬季时尚单品:派克服如何平衡质量与成本?
派克服:从极地到时尚界的逆袭之路
雷茂瑞:村支书如何引领乡村振兴?
从质疑到信赖:安化女村支书刘秋君的逆袭之路
动物版谷歌翻译来了?Nature:用AI解码野性的呼唤!
耶稣的兄弟:圣雅各是谁?
螺旋藻辅助性降血糖,促进胰岛素生成
不要密码,钱被隔空刷走!央视曝光后,银联最新回应,请注意卡上这两个字
商丘古城墙的建造技艺揭秘:东周宋国故城的神秘面纱
商宋文化探秘:商丘古城墙的前世今生
商丘古城墙打卡,解锁冬日旅行新姿势
上海嘉定法院发布《司法护航高质量发展案例手册》,精选64个典型案例回应群众关切
冬季减肥新宠:南瓜籽的营养与食用指南
绿瘦冬季燃脂秘籍:高效健身计划
王者荣耀S38赛季操作设置指南:新增简化操作!修改后操作上限大大提高
王者荣耀操作设置指南:新增简化操作!优化后操作上限大大提高
这些动物冬眠时为什么不口渴?
鲜天麻变色还能吃吗?教你正确判断和保存方法
如何合理计算退休工资?这种计算方法有哪些影响因素?
独生子女父母退休补贴申请指南
《红楼梦》经典诗词:《葬花吟》黛玉伤春葬花,泣血歌吟,婉约凄美堪称千古绝唱!
海南旅游三月份热不热了呢?现在去合适吗?
Qt 6.8.0静态编译最佳实践分享
Qt5.12静态编译:提升软件性能新趋势
Qt静态编译:利弊权衡与应用场景分析