赞
踩
74HC595是一款常用的串行输入/并行输出(Serial-in/Parallel-out)移位寄存器芯片,在数字电子领域有着广泛的应用。它具有简单的接口和高效的扩展能力,成为了许多电子爱好者和工程师们的首选之一。本文将深入介绍74HC595芯片的功能、应用场景以及工作原理。
平时我们需要实现使用单片机点亮一个LED灯,那就要使用一个配置一个单片机的GPIO口输出高电平,但是点阵屏大到广告屏少说也有几百个LED灯,先不说浪费引脚的问题,单是单片机是否有这么多个GPIO口,这种情况下74HC595就派上用场了,它可以将串行的数据输出转化成并行输出的形式,这就使用1个GPIO口就可以控制8个LED,经过级联可以实现更少的IO口,这就是这个芯片最简单,也是最广泛的应用。
74HC595芯片是一种8位移位寄存器,可以通过串行数据输入的方式将数据存储在内部的寄存器中,并通过并行数据输出的方式将数据输出到相应的输出引脚上。它还具有级联能力,可以通过多个芯片级联扩展输出位数。它的主要功能包括:
SER
引脚输入数据。SRCLK
引脚提供时钟信号。RCLK
引脚锁存数据。QA~QH
引脚输出数据。
以下是74HC595芯片的引脚及其功能的详细说明:
VCC (Pin 16):
GND (Pin 8):
SER (Pin 14):
SRCLK (Pin 11):
RCLK (Pin 12):
QA-QH (Pins 15-1):
OE (Pin 13):
74HC595芯片由一个移位寄存器和一个输出寄存器组成。移位寄存器用于接收串行输入数据并进行位移操作,输出寄存器用于锁存移位寄存器中的数据并提供并行输出。
数据输入:
数据位移:
数据锁存和并行输出:
通过该移位寄存器和输出寄存器结构,74HC595允许我们通过串行输入数据并通过逐位位移的方式控制并行输出引脚,实现对外部设备的控制。通过适时提供时钟信号,可以控制数据的输入、位移和输出锁存的时机,从而实现灵活的数据控制和显示效果。
第一步:将第一个74HC595的QH'引脚(引脚9)
连接到第二个74HC595的SER(引脚14)
引脚,这将建立级联连接。
第二步:连接第一个74HC595的SRCLK(引脚11)
和RCLK(引脚12)
引脚以及第二个74HC595的SRCLK(引脚11)
引脚,以相同的时钟信号驱动两个芯片。
第三步:将第一个74HC595的QA-QH引脚(引脚15-1)
连接到需要控制的8位输出设备的输入引脚。
第四步:将第二个74HC595的QA-QH引脚(引脚15-1)
连接到另外8位输出设备的输入引脚。
第五步:分别连接每个74HC595的VCC引脚(引脚16)
到正电源(通常为+5V),并将两者的GND引脚(引脚8)
连接到共同的地线。
通过这种级联连接的方式,使用两枚74HC595芯片可以实现十六位输出控制。数据通过SER引脚串行输入到第一个芯片的移位寄存器,然后逐位向第二个芯片的移位寄存器传递。通过控制时钟信号,数据被移位和锁存到输出寄存器,并通过QA-QH引脚并行输出到外部设备。这样,您就可以通过编程控制和控制信号模式来控制这十六位输出设备的状态。
点阵屏是以逐行扫面的方式进行的,要不断刷新显示数据,间隔时间很少,所以在人眼上看就是同步进行的。
控制LED点阵屏的基本流程如下:
#include "stm32f10x.h"
// 定义74HC595芯片引脚连接
#define SER_PIN GPIO_Pin_0
#define SRCLK_PIN GPIO_Pin_1
#define RCLK_PIN GPIO_Pin_2
#define GPIO_PORT GPIOA
// 字符编码数据,使用负逻辑(低电平为亮)
const uint8_t font[][8] = {
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // 空白字符
{0x3E, 0x41, 0x41, 0x41, 0x41, 0x41, 0x3E, 0x00}, // 字母A
// 添加更多字符的字模数据...
};
// 函数声明
void delay(uint32_t time);
void sendByte(uint8_t data);
void sendCommand(uint8_t cmd);
void sendData(uint8_t data);
void displayMatrix(const uint8_t matrix[8]);
int main(void) {
// 初始化GPIO和时钟配置
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = SER_PIN | SRCLK_PIN | RCLK_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIO_PORT, &GPIO_InitStructure);
while (1)
{
// 显示字符A
displayMatrix(font[1]);
delay(1000); // 延时1秒
}
}
// 延时函数
void delay(uint32_t time) {
while (time--);
}
// 发送一个字节到74HC595芯片
void sendByte(uint8_t data) {
uint8_t i;
for (i = 0; i < 8; i++) {
GPIO_ResetBits(GPIO_PORT, SRCLK_PIN); // 时钟信号置低
if ((data & 0x80) == 0x80)
GPIO_SetBits(GPIO_PORT, SER_PIN); // 输出数据为1
else
GPIO_ResetBits(GPIO_PORT, SER_PIN); // 输出数据为0
data <<= 1;
GPIO_SetBits(GPIO_PORT, SRCLK_PIN); // 时钟信号置高,数据移位
}
}
// 发送命令到74HC595芯片(锁存数据)
void sendCommand(uint8_t cmd) {
GPIO_ResetBits(GPIO_PORT, RCLK_PIN); // 时钟信号置低
sendByte(cmd); // 发送数据
GPIO_SetBits(GPIO_PORT, RCLK_PIN); // 时钟信号置高,锁存数据
}
// 发送数据到74HC595芯片(显示数据)
void sendData(uint8_t data) {
GPIO_SetBits(GPIO_PORT, RCLK_PIN); // 时钟信号置高
sendByte(data); // 发送数据
GPIO_ResetBits(GPIO_PORT, RCLK_PIN); // 时钟信号置低
}
// 显示一个8x8点阵图案
void displayMatrix(const uint8_t matrix[8]) {
uint8_t row;
for (row = 0; row < 8; row++) {
sendData(matrix[row]);
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。