前言
因为控制LED的引脚与LCD屏幕的引脚是复用的,所以这里使用了一片573锁存器芯片。其中PC8~PC15经过锁存器接到LED、PD2控制锁存器的状态,当PD2在低电平时锁存器在锁存状态,即输出不随输入变化而变化,反之当PD2在高电平时锁存器在解锁状态,输出随输入变化而变化。
STM32CubeMX配置
首先要将PC8~PC15、PD2配置为输出模式
鼠标左击要配置的引脚选择引脚工作模式为输出模式。
因为单片机输出低电平时点亮led灯,所以GPIO初始化时配置为输出高电平。
因为制锁存器的LE引脚在低电平时为锁存状态,所以GPIO初始化时配置为输出低电平。
配置完成后点击“GENERATE COOE”等待软件更新工程配置。
keil5程序
整体控制
一次更新所有LED灯的状态,程序如下:
/*
函数功能 : 更新所有LED灯的状态
函数参数 : 8位LED灯的状态(对应位1点亮,0熄灭)
返 回 值 : 空
*/
uint8_t LED_State = 0;//记录led灯得状态
void LED_SetEntierty(uint8_t led_data)
{
//修改LED灯的状态前先熄灭全部LED
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
//写入要点亮LED的位
HAL_GPIO_WritePin(GPIOC,led_data<<8,GPIO_PIN_RESET);
//先解锁锁存器更新输出(高电平),再将锁存器锁存住(低电平)。
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
//将LED灯的状态保存下来
LED_State = led_data;
}
单独控制
一次只更新1位LED灯的状态,程序如下:
/*
函数功能 : 更新1位LED灯的状态
函数参数 : 参数1:LED所在引脚、参数2:LED状态(1点亮、0熄灭)
返 回 值 : 空
*/
void LED_SetOne(uint8_t LED_PIN,uint8_t LED_SET)
{
//修改LED灯的状态前先熄灭全部LED
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
if(LED_SET == 1)
{
LED_State |= 0x01<<(LED_PIN-1);
}
else
{
LED_State &= ~(0x01<<(LED_PIN-1));
}
//修改LED灯的状态
HAL_GPIO_WritePin(GPIOC,LED_State<<8,GPIO_PIN_RESET);
//先解锁锁存器更新输出(高电平),再将锁存器锁存住(低电平)。
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
示例程序
#include "BspSYS.h"
/*
函数功能 : 外设初始化函数,只执行一遍
函数参数 : 空
返 回 值 : 空
*/
void setup(void)
{
LED_SetEntierty(0xaa);//一次控制所有led的状态
HAL_Delay(1000);
}
/*
函数功能 : 循环执行函数
函数参数 : 空
返 回 值 : 空
*/
void loop(void)
{
LED_SetOne(1,1);//按循序循环点亮熄灭LED1 - 3
HAL_Delay(500);
LED_SetOne(2,1);
HAL_Delay(500);
LED_SetOne(3,1);
HAL_Delay(500);
LED_SetOne(3,0);
HAL_Delay(500);
LED_SetOne(2,0);
HAL_Delay(500);
LED_SetOne(1,0);
HAL_Delay(500);
}