【51单片机系列】74HC595实现对LED点阵的控制

本文是关于LED点阵的使用,使用74HC595模块实现对LED点阵的控制。

一、8x8LED点阵的原理

1.1 LED点阵显示原理

LED点阵是由发光二极管排列组成的显示器件,被广泛应用于汽车报站器、广告屏等。如下所示:

image-20231208092451292

proteus中的8x8点阵如下:

PROTEUS中的LED点阵

通常应用较多的是8x8点阵,使用多个8x8点阵可组成不同分辨率的LED点阵显示屏,比如16x16点阵可以使用4个8x8点阵构成。

1.2 LED点阵内部结构图

8x8LED点阵内部结构图如下,这两种图片只是接法不同,要点亮LED,左图需要行置为高电平,列置为低电平;右图则需要行置为低电平,列置为高电平。

8x8LED点阵内部结构图

8x8点阵共由64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一行置高电平,某一列置低电平,则相应的二极管将点亮。

比如对于左图,如果要将第一个点点亮,则将第一行的⑨脚接高电平,第一列的13脚接低电平,第一个点就会点亮;如果要将第一行点亮,则第一行的⑨脚接高电平,所有列(13、3、4、10、6、11、15、16脚)接低电平,第一行就会点亮;如果要将第一列点亮,则第一列的13脚接低电平,所有行(9、14、8、12、1、7、2、5脚)接高电平,第一列就会点亮;如果要将对角线点亮,可以动态显示,首先点亮第一个点,然后点亮第2行第2列的点…这样依次循环点亮,就可以显示对角线的点。

如果要显示数字或字符,在需要的位置点亮,比如显示0(如下),可以循环点亮如下位置的LED。

LED点阵显示0

1.3 开发板上的LED点阵原理图

开发板上使用了74HC595芯片实现串转并,接到LED点阵模块,原理图如下:

LED点阵原理图

74HC595起到了扩展IO口的功能,从原理图可以看到74HC595使用3个IO口输入,有8个IO口输出。这8个IO口控制LED点阵的行(从第一行到最后一行分别是D7-D0),使用P0口控制LED点阵的列(从第一列到最后一列分别是P07-P00)。

比如对于如上结构图左图所示,如果要点亮第一个LED,那么P0口应该置为0x7f,D7-D0应该置为0x80。

1.4 74HC595芯片

74HC595芯片具有8为串行输入/输出或者并行输出移位寄存器,具有三态输出(高电平、低电平、高阻态)。是总线驱动的并行输出。通常用于串行输入到并行输出的数据转换。

74HC595引脚说明如下:

符号引脚描述
Q0…Q7(QA…QH)15,1-7并行数据输出
GND8逻辑地
Q7’9串行数据输出
/MR(/SRCLR)10主复位(低电平有效),接到GND就处于复位状态,要接到电源处于高电平状态
SHCP(SRCLK)11移位寄存器时钟输入
STCP(RCLK)12存储寄存器时钟输入
/OE13输出有效(低电平有效),在开发板上有一个端子,如果要使输出有效,就短接到GND,如果要使输出无效,就短接到VCC。也可以连接到一个IO口进行控制。进行LED点阵实验时要短接到地,使输出有效。
DS(SER)14串行数据输入,输入的数据经过74HC595芯片转换为并口输出
VCC16电源

74HC595功能如下,H=高电平,L=低电平,↑=上升沿,↓=下降沿,Z=高阻态,NC=无变化,X=无效

输入输入输入输入输入输出输出功能
SHCPSTCPOEMRDSQ7’Qn
XXLXLNCMR为低电平时仅影响移位寄存器
XLLXLL移位寄存器到输出寄存器,STCP上升沿会将数据输出
XXHLXLZ清空移位寄存器,并行输出为高阻态
XLHHQ6’NC逻辑高电平移入移位寄存器状态0,包含所有的移位寄存器状态移入
XLHXNCQn移位寄存器的内容到达存储寄存器并从并口输出
LHXQ6’Qn’移位寄存器内容移入,先前的移位寄存器的内容到达存储寄存器并输出

从上表可以知道,当主复位MR为高电平,输出使能OE为低电平时,数据在SHCP上升沿进入移位寄存器,在STCP上升沿输出到并行端口。

74HC595的数据端:

Q0-Q7:八位并行输出端,可以直接控制数码管的8个段。

Q7’:级联输出端,可以接下一个595的SER端。

SER:串行数据输入端。

74HC595控制端说明

  • /SCLR(10脚):主复位脚,低电平时清空移位寄存器,通常接VCC。
  • SCK(11脚):上升沿数据寄存器移位,下降沿移位寄存器数据保持不变。
  • RCK(12脚):上升沿时移位寄存器的数据进入存储寄存器,下降沿存储寄存器数据不变。
  • /OE(13脚):输出使能,高电平时禁止输出。

二、使用74HC595模块实现流水灯效果

在proteus中硬件设计如下,实现的功能为使用74HC595芯片实现流水灯效果。

74HC595实现流水灯效果

根据上面对74HC595的介绍,DS引脚是输入的串行数据,SHCP上升沿会进行移位寄存器的移位操作,STCP上升沿时会将数据输出到并行端口。

软件代码如下:

/*
	实现功能:74HC595芯片控制LED点阵实现LED流水灯的效果
	[2023-12-08] zoya
*/
#include "reg52.h"
#include "intrins.h"

typedef unsigned char u8;
typedef unsigned int u16;

sbit DS = P3^4;  // 74HC595输入数据端口
sbit STCP = P3^5;  // 74HC595存储寄存器端口,上升沿时移位寄存器进入存储寄存器
sbit SHCP = P3^6;  // 74hc595移位寄存器端口,上升沿时移入数据

// 延时函数,i=1延时10us
void Delay(u16 i)
{
	while(i--);
}

// 74HC595芯片将输入的串行数据转换为并行数据输出
void HC595SendByte(u8 dat)
{
	u8 i;
	STCP = 1;  // 高电平时存储寄存器数据保持不变
	SHCP = 1;  // 高电平时移位寄存器数据保持不变
	for(i=0;i<8;i++)
	{
		DS = dat >> 7;  // 每次输入最高位数据
		dat <<= 1;  // 移位后将dat数据左移一位,保证下一次移入的数据在最高位
		// 实现移位寄存器的时序,需要SHCP有一个上升沿,所以先将SHCP置0,然后置1
		SHCP = 0;
		_nop_();  // 空指令,不做任何操作,当做延时使用
		_nop_();
		SHCP = 1;
	}
	
	// 数据已经在移位寄存器了,现在将移位寄存器的数据输出到存储寄存器
	// STCP上升沿时将数据从移位寄存器输出到存储寄存器
	STCP = 0;
	_nop_();
	_nop_();
	STCP = 1;
}


void main()
{
	u8 ledNum = ~0x01;  // 首先点亮D0
	// HC595SendByte(0xff);
	while(1)
	{
		HC595SendByte(ledNum);
		ledNum = _crol_(ledNum,1);  // 左移,逐个点亮D0-D7
		Delay(50000);
	}
}

仿真结果:

74HC595实现LED流水灯效果

三、 使用74HC595模块控制LED点阵对角线亮

在proteus中设计如下LED点阵,实现使用74HC595控制LED点阵对角线灯亮的功能。

image-20231208151820036

代码实现如下:

/*
	实现功能:74HC595芯片控制LED点阵实现对角线点亮
	[2023-12-08] zoya
*/
#include "reg52.h"
#include "intrins.h"

#define GPIO_LED P0  // LED点阵列控制IO口

typedef unsigned char u8;
typedef unsigned int u16;

sbit DS = P3^4;  // 74HC595输入数据端口
sbit STCP = P3^5;  // 74HC595存储寄存器端口,上升沿时移位寄存器进入存储寄存器
sbit SHCP = P3^6;  // 74hc595移位寄存器端口,上升沿时移入数据
u8 ledNum = 0x01;

// 延时函数,i=1时延时10us
void Delay(u16 i)
{
	while(i--);
}

// 74HC595芯片将输入的串行数据转换为并行数据输出
void HC595SendByte(u8 dat)
{
	u8 i;
	STCP = 1;  // 高电平时存储寄存器数据保持不变
	SHCP = 1;  // 高电平时移位寄存器数据保持不变
	for(i=0;i<8;i++)
	{
		DS = dat >> 7;  // 每次输入最高位数据
		dat <<= 1;  // 移位后将dat数据左移一位,保证下一次移入的数据在最高位
		// 实现移位寄存器的时序,需要SHCP有一个上升沿,所以先将SHCP置0,然后置1
		SHCP = 0;
		_nop_();  // 空指令,不做任何操作,当做延时使用
		_nop_();
		SHCP = 1;
	}
	
	// 数据已经在移位寄存器了,现在将移位寄存器的数据输出到存储寄存器
	// STCP上升沿时将数据从移位寄存器输出到存储寄存器
	STCP = 0;
	_nop_();
	_nop_();
	STCP = 1;
}

void main()
{
	// 点亮LED点阵的第一个灯,P00=0,其它为1
	u8 dNum = ~0x01;
	GPIO_LED = ledNum;
	while(1)
	{
		HC595SendByte(dNum);
		GPIO_LED = ledNum;
		Delay(200);
		dNum = _crol_(dNum,1);
		ledNum = _crol_(ledNum,1);
	}
}

仿真结果:

74HC595实现LED点阵对角线亮的效果

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是一个基于 74HC595 的 16x16 点阵驱动程序,适用于 51 单片机。需要注意的是,这个程序只是提供一个基本的框架,具体的点阵显示内容需要根据实际需求编写。 ```c #include <reg51.h> #define LATCH P1_0 // 数据锁存引脚 #define CLK P1_1 // 时钟引脚 #define DATA P1_2 // 数据引脚 unsigned char code font16x16[] = { // 16x16 点阵字体库 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 空格 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0xFE,0x7C,0x00,0x00,0x00,0x00,0x00,0x00, // ! 0x00,0x00,0x00,0x00,0x00,0x0E,0x0E,0x00,0x00,0x0E,0x0E,0x00,0x00,0x00,0x00,0x00, // " // 其他字符 }; void writeByte(unsigned char byte) { // 向 74HC595 写入一个字节 unsigned char i; for (i = 0; i < 8; i++) { CLK = 0; DATA = (byte & 0x80) >> 7; byte <<= 1; CLK = 1; } } void writeMatrix(unsigned char *matrix) { // 显示一个 16x16 的点阵 unsigned char row, col; for (row = 0; row < 16; row++) { LATCH = 0; writeByte(1 << row); writeByte(matrix[row]); LATCH = 1; for (col = 0; col < 10; col++); // 稍微延时一下 } } void main() { unsigned char matrix[16] = { 0 }; // 初始化一个空的 16x16 点阵 unsigned char i; for (i = 0; i < 16; i++) { matrix[i] = font16x16[i]; // 将字体库的第一行复制到点阵中 } while (1) { writeMatrix(matrix); // 不断刷新点阵 } } ``` 以上代码中,`writeByte` 函数用于向 74HC595 中写入一个字节,`writeMatrix` 函数用于将一个 16x16 的点阵显示出来。在 `main` 函数中,我们初始化了一个空的点阵,并将字体库的第一行复制到其中。在循环中,不断刷新点阵实现动态显示的效果。 需要注意的是,这个程序中的延时是通过一个空循环实现的,实际情况下需要根据硬件和需求进行调整。另外,如果需要显示中文或其他非 ASCII 字符,需要将字体库进行相应的修改。 ### 回答2: 74HC595是一种8位移位寄存器,通常用于扩展微控制器的输出引脚。而16×16点阵则是由16行和16列的LED组成的显示器,可以显示文字、图形等信息。在51单片机中使用74HC595和16×16点阵,可以通过为单片机的输出引脚提供数据,控制点阵显示不同的图案或文字。 首先,设置单片机的输出引脚与74HC595的串行数据输入(DS)、时钟输入(SHCP)和存储器锁存输入(STCP)进行连接。通过向74HC595的DS输入引脚依次输入各个LED的状态数据,然后通过触发SHCP时钟输入引脚,逐位地将数据移位至寄存器中。当所有数据位都移入寄存器后,通过触发STCP存储器锁存输入引脚,将寄存器中的数据同时输出到74HC595的并行输出引脚(Q0~Q7)。由于74HC595只有8个并行输出引脚,因此需要使用多个74HC595进行扩展,将输出引脚与相应的点阵行或列控制引脚相连。 接下来,设置单片机的输出引脚与16×16点阵的行(A~P)和列(1~16)进行连接。通过控制单片机输出引脚的高低电平,可以控制点阵的行和列的选通状态。例如,当需要选通第1行第1列的LED时,将第1行对应的控制引脚置为低电平,同时将第1列对应的控制引脚置为高电平;当需要选通第1行第2列的LED时,将第1行对应的控制引脚置为低电平,同时将第2列对应的控制引脚置为高电平,以此类推。 通过编写适当的程序,可以实现点阵控制。例如,可以将字模数据保存在单片机中,然后根据需要从单片机中读取字模数据,并依次输出到74HC595中,通过控制点阵的行和列的选通状态,实现相应的字符或图形的显示。 总之,通过使用74HC595和16×16点阵,结合51单片机编程,可以实现点阵控制,显示不同的图案或文字。 ### 回答3: 74HC595是一款数字集成电路芯片,可用来扩展输出IO口。它具有串行输入和并行输出的特点,常用于驱动点阵显示器。 要使用74HC595驱动16×16点阵,首先需要连接芯片与单片机。通过单片机的IO口,将数据、时钟和锁存信号分别连接到74HC595的串行数据输入(DS)、时钟输入(SHCP)和存储锁存器时钟(STCP)。同时接地端接地,VCC端接单片机的电源,并连接合适的限流电阻。 通过单片机程序,可以实现点阵控制。首先要定义一个长为32的数组,用于存储点阵的数据。每16位代表一行的数据,共有16行,通过对数组的操作,可以实现打开、关闭或改变点阵上的每个像素点的状态。 然后,在程序中使用循环语句对每一行进行操作。通过使74HC595的串行数据输入(DS)引脚为低电平,然后逐位移位将要显示的数据输入到74HC595中。接着,给74HC595的存储锁存器时钟(STCP)引脚一个上升沿信号,将数据锁存到输出寄存器中。最后,通过给74HC595的输出引脚连接到点阵的对应引脚,可以实现点阵控制。 通过重复上述操作,可以实现对16×16点阵控制。在程序中可以通过改变数组中每个元素的值,实现点阵的显示效果,例如实现一些图案、动画等。 总之,使用74HC595驱动16×16点阵,可以通过单片机程序实现点阵控制,在点阵上显示出想要的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值