灯的控制蓝桥杯STM32G431RBT6学习:LED灯的控制

蓝桥杯STM32G431RBT6学习——LED

前言

LED为每年必考考点,也是入门的基础,国信长天的开发板LED硬件如下:

经典的锁存器控制,因为LED所用引脚与LCD重叠,因此通过锁存器进行控制其状态。当74HC573的LE引脚(PD2)为高电平时,锁存器处于解锁状态,PC8~PC15电平直接输出给到LED,当LE引脚(PD2)为低电平时,74HC573将电平信号进行锁存。

STM32CubeMX配置

时钟配置依旧,只需要将LED及锁存器LE引脚对应的单片机IO口设置为输出模式即可,LED为共阳接法,且LE引脚为低电平锁定,因此IO口初始状态均设为低电平、推挽输出、无上下拉、低速。

Keil代码编写

GPIO的初始化由CubeMX自动生成与gpio.c中的MX_GPIO_Init函数。
关于LED的常用API如下:
设置输出电平

void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

参数1:IO口所在组;
参数2:IO口引脚号;
参数3:输出电平
反转IO口电平输出

void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

参数1:IO口所在组;
参数2:IO口引脚号

LED的控制只需要简单的给对应IO口赋值低电平即可点亮,为了方便使用,也可以对其控制进行封装,以下分别封装为整体控制与单独控制:
整体控制:
整体控制为一次改变所有LED的状态,因此可以在函数的开头对LED进行全灭处理,随后将目标LED状态写入,写入完成后开关锁存器将IO口信号输出到LED即可,最后保存写入值用于单独控制使用,代码如下:

/****************
函数功能:整体LED设置函数
函数参数:整体LED状态值(8位)
函数返回值:无
****************/
void LED_Set(uchar led_Pin)
{
	//每次更新状态先熄灭所有LED
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
	//写入LED的值(16位GPIO,LED占用高八位),以低电平写入
	HAL_GPIO_WritePin(GPIOC,led_Pin<<8,GPIO_PIN_RESET);
	//拉高解锁74HC573,传入数据后重新拉低锁存
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
	
	ledState = led_Pin;
}

单独控制:
由于整体控制会一次改变所有的LED状态,例如需要LED1保持不变的情况下改变LED2就会稍许麻烦,因此也封装一个函数用于单独改变某个LED的状态,直接读取上次的状态进行写入后,再对单独的LED进行控制即可,代码如下:

/****************
函数功能:单独LED设置函数
函数参数:参数1:LED所在引脚,参数2:LED状态值
函数返回值:无
****************/
void LED_SetOne(uint16_t GPIO_Pin, GPIO_PinState PinState)
{
	HAL_GPIO_WritePin(GPIOC,ledState<<8,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOC,GPIO_Pin,PinState);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
	
	ledState = !GPIOC->IDR>>8;
}
物联沃分享整理
物联沃-IOTWORD物联网 » 灯的控制蓝桥杯STM32G431RBT6学习:LED灯的控制

发表评论