LED是比较简单且常用的模块。通过高低电平可以控制LED灯的亮灭。常见的可以用LED灯的闪烁表示程序的正常运行,也可以用LED灯的亮灭表示电梯所在的楼层或某些警告的有无等。
蓝桥杯嵌入式开发板LED灯的电路连接:
由上图可以看出LED灯的接法是共阳接法,由74HC573锁存I/O的端口输出电平。所以如果想使LED灯亮的话可以先使能74HC573的使能端,然后使相应的I/O口为低电平,那么就可以使该LED灯点亮。
74HC573的HD0~HD7(及LED灯的阴极端口)和74HC573的使能端与芯片的I/O端口电路连接如下图:
LED1—PC8
LED2—PC9
LED3—PC10
......................
LED8—PC15
NLE(74HC573使能端)—PD2
因其要用到的I/O口(PC8—PC15)也是LCD要用到的I/O口,即LED的I/O口被复用。一般情况下,LED的I/O口要分时使用,否则就会造成LED的显示不理想和LCD的黑屏或闪屏等不理想的现象。所以通过74HC573锁存器的锁存功能来分时使用这些I/O口。当74HC573的使能端(NLE)为高电平时,可以对这些I/O口进行相应的设置,使LED做出相应的亮灭变化。然后将NLE变为低电平,这时这些I/O口的高低电平被锁存到74HC573中。LED等的亮灭情况也会暂时不会改变,直至NLE被使能和I/O端口的高低电平有变化。NLE变为低电平后可以用作LCD的使用。并且LCD的显示效果不会因LED灯的亮灭状态变化而有人眼能察觉到的变化。
LED灯相应I/O端口初始化函数及解释
LED灯对应芯片的I/O口初始化代码如下
/** * @说明 LED 相关GPIO引脚工作模式及时钟源配置 * @参数 None * @返回值 None */void LED_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
//LED引脚配置,PC08~PC15 GPIO_InitStructure.GPIO_Pin = LED0 |LED1 | LED2 | LED3 | LED4 | LED5 | LED6\ | LED7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOC, &GPIO_InitStructure);
//74HC573锁存引脚配置,PD2 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_Init(GPIOD, &GPIO_InitStructure);}
其中LED0~LED7的定义可以为
//CT117E LED#define LED0 GPIO_Pin_8#define LED1 GPIO_Pin_9#define LED2 GPIO_Pin_10#define LED3 GPIO_Pin_11#define LED4 GPIO_Pin_12#define LED5 GPIO_Pin_13#define LED6 GPIO_Pin_14#define LED7 GPIO_Pin_15#define LEDALL GPIO_Pin_All
GPIO_InitTypeDef为GPIO初始化结构定义,是一个结构体,包含要初始化具体哪个I/O端口、端口的速度和模式。GPIO_InitTypeDef的定义在stm32f10x_gpio.h的第87行。
RCC_APB2PeriphClockCmd为I/O口时钟使能函数。其参数为I/O端口号和是否使能信号。该函数定义在stm32f10x_rcc.c中的第1095行、声明在stm32f10x_rcc.h中的第693行。且其函数容易与stm32f10x_rcc.h中的第700行的RCC_APB2PeriphResetCmd函数搞混,有时会利用第二个函数初始化I/O口的时钟,导致I/O口无法正常使用。
其第一个参数的全部可用变量别名定义在stm32f10x_rcc.h中的第497行,第二个参数的全部可用变量别名定义在stm32f10x.h中的第522行。快速定位这些变量别名的方法:利用函数内部这些参数是否正确的函数,其定义的改行或上面为这些变量别名的全部列举,其他变量别名的查找也可以用这种方法。
RCC_APB2PeriphClockCmd与RCC_APB1PeriphClockCmd的区别(来源于openedv论坛):
RCC_APB2PeriphClockCmd负责AD、I/O、串口1、高级TIM
RCC_APB1PeriphClockCmd负责DA、串口2,3,4,5、普通TIM、USB、IIC、CAN
GPIO_InitTypeDef的第一个元素GPIO_Pin为要初始化的哪个I/O口。因为32 的I/O口比较多,所以可以不需刻意记住,用到的时候查看官方提供的电路图(比赛的时候有)。其全部的变量别名定义在stm32f10x_gpio.h中的第127行。
第二个元素GPIO_Mode为I/O口模式选择,其全部变量别名为GPIO_Mode_AIN(模拟输入)、GPIO_Mode_IN_FLOATING(浮空输入)、GPIO_Mode_IPD(下拉输入)、GPIO_Mode_IPU(上拉输入)、GPIO_Mode_Out_OD(开漏输出)、GPIO_Mode_Out_PP(推挽输出)、GPIO_Mode_AF_OD(复用开漏输出)、GPIO_Mode_AF_PP(复用推挽输出)。根据实际需求进行选择。其定义在stm32f10x_gpio.h中的第82行。
第三个元素GPIO_Speed为I/O口速度选择,其全部变量别名为GPIO_Speed_10MHz、GPIO_Speed_2MHz、GPIO_Speed_50MHz。可以根据数字和单位知道其含义。根据实际需求进行选择,两两之间的影响不大。其定义在stm32f10x_gpio.h中的第64行。
函数GPIO_Init为I/O口初始化函数。其第一个参数为I/O的变量别名,第二个参数为GPIO初始化结构定义变量的指针(或地址)。第一个参数的全部变量别名定义在stm32f10x.h中的第1408行。
I/O口的初始化步骤为:
1、定义GPIO初始化结构定义变量
2、初始化I/O口时钟
3、GPIO初始化结构定义变量的赋值
4、I/O口初始化函数的调用
LED灯控制函数(建议使用)
因为大多数的情况要多次改变LED灯的亮灭状态,如果在改变时进行相应函数的编写的话比较麻烦,而且也会提高代码的冗余度。所以一般写一个LED灯的控制函数,解决以上的问题。因为LED灯的控制函数要根据情况进行确定,种类多样。所以以下只是列举一般的控制函数。
/** * @说明 控制LED打开或关闭 * @参数 Led: LED编号,GPIO_Pin_8到GPIO_Pin_15 * @参数 Ledstatus: 0,关闭LED;1,打开LED * @返回值 None */void LED_Control(uint16_t LED,uint8_t LED_Status){ if(LED_Status == 0){ GPIO_SetBits(GPIOC,LED); GPIO_SetBits(GPIOD,GPIO_Pin_2); GPIO_ResetBits(GPIOD,GPIO_Pin_2); //状态锁存 } else { GPIO_ResetBits(GPIOC,LED); GPIO_SetBits(GPIOD,GPIO_Pin_2); GPIO_ResetBits(GPIOD,GPIO_Pin_2); //状态锁存 }}
函数GPIO_SetBits是使相应的I/O口设置为高电平。函数GPIO_ResetBits是使相应的I/O口设置为低电平。其第一个参数和第二个参数合起来确定使能哪个I/O口。函数GPIO_SetBits定义在stm32f10x_gpio.c中的第358行、声明在stm32f10x_gpio.h中的第357行。函数GPIO_ResetBits定义在stm32f10x_gpio.c中的第374行、声明在stm32f10x_gpio.h中的第358行
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有