【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单片机系列】文字取模软件使用

相关推荐
赖small强1 小时前
[Linux]内核队列实现详解
linux·kfifo·请求队列·工作队列(workqueue)·等待队列·kfifo_init
千語萬言-1 小时前
硬件岗位基础知识
单片机·嵌入式硬件
www.022 小时前
linux服务器升级显卡驱动(笔记)
linux·运维·服务器·笔记·ubuntu·服务器环境
wdfk_prog3 小时前
[Linux]学习笔记系列 -- [kernel][time]hrtimer
linux·笔记·学习
摇滚侠3 小时前
Spring Boot3零基础教程,把 Java 程序打包为 Linux 可执行文件,笔记91
java·linux·笔记
xuhe23 小时前
🛠️ 深度解析我的 Overleaf 私有化部署:一份稳定、高兼容性的 `docker-compose.yaml`
linux·docker·科研·overleaf
技术小白爱FPGA3 小时前
zynq7000- linux平台 PS读写PL测试
linux·fpga开发
BD_Marathon3 小时前
【Linux】awk命令
linux·运维·服务器
Z22ZHaoGGGG3 小时前
verilog中数据跨时钟处理方法
单片机·嵌入式硬件·fpga开发·自动化
前端世界4 小时前
Linux 防火墙实战:用 firewalld 配置 External/Internal 区域,实现 NAT 内网共享上网
linux·服务器·网络