目录

前言:

正文开始:

573锁存器:

管脚操作:

代码编写:


前言:

        本篇博客建立在新建工程的基础上,大家如果感兴趣的话,可以去看一下,这里我就不再展示新建工程的部分了。

正文开始:

        根据官方提供的数据手册,我们在驱动LED模块的时候不得不使用74HC573锁存器。

         在开始驱动之前,我们了解一下573锁存器

573锁存器:

        D0-D7是8位数据输入线,Q0-Q7是8位数据输出线。

        OE是输出允许,低电平有效,为低电平时,三态门全开,当OE为高电平时,输出为高阻态。

        LE是数据输入允许,高电平有效。

        当使能LE(G)为高时,Q 输出将随数据LE(D)输入而变。当使能为低时,将输出锁存在已建立的数据电平上。

        而官方的设计将OE端接地,LE端连接在了PD2上,也就意味着,我们将PD2置为高时,Q0-Q7的输出均由D0-D7决定。明白了这一点之后,我们再来到STM32Cubemx上操作。

管脚操作:

        在软件中,我们选择PC8到PC15这八个引脚,全部选择为GPIO_Output模式,然后我们将电平全部设为高(个人习惯),然后我们也将PD2置为GPIO_Output模式。之后,我们只需要点击右上方的GENERATE CODE即可。

代码编写:

        因为我们是第一次添加外设,我们先在工程文件夹下新建一个BSP文件夹,这个文件夹用来存放以后我们添加的外设。

        然后,右键点击项目,选择manage project,将我们新建的文件夹给添加进来。

         我们再新建一个LED.c和LED.h文件,并且将这两个文件给放到BSP这个文件夹里面,同时在魔法棒里点击C/C++选项卡

         将这个文件路径给包含过来之后,我们就可以在LED.c和LED.h中编写我们的程序了

        led.c:

#include "led.h"
 
void led_Disp(uchar dsled)
{
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC,dsled<<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_Disp(uchar dsled);
 
#endif

      之后,为了实现LED流水灯效果,我在main.里面做了如下修改:

		for(led_bit = 0;led_bit < 8;led_bit ++)
		{
			led_Disp(0x01<<led_bit);
			HAL_Delay(500);
		}

补发:

         之前在学习正点原子的STM32F103精英板的时候,他们提供了一种位带操作,这让我觉得很方便,但是如果要在比赛中默写出这个位带操作的头文件还是比较麻烦的,我们可以直接利用& |操作来完成具体某个LED的闪烁,我们在C函数中定义这个变量,我们再去头文件中声明一下

#include "LED.h"
 
//LED升级版,具体让某一位LED亮且不影响其他几位
 
unsigned char led_show;//重点在这
						
void LED_disp(unsigned char dsled)
{
	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOC,dsled<<8,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
#ifndef __LED_H
#define __LED_H
 
#include "main.h"
 
extern unsigned char led_show;
 
void LED_disp(unsigned char dsled);
 
 
#endif

       具体用的时候,我们直接包含这个头文件即可,然后用&|操作来控制这个LED灯

LED_disp(led_show|0x10);
//对应的就是第5个灯亮