蓝桥杯STM32G431RBT6学习——LED
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
蓝桥杯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)
参数1IO口所在组
参数2IO口引脚号
参数3输出电平
反转IO口电平输出
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
参数1IO口所在组
参数2IO口引脚号
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位GPIOLED占用高八位以低电平写入
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设置函数
函数参数参数1LED所在引脚参数2LED状态值
函数返回值无
****************/
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;
}