问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32开发:使用按键控制LED灯闪烁

创作时间:
作者:
@小白创作中心

STM32开发:使用按键控制LED灯闪烁

引用
CSDN
1.
https://blog.csdn.net/m0_66201374/article/details/143372638

本文将介绍如何使用STM32F407ZGT6开发板上的按键来控制LED灯的闪烁。通过本教程,读者将学习到GPIO的使用、按键控制的基本原理以及如何编写相应的代码。

1、原理图分析

  1. 首先找到自己开发板的原理图,找到三个按键对应的GPIO接口,在这里以STM32F407ZGT6开发板为例,三个按键KEY0、KEY1、KEY2分别对应PE4、PE3、PE2接口。
  2. 其次分析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灯闪烁的功能。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号
STM32开发:使用按键控制LED灯闪烁