【51单片机系列】74HC595扩展实验之使用74HC595芯片在LED点阵中显示数字

本实验实现的功能是使用74HC595芯片实在LED点阵中显示数字字符0。

要点亮多个LED灯,需要用到动态数码管的动态扫描原理。

首先如何点亮一行上面的多个灯或一列上面的多个灯,明显就是需要某行或某列有效,同时使多列或多行有效。比如在第一行有效的情况下,有效列与这一行交点上的LED灯就会被点亮。

要实现行列不同位置亮灯,需要使用到动态显示的方法,也要结合扫描的方法。

在第一行亮灯一段时间以后灭掉,点亮第二行一段时间以后灭掉,点亮第三行一段时间后灭掉,如此点亮,直到行全部点亮一次,在第一行点亮到最后一行灭掉的总时间不能超过人肉眼可识别的时间,即24毫秒。在每一行点亮的时候,给列一个新的数据,此时对应列在该行上要点亮的灯的数据。这种方式类似数码管的动态显示一样,不同的是数码管的LED灯是段值,LED点阵是多个LED点亮。

要想在点阵上显示数字等字符,首先要获取在LED点阵上显示数字字符所需的数据,即一个数字字符在LED点阵上显示,对应的每行每列都会有一些灯点亮或者熄灭,这样就会构成一组数据,亦即数字字符的显示数据,将这些数据通过74HC595发送到点阵对应的行或列就能显示数字字符。

数字字符的获取可以使用相关软件获取。这里提供一种文字取模软件,如下:

比如显示数字0,如下:

取模数据为:

c 复制代码
u8 ledduan[] = {0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00};  // 类似于数码管的段选

在proteus中,红色的LED点阵模块采用上列下行的方式,电流通过方向为列->行,所以如果要点亮的话,行设置为0,列设置为1。如下,如果要点亮第一个LED,那么需要P0=0x01,D7-D0 = ~0x01。

显示如下数字0,软件实现如下:

c 复制代码
/*
	实现功能:74HC595芯片控制LED点阵显示数字0
	[2023-12-11] zoya
*/
#include "reg52.h"
#include "intrins.h"
#include "HC595.h"

u8 ledduan = B11111110;
u8 ledwei0[] = {
B00111000, // 0x38
B01000100, // 0x44
B01000100, // 0x44
B01000100, // 0x44
B01000100, // 0x44
B01000100, // 0x44
B00111000, // 0x38  
B00000000};  // 列1

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

void main()
{
	u8 i;
	while(1)
	{
		for(i=0;i<8;i++)
		{
			HC595SendByte(ledduan);  // 发送段选数据
			P0 = ledwei0[i];
			Delay(100);
			ledduan = _crol_(ledduan,1);
		}
	}
}

其中函数HC595SendByte实现如下:

c 复制代码
/*************************************************************************
* 函数名:		HC595SendByte
* 函数功能:	74HC595芯片将输入的一个字节的串行数据转换为并行数据输出
* 输入:			dat:74HC595要输出的一个字节的数据
* 输出:			void
**************************************************************************/
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;
}

仿真结果:

如果要显示1,如下

软件设计如下:

c 复制代码
/*
	实现功能:74HC595芯片控制LED点阵显示数字1
	[2023-12-11] zoya
*/
#include "reg52.h"
#include "intrins.h"
#include "HC595.h"

u8 ledduan = B11111110;
u8 ledwei[] = {0x10,0x18,0x10,0x10,0x10,0x10,0x7C,0x00};

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

void main()
{
	u8 i;
	while(1)
	{
		for(i=0;i<8;i++)
		{
			HC595SendByte(ledduan);  // 发送段选数据
			P0 = ledwei[i];
			Delay(200);
			ledduan = _crol_(ledduan,1);
		}
	}
}

仿真结果:

文字取模软件链接:

链接:https://pan.baidu.com/s/1k-ND9vJReW_KHMWx8uwpcQ?pwd=gz8w

提取码:gz8w

软件使用链接:【C51单片机系列】文字取模软件使用

相关推荐
Qingniu0142 分钟前
【青牛科技】应用方案 | RTC实时时钟芯片D8563和D1302
科技·单片机·嵌入式硬件·实时音视频·安防·工控·储能
荒Huang44 分钟前
Linux挖矿病毒(kswapd0进程使cpu爆满)
linux·运维·服务器
深圳市青牛科技实业有限公司2 小时前
【青牛科技】应用方案|D2587A高压大电流DC-DC
人工智能·科技·单片机·嵌入式硬件·机器人·安防监控
hjjdebug3 小时前
linux 下 signal() 函数的用法,信号类型在哪里定义的?
linux·signal
其乐无涯3 小时前
服务器技术(一)--Linux基础入门
linux·运维·服务器
Diamond技术流3 小时前
从0开始学习Linux——网络配置
linux·运维·网络·学习·安全·centos
斑布斑布3 小时前
【linux学习2】linux基本命令行操作总结
linux·运维·服务器·学习
Spring_java_gg3 小时前
如何抵御 Linux 服务器黑客威胁和攻击
linux·服务器·网络·安全·web安全
✿ ༺ ོIT技术༻3 小时前
Linux:认识文件系统
linux·运维·服务器
Mr.谢尔比3 小时前
电赛入门之软件stm32keil+cubemx
stm32·单片机·嵌入式硬件·mcu·信息与通信·信号处理