蓝桥杯嵌入式——LED配置

蓝桥杯嵌入式——LED配置

作者:张阿永  QQ:793805481

  我们直接利用液晶驱动参考例程这个工程模板来进行编程,不需要手动再去创建一个工程。然后,就可以按照如下步骤进行LED的配置。

1.我们将main函数中多余的部分删掉,保留如下所示:

在这里插入图片描述
2.我们在工程文件夹中新建一个USER文件夹,用来存放我们自己的.c和.h文件。为了方便区分不同外设,我们还可以继续新建LED子文件夹。
在这里插入图片描述
3.在Keil中新建led.c和led.h文件并保存到USER的LED文件夹中。
在这里插入图片描述
在这里插入图片描述
4.添加.c和.h文件到工程中,具体步骤如下:
(1).c的添加
在这里插入图片描述
在这里插入图片描述
(2).h的添加
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
5.编写程序。 完成上述步骤后,就可以在led.c led.h中编写程序了。
  stm32的编程有两种方式,一种是直接配置寄存器(51单片机就是直接配置寄存器的),一种是使用库函数配置,无论使用哪种方式配置都是可以的。由于使用库函数配置比较方便,容易理解,我们使用库函数配置LED。
  首先,我们先来看一下原理图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  从原理图中,我们可以看到:共有8个LED灯D1-D8分别对应PC8-PC15引脚;LED灯受一个锁存器的控制,对这个锁存器有了解的可以知道,当N_LE引脚为高电平时,H_D0-H_D7的电平信号可以直接传到右端给到LED,如果N_LE引脚为低电平的时候,无论H_D0-H_D7的电平信号如何改变,HC573锁存器右端的电平信号都不会改变(不知道的可以记着)。之所以有这个锁存器,是因为LED的引脚与LCD的数据引脚是共用的,为了使两者之间互不干扰,需要这个锁存器。所以,当N_LE引脚为1,相应LED引脚为0时,相应的LED被点亮。了解了这些我们就可以编写程序了。这里,我们直接给出代码,相关解释在注释中给出。
(1)led.h中

#include "stm32f10x.h"	 //头文件中一般都需要声明这个头文件

#define led1 GPIO_Pin_8	   //宏定义  方便之后对相应GPIO口的操作
#define led2 GPIO_Pin_9
#define led3 GPIO_Pin_10
#define led4 GPIO_Pin_11
#define led5 GPIO_Pin_12
#define led6 GPIO_Pin_13
#define led7 GPIO_Pin_14
#define led8 GPIO_Pin_15
#define ledall GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15

void LED_Init(void);//先在.h中定义相关函数
void LED_Control(uint16_t LED,uint8_t state);//先在.h中定义相关函数


(2)led.c中

#include "led.h"  //先声明头文件
#include "stm32f10x.h" //可有可无  led.h中已经包含的有了

void LED_Init(void)	// LED初始化函数
{
  GPIO_InitTypeDef GPIO_InitStructure;
  //时钟初始化    在我们使用GPIO之前,必需先使能相应的时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);

  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//输出模式
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
  GPIO_Init(GPIOD,&GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  //通过或一次将8~15初始
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
  GPIO_Init(GPIOC,&GPIO_InitStructure);

  GPIO_SetBits(GPIOD,GPIO_Pin_2); //打开锁存器
  GPIO_SetBits(GPIOC,ledall);	 //	  将GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15全都值1  初始时时都灭
  GPIO_ResetBits(GPIOD,GPIO_Pin_2);//关闭锁存器   注:关闭锁存器后,值将被保留(即锁存起来)
}

void LED_Control(uint16_t LED,uint8_t state) //LED控制函数   0 为亮 1为灭
{
   if(state==0)
   {
   	GPIO_SetBits(GPIOD,GPIO_Pin_2);	 //打开锁存器
    GPIO_ResetBits(GPIOC,LED);	    //点亮相应LED
    GPIO_ResetBits(GPIOD,GPIO_Pin_2);//打开锁存器
   }
   if(state==1)
   {
	GPIO_SetBits(GPIOD,GPIO_Pin_2);
    GPIO_SetBits(GPIOC,LED);
    GPIO_ResetBits(GPIOD,GPIO_Pin_2);
   }
}

这部分内容比较基础,如果一些地方不理解的话,建议先看一下正点原子前边和LED的视频,也欢迎私信提问。
然后,就可以在主函数中,调用LED初始化和控制函数了。
在这里插入图片描述
编译下载程序后:
在这里插入图片描述

补充:

1.为什么要同时定义一个.c和.h文件呢?
在这里插入图片描述
2.时钟是什么东西?
  简单的说,时钟是单片机的脉搏,是单片机的驱动源,使用任何一个外设都必须打开相应的时钟。这样的好处是,如果不使用一个外设的时候,就把它的时钟关掉,从而可以降低系统的功耗,达到节能,实现低功耗的效果。每个时钟tick,系统都会处理一步数据,这样才能让工作不出现紊乱。
3.宏定义
  宏定义时一定记住不要在最后多了个“ ; ”,这样是不会报错的。这样的错误不会报错 很难发现啊 ! 一定要注意。

发布了7 篇原创文章 · 获赞 1 · 访问量 1208

猜你喜欢

转载自blog.csdn.net/qq_44944624/article/details/104947302