蓝桥杯STM32G431RBT6学习——LED

news/2024/11/19 16:42:54/

蓝桥杯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)
{//每次更新状态先熄灭所有LEDHAL_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;
}

http://www.ppmy.cn/news/12606.html

相关文章

第十三届蓝桥杯大赛软件类决赛Java大学B组C题——左移右移

【问题描述】 小蓝有一个长度为 N 的数组&#xff0c;初始时从左到右依次是 1, 2, 3, . . . N。 之后小蓝对这个数组进行了 M 次操作&#xff0c;每次操作可能是以下 2 种之一&#xff1a; 左移 x&#xff0c;即把 x 移动到最左边。右移 x&#xff0c;即把 x 移动到最右边。 …

代码整洁提升方案

验-言 公共方法都要做参数的校验&#xff0c;参数校验不通过明确抛出异常或对应响应码&#xff1a; Java Bean验证已经是一个很古老的技术了&#xff0c; 会避免我们很多问题&#xff1b; 在接口中也明确使用验证注解修饰参数和返回值&#xff0c; 作为一种协议要求调用方按…

通过Pycharm发布Flask项目到阿里云服务器步骤记录

总体部署思路 将程序代码托管到国内在线代码托管平台(码云Gitee),使用Git部署程序,将程序部署到阿里云服务器,并运行。 部署主要流程在本地进行开发并测试将文件添加到Git仓库并提交(git add&git commit)在本地将代码推送到代码托管平台(git push)在远程主机上从…

Android开发-AS学习(三)(布局)

相关文章链接&#xff1a;Android开发-AS学习&#xff08;一&#xff09;&#xff08;控件&#xff09;Android开发-AS学习&#xff08;二&#xff09;(控件&#xff09;Android开发应用案例——简易计算器&#xff08;附完整源码&#xff09;二、布局2.1 Linearyout常见属性说…

机器学习/人工智能 实验二:图像特征自动学习方法实践与分析

写在前面 参考的是https://zh.d2l.ai/index.html 一、实验目的与要求 (1)利用基于深度学习的特征自动学习方法完成图像特征提取的实验方案的设计。 (2)编程并利用相关软件完成实验测试&#xff0c;得到实验结果。 (3)通过对实验数据的分析、整理&#xff0c;得出实验结论&am…

【JavaEE】多线程之线程安全(synchronized篇),死锁问题

目录 线程安全问题 观察线程不安全 线程安全问题的原因 从原子性入手解决线程安全问题 ——synchronized synchronized的使用方法 synchronized的互斥性和可重入性 死锁 死锁的三个典型情况 死锁的四个必要条件 破除死锁 线程安全问题 在前面的章节中&#xff0c…

【经典笔试题】动态内存管理

test1&#xff1a;void GetMemory(char* p) {p (char*)malloc(100); } void Test(void) {char* str NULL;GetMemory(str);strcpy(str, "hello world");printf(str); }int main() {Test();return 0; }请问执行上面代码&#xff0c;会出现什么结果&#xff1f;解析&a…

一文入门 —— JavaScript

系列文章目录 文章目录 系列文章目录前言一、JavaScript是什么?二、使用方法三、基本语法四、DOM对象五、BOM对象其它资料前言 本系列教程目录与说明可查看这篇文章:C/C++教程 本章主要介绍前端三大基石之一的JavaScript 一、JavaScript是什么? 它并不像HTML、CSS这样看…