普中51单片机:LED点阵屏组成结构及实现方法详解(九)

在这里插入图片描述

文章目录

  • 引言
  • 什么是LED点阵屏?
  • 工作原理
  • 74HC595移位寄存器
    • 基本引脚作用
    • 级联工作原理
  • 电路图
  • 代码演示——16*16LED点阵屏轮播点亮每行LED
  • 代码演示——显示数字0
  • 代码演示——16*16游动字幕显示

引言

LED点阵屏作为一种广泛应用于现代显示技术的设备,因其能够高效、清晰地展示文字、图形和视频内容而备受青睐。它们在广告宣传、公共信息发布、交通指引、舞台背景等领域具有重要作用。本文将详细介绍LED点阵屏的工作原理、组成结构及其实现方法,以16x16点阵屏为例进行具体说明,并展示如何通过编程实现LED点阵屏的控制与显示。

什么是LED点阵屏?

LED点阵屏是一种由多个LED(发光二极管)组成的显示设备,通过控制每个LED的亮灭来实现图像和文字的显示。常见的LED点阵屏规格有8x8、16x16等,本文以16x16点阵屏为例进行讲解。根据颜色的不同,LED点阵屏可以分为单色、双色和全彩三种类型,分别适用于不同的应用场景。
在这里插入图片描述

工作原理

LED点阵屏的核心在于如何控制每个LED的亮灭。通常使用行列扫描的方法,通过快速切换行和列的电流来点亮特定的LED。为了实现这一点,常用的控制芯片包括74HC595移位寄存器和MAX7219驱动芯片。利用行线和列线的交叉点上的LED,通过编程控制这些LED的亮灭来实现图像的显示。例如,当某一行电平被拉高,某一列电平被拉低时,对应交叉点的LED就会点亮。需要进行逐行或逐列扫描,利用人眼的余晖效应进行显示。

LED点阵屏的结构类似于数码管,只不过是数码管把每一列的像素以'8'字型排列而已。LED点阵与数码管一样,有共阴极和共阳级两张接法,不同的接法对应的电路结构不同。

  1. 共阳极:所有的LED阳极(正极)连接在一起,通常接到电源正极。点亮某个段时,需将相应的段的阴极(负极)接地 GND。
  2. 共阴极:所有的LED阴极(负极)连接在一起,通常接地。点亮某个段时,需将相应的段的阳极(正极)接电源正极。

在之前第四章数码管也提到的对应讲解:普中51单片机:数码管显示原理与实现详解(四)

74HC595移位寄存器

74HC595是一种常用的串行输入并行输出移位寄存器。它可以将串行数据转换为并行数据,从而控制多个LED。通过级联多个74HC595,可以控制更大规模的LED矩阵。LED点阵屏因为需要多个IO引脚,所以需要使用到74HC595芯片。

基本引脚作用

74HC595移位寄存器有三个主要引脚用于数据传输:

  • DS(数据输入):串行数据输入引脚。(引脚14)
  • SH_CP(移位时钟):每次时钟脉冲时,数据向移位寄存器中移位一位。(引脚11)
  • ST_CP(存储时钟):将移位寄存器中的数据锁存到输出寄存器中。(引脚12)

此外,还有一个 OE(输出使能) 13引脚,用于控制输出是否有效。具体根据电路图上的引脚序号进行查看和说明。在此博客中对74HC595芯片进行的讲解:深入解析74HC595移位寄存器的工作原理

级联工作原理

本次采用的时候16*16LED点阵屏作为演示,所以需要用到级联,级联工作原理与单独595芯片类似,主要分为四个步骤:

  1. 数据输入:数据通过串行输入引脚(SER)输入到第一个74HC595芯片的移位寄存器中。每个时钟脉冲(SCK)的上升沿会使移位寄存器中的数据向左移动一位,新的数据从SER输入。
  2. 数据移位:在每个时钟脉冲的上升沿,移位寄存器中的数据向左移动一位,新的数据从SER输入并进入移位寄存器的最低位。当移位寄存器填满8位数据后,继续输入的数据会从移位寄存器的最后一个位(Q7)挤出,并从串行数据出口引脚(引脚9)输出。
  3. 级联连接:将第一个74HC595芯片的串行数据出口引脚(引脚9)连接到下一个74HC595芯片的串行数据输入引脚(SER)。这样,第一个芯片移位寄存器中的数据在填满后,会自动通过引脚9传递到下一个芯片的移位寄存器中,形成级联。可以继续将下一个74HC595芯片的串行数据出口引脚连接到再下一个芯片的串行数据输入引脚,以此类推,实现多级级联。
  4. 数据锁存:当需要将移位寄存器中的数据输出到并行输出引脚时,通过输出寄存器时钟引脚(RCLK)提供一个上升沿的时钟信号。在RCLK的上升沿,移位寄存器中的数据被锁存到输出寄存器中,并通过并行输出引脚(Q0-Q7)输出。

通常将OE引脚接地(GND),确保输出引脚始终处于使能状态。低电平时使能输出,高电平时禁止输出。

电路图

博主使用的是四个74HC595芯片操作的LED点阵,操作原理相同,由74HC595电路图和LED点阵屏1616电路图可知第三片和第四片的74HC595芯片(级联)用于控制LED点阵屏1616的每一列的阴极(系统默认连接),行需要自行进行连接(第一片控制前八行的阳极,第二片控制后八行的阳极)。

  • LED点阵屏16*16电路图

在这里插入图片描述

  • 74HC595电路图

在这里插入图片描述

代码演示——16*16LED点阵屏轮播点亮每行LED

主函数中的两个循环分别控制LED点阵的前8行和后8行。每个循环中的 hc595_write_data 调用负责发送行数据和清零数据,以实现行的控制。

#include <REGX52.H>sbit SRCLK = P3^6;
sbit RCK = P3^5;
sbit SEK = P3^4;void DelayXms(unsigned int xms)	//@12.000MHz
{unsigned char data i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}
}void hc595_write_data(unsigned char dat1,unsigned char dat2,unsigned char dat3,unsigned char dat4)
{int i = 0;//第四片595for(i = 0;i < 8;i++){SEK = dat4>>7;dat4<<=1;SRCLK = 0;DelayXms(1);SRCLK = 1;//产生上升沿,进行移位DelayXms(1);}//第三片595for(i = 0;i < 8;i++){SEK = dat3>>7;dat3<<=1;SRCLK = 0;DelayXms(1);SRCLK = 1;//产生上升沿,进行移位DelayXms(1);}//第二片595for(i = 0;i < 8;i++){SEK = dat2>>7;dat2<<=1;SRCLK = 0;DelayXms(1);SRCLK = 1;//产生上升沿,进行移位DelayXms(1);}//第一片595for(i = 0;i < 8;i++){SEK = dat1>>7;dat1<<=1;SRCLK = 0;DelayXms(1);SRCLK = 1;//产生上升沿,进行移位DelayXms(1);}RCK = 0;SRCLK = 1;//产生上升沿,进行存储输出RCK = 1;
}unsigned char hc595_arrbuf[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};void main()
{unsigned int i = 0;while(1){for(i = 0;i < 8;i++)//1到8行{hc595_write_data(hc595_arrbuf[i],0x00,0x00,0x00);DelayXms(1000);		hc595_write_data(0x00,0x00,0x00,0x00);}for(i = 0;i < 8;i++)//8到16行{hc595_write_data(0x00,hc595_arrbuf[i],0x00,0x00);DelayXms(1000);		hc595_write_data(0x00,0x00,0x00,0x00);}}
}

代码演示——显示数字0

这段代码是用于控制LED点阵显示数字0的程序,因为是16*16的LED点阵屏使用了四个74HC595移位寄存器进行级联。hc595_col 数组定义了显示数字0的列数据,可以使用对应取模软件进行数据获取。在单片机编程中,_nop_() 是一个非常有用的内联函数,它的作用是执行一个空操作(No Operation)。简单来说,它不进行任何实质性的操作,但会消耗一个或多个机器周期的时间。用于进行纳秒级别延时。实物图连接:SRCLK 是移位寄存器时钟引脚,连接到P3.6。RCK 是存储寄存器时钟引脚,连接到P3.5。SEK 是串行数据输入引脚,连接到P3.4。显示汉字同理。

#include <REGX52.H>
#include <intrins.h>sbit SRCLK = P3^6;
sbit RCK = P3^5;
sbit SEK = P3^4;void DelayXms(unsigned int xms)	//@12.000MHz
{unsigned char data i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}
}void hc595_write_data(unsigned char dat1,unsigned char dat2,unsigned char dat3,unsigned char dat4)
{int i = 0;//第四片595for(i = 0;i < 8;i++){SEK = dat4>>7;dat4<<=1;SRCLK = 0;_nop_();SRCLK = 1;//产生上升沿,进行移位_nop_();}//第三片595for(i = 0;i < 8;i++){SEK = dat3>>7;dat3<<=1;SRCLK = 0;_nop_();SRCLK = 1;//产生上升沿,进行移位_nop_();}//第二片595for(i = 0;i < 8;i++){SEK = dat2>>7;dat2<<=1;SRCLK = 0;_nop_();SRCLK = 1;//产生上升沿,进行移位_nop_();}//第一片595for(i = 0;i < 8;i++){SEK = dat1>>7;dat1<<=1;SRCLK = 0;_nop_();SRCLK = 1;//产生上升沿,进行移位_nop_();}RCK = 0;SRCLK = 1;//产生上升沿,进行存储输出RCK = 1;
}
unsigned char hc595_col[] = {0x00,0x00,0x00,0x00,0xE0,0x07,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,
0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0xE0,0x07,0x00,0x00,0x00,0x00};
unsigned char hc595_row[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};void main()
{unsigned int i = 0;while(1){for(i = 0;i < 16;i++){hc595_write_data(hc595_row[i],hc595_row[i+16],~hc595_col[i*2],~hc595_col[i*2+1]);_nop_();;		hc595_write_data(0x00,0x00,0x00,0x00);}}
}

代码演示——16*16游动字幕显示

这段代码是游动字幕显示:Hello!字符,main 函数中的无限循环不断刷新LED矩阵的显示。通过 offset 变量控制动画的播放,每10次刷新后更新 offset,实现动画的循环播放。使用 code 关键字定义的数组存储在代码存储区,通常用于存储只读数据,如动画帧数据。MatrixLed_ShowColumn 函数根据列索引 column 决定如何显示数据。当列索引大于或等于8时,选择第9到16列;否则选择第1到8列。通过位操作选择特定的列。hc595_write_data 函数用于将数据发送到四片74HC595移位寄存器。每片595接收8位数据,通过控制 SEK 引脚发送数据位,SRCLK 引脚控制数据移位。

#include <REGX52.H>
#include <intrins.h>sbit SRCLK = P3^6;
sbit RCK = P3^5;
sbit SEK = P3^4;void hc595_write_data(unsigned char dat1,unsigned char dat2,unsigned char dat3,unsigned char dat4)
{int i = 0;//第四片595for(i = 0;i < 8;i++){SEK = dat4>>7;dat4<<=1;SRCLK = 0;_nop_();SRCLK = 1;//产生上升沿,进行移位_nop_();}//第三片595for(i = 0;i < 8;i++){SEK = dat3>>7;dat3<<=1;SRCLK = 0;_nop_();SRCLK = 1;//产生上升沿,进行移位_nop_();}//第二片595for(i = 0;i < 8;i++){SEK = dat2>>7;dat2<<=1;SRCLK = 0;_nop_();SRCLK = 1;//产生上升沿,进行移位_nop_();}//第一片595for(i = 0;i < 8;i++){SEK = dat1>>7;dat1<<=1;SRCLK = 0;_nop_();SRCLK = 1;//产生上升沿,进行移位_nop_();}RCK = 0;SRCLK = 1;//产生上升沿,进行存储输出RCK = 1;
}void MatrixLed_ShowColumn(unsigned char column,dat1,dat2)
{if(column >= 8){hc595_write_data(dat1,dat2,~0x00,~(0x01<<column - 8));	}else{hc595_write_data(dat1,dat2,~(0x01<<column),~0x00);}
}unsigned char code hc595_Animations_row1[] = {0x02,0xFC,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0xC0,0x20,0x10,0x10,0x10,0x20,0x40,0x80,0x00,0x04,0xF8,0x00,0x00,0x00,0x00,0x00,0x04,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x40,0x40,0x40,0x80,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00};
unsigned char code hc595_Animations_row2[] = {0x20,0x1F,0x00,0x00,0x00,0x00,0x1F,0x20,0x00,0x07,0x19,0x21,0x21,0x21,0x21,0x11,0x08,0x00,0x00,0x1F,0x20,0x20,0x10,0x00,0x00,0x00,0x1F,0x20,0x20,0x10,0x00,0x00,0x0F,0x10,0x20,0x20,0x20,0x20,0x10,0x0F,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x00};void main()
{unsigned char i,offset = 0,count = 0;//0到15分别对应1到16列while(1){for(i = 0;i < 16;i++){MatrixLed_ShowColumn(i,hc595_Animations_row1[i+offset],hc595_Animations_row2[i+offset]);}count++;if(count>=10){count = 0;offset++;if(offset == 32){offset = 0;	}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/380253.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P1-AI产品经理--九五小庞

产品经理的定位 AI基于现有业务挖掘AI应用场景&#xff0c;服务提供商选择及算法定制等&#xff0c;配合已有产品完成整体产品工工资基于从事医疗行业的考虑&#xff0c;我们走的应该是AI产品经理&#xff08;软件型&#xff09; AI产品经理&#xff08;行业型&#xff09; AI…

《0基础》学习Python——第十九讲__爬虫\<2>

一、用get请求爬取一般网页 首先由上节课我们可以找到URL、请求方式、User-Agent以及content-type 即&#xff1a;在所在浏览器页面按下F12键&#xff0c;之后点击网路-刷新&#xff0c;找到第一条双击打开标头即可查看上述所有内容&#xff0c;将上述URL、User-Agent所对应的…

Tita的OKR:高端制造行业的OKR案例

高端设备制造行业的发展趋势&#xff1a; 产业规模持续扩大&#xff1a;在高技术制造业方面&#xff0c;航空、航天器及设备制造业、电子工业专用设备制造等保持较快增长。新能源汽车保持产销双增&#xff0c;新材料新产品生产也高速增长。 标志性装备不断突破&#xff1a;例如…

【Linux网络】epoll模型构建Reactor_Tcp服务器{协议/客户端/bind/智能指针}

文章目录 1.std::enable_shared_from_this<TcpServer>2.std::bind3.std::make_shared4.std::shared_ptrstd::shared_ptr 和 std::weak_ptr配合使用 5.剖析代码6.整体代码Calculator.hppClientCal.ccCMakeLists.txtCommon.hppEpoller.hppLog.hppMain.ccnocopy.hppProtocol…

Qt实现仿微信在线聊天工具(服务器、客户端)V1_ 04

上一篇实现了客户端与服务器的通信,这一篇继续实现相关功能 本章内容 服务器与数据库的连接通信格式的规范登录信息的验证 1.数据库的建立 这里连接的是Mysql8.0数据库,如果想要简单点可以直接用sqlite3数据库,调用逻辑基本差不多,数据库语法也基本一致。 在服务器工程里…

[数据集][目标检测]拐杖检测数据集VOC+YOLO格式2778张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2778 标注数量(xml文件个数)&#xff1a;2778 标注数量(txt文件个数)&#xff1a;2778 标注…

EasyExcel 学习之 导出 “WPS 表格在试图打开文件时遇到错误”

目录 1. 版本2. 现象2.1. Postman 文件下载成功且 WPS 可以正常打开2.2. VUE 下载成功但 WPS 无法打开 3. 原因:前端未指定 responseType4. 常见问题4.1. NoSuchMethodError4.1.1. org.apache.logging.log4j.LogBuilder org.apache.logging.log4j.Logger.atTrace()4.1.2. Could…

Java后端开发(十五)-- Ubuntu 开启activemq开机自启动功能

目录 1. 修改Wrapper.conf文件配置内容 2. 在/etc/systemd/system目录下创建activemq.service文件 3. 重启服务器,验证是否生效 4. 系统启动目标问题 操作环境: 1、Ubuntu 22.04.4 LTS (GNU/Linux 6.5.0-28-generic x86_64) 2、jdk17.0.11 3、apache-activemq-6.0.1 1. 修…

JDBC技术

JDBC提供了在Java程序中直接访问数据库的功能 JDBC连接数据库之前必须先装载特定厂商提供的数据库驱动程序&#xff08;Driver&#xff09;&#xff0c;通过JDBC的API访问数据库。有了JDBC技术&#xff0c;就不必为访问Mysql数据库专门写一个程序&#xff0c;为访问Oracle又专门…

vue2.0结合使用 el-scrollbar 和 v-for实现一个横向滚动的元素列表,并且能够自动滚动到指定元素(开箱即用)

效果图&#xff1a; 代码&#xff1a; <div class"gas-mode-item-body"><el-scrollbar style"width: 300px;height: 100%;" wrap-style"overflow-y:hidden" ref"scrollbarRef"><div style"display: flex&quo…

netcat 使用

GPT-4o (OpenAI) Netcat (通常缩写为nc) 是一个功能强大的网络工具&#xff0c;可以方便地读写网络连接。它被广泛用于漏洞测试、网络调试和数据传输。Netcat 可以作为客户端&#xff0c;也可以作为服务器使用。 以下是一些常见的 Netcat 用法&#xff1a;基础用法 连接到服务…

wps office 2019 Pro Plus 集成序列号Vba安装版教程

前言 wps office 2019专业增强版含无云版是一款非常方便的办公软件&#xff0c;我们在日常的工作中总会碰到需要使用WPS的时候&#xff0c;它能为我们提供更好的文档编写帮助我们更好的去阅读PDF等多种格式的文档&#xff0c;使用起来非常的快捷方便。使用某银行专业增强版制作…

IDEA中常用的快捷键

《IDEA破解、配置、使用技巧与实战教程》系列文章目录 第一章 IDEA破解与HelloWorld的实战编写 第二章 IDEA的详细设置 第三章 IDEA的工程与模块管理 第四章 IDEA的常见代码模板的使用 第五章 IDEA中常用的快捷键 第六章 IDEA的断点调试&#xff08;Debug&#xff09; 第七章 …

计算机网络入门 -- 常用网络协议

计算机网络入门 – 常用网络协议 1.分类 1.1 模型回顾 计算机网络细分可以划为七层模型&#xff0c;分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。而上三层可以划为应用层中。 1.2 分类 1.2.1 应用层 为用户的应用进程提供网络通信服务&#xff0…

复现Android中GridView的bug并解决

几年前的一个bug&#xff0c;GridView的item高度不一致。如下图&#xff1a; 复现bug的代码&#xff1a; import android.os.Bundle; import android.widget.BaseAdapter; import android.widget.GridView; import androidx.appcompat.app.AppCompatActivity; import java.uti…

buu做题(5)

目录 [GXYCTF2019]禁止套娃 方法一: 方法二: [NCTF2019]Fake XML cookbook [GXYCTF2019]禁止套娃 页面里啥也没有 使用dirsearch 扫一下目录 发现有 git 使用工具githack拉取源码 <?php include "flag.php"; echo "flag在哪里呢&#xff1f;<br&g…

【HarmonyOS学习】定位相关知识(Locationkit)

简介 LocationKit提供了定位服务、地理围栏、地理编码、逆地理编码和国家码等功能。 可以实现点击获取用户位置信息、持续获取位置信息和区域进出监控等多项功能。 需要注意&#xff0c;需要确定用户已经开启定位信息&#xff0c;一下的代码没有做这一步的操作&#xff0c;默…

数据分析入门指南:数据库入门(五)

本文将总结CDA认证考试中数据库中部分知识点&#xff0c;内容来源于《CDA模拟题库与备考资料PPT》 。 CDA认证&#xff0c;作为源自中国、面向全球的专业技能认证&#xff0c;覆盖金融、电信、零售、制造、能源、医疗医药、旅游、咨询等多个行业&#xff0c;旨在培养能够胜任数…

仿源码大师主界面UI的iAPP源文件

仿源码大师首页主界面的布局 首页&#xff0c;分类&#xff0c;需求&#xff0c;我的 就只有这几个界面内容而已 资源静态 没有任何动画和功能 纯UI布局 纯UI布局 他的最新版已经不是这个UI布局 放心使用 以学习参考为目的&#xff0c;如有不妥望告知 原创&#xff0c;纯…

一个非常好的美图展示网站整站打包源码,集成了wordpress和开源版ripro主题,可以完美运营。

一个非常好的美图展示网站整站打包源码&#xff0c;集成了wordpress和开源版ripro主题&#xff0c;可以完美运营。 自带了5个多g的美图资源&#xff0c;让网站内容看起来非常大气丰富&#xff0c;可以快速投入运营。 这个代码包&#xff0c;原网站已经稳定运营多年&#xff0…