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

相关推荐
人间打气筒(Ada)18 分钟前
zerotier内网穿透部署(rockylinux部署本地服务器)超详细~~~
linux·内网穿透·内网·公网·zerotier·穿透
清风与日月26 分钟前
c# 上位机作为控制端与下位机通信方式
单片机·嵌入式硬件·c#
Elias不吃糖1 小时前
Git常用指令合集
linux·git
_OP_CHEN1 小时前
Linux网络编程:(七)Vim 编辑器完全指南:从入门到精通的全方位实战教程
linux·运维·服务器·编辑器·vim·linux生态·linux软件
Maple_land1 小时前
第1篇:Linux工具复盘上篇:yum与vim
linux·运维·服务器·c++·centos
奋斗的牛马1 小时前
OFDM理解
网络·数据库·单片机·嵌入式硬件·fpga开发·信息与通信
shizhan_cloud2 小时前
Linux 硬盘分区管理
linux·运维
蓁蓁啊2 小时前
Ubuntu 虚拟机文件传输到 Windows的一种好玩的办法
linux·运维·windows·单片机·ubuntu
EVERSPIN2 小时前
32位MCU芯片国产品牌(32系列单片机常用型号有哪些)
单片机·嵌入式硬件·mcu单片机·32系列单片机
爱吃汽的小橘3 小时前
使用DSI TX IP驱动LCD显示屏
单片机·嵌入式硬件