蓝桥杯嵌入式赛道新手教程-第一节-LED部分

一、LED部分介绍

在这里插入图片描述

  • 这是LED部分的原理图

我们可以清晰的看到LED的阳极接到了VDD,阴极接到了这个所谓"SN74HC573"的不知名芯片
(所以可以得到我们需要点亮LED灯时需要给引脚输出低电平,熄灭LED灯则反之)
那么这个芯片是什么呢?有什么作用呢?它的1Q-8Q与1D-8D有什么作用呢?

1.SN74HC573

通过进行了解我们学习到

引脚名称 功能描述
D0-D7 数据输入引脚
Q0-Q7 数据输出引脚
LE 锁存使能(高电平透明传输)
OE 输出使能(低电平激活输出)
GND 接地
VCC 电源(2V-6V

SN74HC573 是一款高速 CMOS 逻辑器件,属于八路透明锁存器(Octal D-Type Transparent Latch)
采用3态输出。其典型应用包括数据缓冲、寄存器存储和总线驱动。
读者:???说了这么半天这个玩意怎么用啊!!我又不是来了解它的前世今生
我:那我们直接一个锁脖!提到它的↓
锁存功能:通过锁存使能(LE)引脚控制数据输入(D)到输出(Q)的透明传输或锁存。

在这里插入图片描述

说白了就是当我们的 PC8 - PC15 的信号输出到 74HC573 后并没有直接施加到LED上!
74HC573它就像是一个"保安" 直接跟我们要 “过路费” 还严格要求我们 “过路费” 必须交到 LE“桌子上” 才可以给我们 “放行”
当我们去缴费时,LE 特别的挑剔要求我们 今天 白天(高电平)转1块晚上(低电平)转0块 才可以让我通行,我们区区牛马!哪敢说话!直接缴费!避免爆炸!(观察到LE引脚是连接到PD2的,没观察到的现在做10个俯卧撑)

总结:使能PD2,配置默认低电平,即低电平时锁存数据,高电平时不锁存(即更新)数据
PD2锁存器的作用:引脚复用,解决与LCD引脚冲突的问题

在这里插入图片描述
说完了大概的驱动方式(其实说的特别抽象ovo),我们直接进入代码的编写以及配置内容。

2.驱动代码

led.c

#include "led.h"
 
void LED_set(unsigned char ucled)
{
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);//熄灭所有灯
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
	
	HAL_GPIO_WritePin(GPIOC,ucled<<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.h

#ifndef _LED_H_
#define _LED_H_
 
#include "main.h"
 
void LED_set(unsigned char ucled);
 
 
#endif

3.知其然知其所以然

在学习过程中,我们更希望知其然并知其所以然,我们在下面开始说一说为什么代码要这么写!
由上面的内容可知

我们的LED的控制是由MCU的PC8-PC15输出到74HC573进行锁存
我们在进行由MCU的PD2引脚进行74HC573的LE引脚的控制
即可实现LED的点亮以及熄灭

那么这一句话为什么要这样写呢?
HAL_GPIO_WritePin(GPIOC,ucled<<8,GPIO_PIN_RESET);

让我们先分析HAL_GPIO_WritePin()函数的功能
在这里插入图片描述

GPIOx:GPIO 端口指针(如GPIOA),指定要操作的 GPIO 端口
GPIO_Pin:要操作的引脚(如GPIO_PIN_0),可以是单个引脚或多个引脚的组合(通过位或|操作)。
PinState:引脚状态,枚举类型,取值为GPIO_PIN_SET(高电平)或GPIO_PIN_RESET(低电平)。

介绍完了函数的参数我们进入函数语句

assert_param(IS_GPIO_PIN(GPIO_Pin));
assert_param(IS_GPIO_PIN_ACTION(PinState));

通过assert_param宏检查参数合法性:确保GPIO_Pin是有效的引脚定义,PinState是合法的状态(只能是SET或RESET)。

进入到if语句中进行分析

if (PinState != GPIO_PIN_RESET)  // 若状态为高电平(SET)
{
    GPIOx->BSRR = (uint32_t)GPIO_Pin;
}

BSRR是 GPIO 端口的 “位设置 / 复位寄存器”(32 位)
低 16 位用于“置位”(Set):当某一位写1时,对应的引脚输出高电平(写0无效果)。如图所示
在这里插入图片描述

这是else语句

else  // 若状态为低电平(RESET)
{
    GPIOx->BRR = (uint32_t)GPIO_Pin;
}

BRR是 GPIO 端口的 “位复位寄存器”(32 位),低 16
位用于“复位”(Reset):当某一位写1时,对应的引脚输出低电平(写0无效果)。
在这里插入图片描述

我们通过设置好PC端口的BSRR与BRR即可实现对PC0-PC15的引脚电平输出控制(高/低电平)
再回到这条语句

HAL_GPIO_WritePin(GPIOC,ucled<<8,GPIO_PIN_RESET);

为什么要让变量ucled左移8位呢?
第一点:因为我们的LED的引脚只使用了PC8-PC15这些高位的引脚。
第二点:如果我们一个一个引脚的控制会不会有点麻烦呢?不如我们直接对这些高位进行控制吧,那怎么控制呢我们直接进行左移操作!

以我们点亮第一个LED(PC8)为例~~~

定 ucled = 0x01
当我们输入HAL_GPIO_WritePin(GPIOC,ucled<<8,GPIO_PIN_RESET);
左移也逃不过我们小伙伴的火眼金睛,那么0x01左移8位是多少呢,说得好是0x100!
如下图所示即为GPIO_PIN_8,我们就控制了PC端口的8号引脚,在通过PD2进行锁存、输出即可控制LED灯
其他内容由小伙伴们自己去发掘~~~~~~~~~~~~~

#define GPIO_PIN_0                 ((uint16_t)0x0001)  /* Pin 0 selected    */
#define GPIO_PIN_1                 ((uint16_t)0x0002)  /* Pin 1 selected    */
#define GPIO_PIN_2                 ((uint16_t)0x0004)  /* Pin 2 selected    */
#define GPIO_PIN_3                 ((uint16_t)0x0008)  /* Pin 3 selected    */
#define GPIO_PIN_4                 ((uint16_t)0x0010)  /* Pin 4 selected    */
#define GPIO_PIN_5                 ((uint16_t)0x0020)  /* Pin 5 selected    */
#define GPIO_PIN_6                 ((uint16_t)0x0040)  /* Pin 6 selected    */
#define GPIO_PIN_7                 ((uint16_t)0x0080)  /* Pin 7 selected    */
#define GPIO_PIN_8                 ((uint16_t)0x0100)  /* Pin 8 selected    */
#define GPIO_PIN_9                 ((uint16_t)0x0200)  /* Pin 9 selected    */
#define GPIO_PIN_10                ((uint16_t)0x0400)  /* Pin 10 selected   */
#define GPIO_PIN_11                ((uint16_t)0x0800)  /* Pin 11 selected   */
#define GPIO_PIN_12                ((uint16_t)0x1000)  /* Pin 12 selected   */
#define GPIO_PIN_13                ((uint16_t)0x2000)  /* Pin 13 selected   */
#define GPIO_PIN_14                ((uint16_t)0x4000)  /* Pin 14 selected   */
#define GPIO_PIN_15                ((uint16_t)0x8000)  /* Pin 15 selected   */
#define GPIO_PIN_All               ((uint16_t)0xFFFF)  /* All pins selected */
Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐