蓝桥杯嵌入式——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.宏定义
宏定义时一定记住不要在最后多了个“ ; ”,这样是不会报错的。这样的错误不会报错 很难发现啊 ! 一定要注意。