STM32工程--IO口--按键控制点灯程序

STM32F4工程--IO口--按键控制点灯程序(库函数)

  ----芯片:STM32F429IGT6


本文章介绍使用STM32F4单片机,利用按键控制LED灯的亮灭,通过按键和LED的控制,达到学习单片机IO口配置的目的。本文章的工程链接如下,可自行保存。

链接:https://pan.baidu.com/s/1lfhJiBIoiZuD_DldKdFwRw 
提取码:p5i1 


1、STM32F4单片机IO的基本知识

STM32F4单片机, IO 可以由软件配置成如下 8 种模式中的任何一种:

(1)GPIO_Mode_AIN 模拟输入 ------用于检测模拟信号

(2)GPIO_Mode_IN_FLOATING 浮空输入------可以做KEY的按键输入

(3)GPIO_Mode_IPD 下拉输入------内部连接有下拉电阻

(4)GPIO_Mode_IPU 上拉输入------内部连接有上拉电阻

(5)GPIO_Mode_Out_OD 开漏输出

(6)GPIO_Mode_Out_PP 推挽输出

(7)GPIO_Mode_AF_OD 复用开漏输出

(8)GPIO_Mode_AF_PP 复用推挽输出

(在这就说着一个知识吧,说的有点少,大佬见笑了)


2、添加LED_KEY工程

建立一个LED_KEY.c和LED_KEY.h两个文件,放到工程的HARDWARE文件夹下,建立的办法是新建一个记事本,把名字改为LED_KEY.c和LED_KEY.h就可以了,记住把原来的.txt后缀名给他删掉。

然后在工程的HARDWARE文件下添加LED_KEY.c,然后再包含LED_KEY的路径。添加办法我想你已经知道了,(不知道的话见上一篇文章,或者上浏览器,哈哈哈)添加后的工程界面如下:(这个是我重新建了个工程,上次的工程名字不好听)

此时我们的LED_KEY.c的文件是空白的,我们先打上一行代码:#include "LED_KEY.h"

此时我们可以通过右键--->Open document LED_KEY.h来打开LED_KEY.h文件。我们先打开这个文件输入

#ifndef _LED_KEY_H
#define _LED_KEY_H


#endif

输入这个的意思是:如果LED_KEY.h第一次被引用,那么_LED_KEY_H没有被定义,所以#define _LED_KEY_H#endif 中间的头文件内容就被执行,也就是头文件内容被定义。那么如果led.h第二次被引用,由于_LED_KEY_H 已经被第一次引用时定义了,所以不会执行#define _LED_KEY_H #endif 中间的头文件内容,也就是不会重复定义头文件内容。

在mian.c文件上方添加代码#include "LED_KEY.h",表示引用该文件


3、添加代码

LED_KEY.c下加入以下代码:

#include "LED_KEY.h"

void LED_Init(void)
{
    GPIO_InitTypeDef GPIO_Initure;
    __HAL_RCC_GPIOB_CLK_ENABLE();           //开启GPIOB时钟
	
    GPIO_Initure.Pin=GPIO_PIN_0;            //PB0
    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出
    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
    HAL_GPIO_Init(GPIOB,&GPIO_Initure);
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);	//PB0置1,默认初始化后灯灭
}

void KEY_Init(void)
{
    GPIO_InitTypeDef GPIO_Initure;    
    __HAL_RCC_GPIOA_CLK_ENABLE();           //开启GPIOA时钟
 
    GPIO_Initure.Pin=GPIO_PIN_0;            //PA0
    GPIO_Initure.Mode=GPIO_MODE_INPUT;      //输入
    GPIO_Initure.Pull=GPIO_PULLDOWN;        //下拉
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);
    
}

LED_KEY.h下加入以下代码:

#ifndef _LED_KEY_H
#define _LED_KEY_H
#include "sys.h"    //包含头文件

#define LED PBout(0)   //定义LED0
#define KEY_LED   HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)  //KEY_LED按键PA0

void LED_Init(void);  //LED灯初始化函数
void KEY_Init(void);  //按键初始化函数

#endif

在main.c下加入以下代码:

#include "sys.h"
#include "LED_KEY.h"
int main(void)
{
    HAL_Init();                     //--初始化HAL库   
    Stm32_Clock_Init(360,25,2,8);   //--设置时钟,180Mhz
    delay_init(180);                //---初始化延时函数	
	KEY_Init();//------------------------按键初始化函数
	LED_Init();//------------------------LED初始化函数
		
    while(1)
    {		
      if(KEY_LED==1)
		{						
		delay_ms(10);
		    if(KEY_LED==1)
			 {					
			 LED=!LED;	
			 }				
		}
		
	}
}
 

4、主要代码解释

1、main.c   下函数解释

    KEY_Init();     LED_Init();这两个函数是声明,想必大家都懂,函数使用前需要声明一下。

    while(1){ }  这里面的函数也特别简单,检测按键是否被按下,如果按下就LED灯亮灭翻转一下。

2、LED_KEY.c   下函数解释

    IO口初始化如下

    GPIO_InitTypeDef GPIO_Initure;     这个是GPIO的结构体函数

     __HAL_RCC_GPIOB_CLK_ENABLE();            这个是时钟函数,使用时选对应时钟

    GPIO_Initure.Pin=GPIO_PIN_0;            选择第几口

    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;       选择输出方式

    GPIO_Initure.Pull=GPIO_PULLUP;            这里选择上拉还是下拉,

    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     选择输出的翻转速度

    HAL_GPIO_Init(GPIOB,&GPIO_Initure);  
}

3、LED_KEY.h   下函数解释

 PBout(0)     PB0的输出状态,PBout(0) =1;表示PB0口输出高电平,PBout(0) =0;表示PB0口输出低电平。
 HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)        读取PA0的引脚状态

 void LED_Init(void);  //LED灯初始化函数声明
 void KEY_Init(void);  //按键初始化函数声明


5、补充

1、这里的按键为电阻下拉,LED灯为电阻下拉。

2、这里的按键为PA0口,LED灯为PB0口。

3、我为什么在每个文件里都包含#include "sys.h"   答:我把所有的头文件都放到了sys.h下,之后其他文件只引用这一个文件就可以包含sys.h下的所有头函数。(这也是一个小技巧,可以使用一下)


每天更新一篇文章,用于督促自己学习,同时更希望能帮助到大家,若有侵权请联系删掉。

(每天更新时间为第二天06:00前,有时事多需熬夜,望大家监督,如果可以希望大家多多给建议)

猜你喜欢

转载自blog.csdn.net/qq_38326581/article/details/109004517