【51单片机】LED点阵屏 原理 + 使用
学习使用的开发板:STC89C52RC/LE52RC
编程软件:Keil5
烧录软件:stc-isp
开发板实图:

文章目录
- LED点阵屏
- 显示原理
- 74HC595
- 编码
- LED点阵屏显示笑脸
- LED点阵屏显示动画
LED点阵屏
点阵屏在开发板的右上角,注意使用前需要将左侧的跳线帽短接左边两个,才能连通点阵屏的线路

LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字,图片,视频等。LED点阵屏广泛应用于各种公共场合,如骑车报站器、广告屏以及公告牌等
LED点阵屏分类
- 按颜色:单色(红色)、双色(红色 + 绿色)、全彩。双色其实可以显示三种颜色,因为红色和绿色混合可以产生黄色。全彩是使用三原色——红绿蓝,按比例混合出其他颜色
- 按像素:8 * 8、16 * 16等(大规模的LED点阵通常由很多个小点阵拼接而成)

显示原理
LED点阵屏的结构类似于数码管,不过数码管把每一列像素以 “8” 字型排列。数码管的介绍可参看【51单片机】数码管
原理图如下:

通过矩阵排列的方式,控制 8 * 8 个 LED,仅需要 8 + 8 = 16 个 I/O口
其中, D0 ~ D7 控制 LED 的阳极,P00 ~ P07控制 LED 的阴极。想让一个LED亮,必须阳极阴极连通,例如想让最左上角的 LED 亮起,则D7 = 1 && P07 = 0
LED点阵屏有共阴和共阳两种解法,不同解法对应的电路结构不同,例如如下双色点阵屏

其中,RED 和 GREEN 共用同一个阳极,各自有不同的阴极,这就是共阳极解法
LED点阵屏需要进行逐行或逐列扫描,才能使所有LED同时显示
74HC595
本篇博客采用列扫描的方式,控制点阵屏
列扫描就是固定P0串口,通过输入不同的D0 ~ D7,显示一列 LED灯
但我们不能直接操作D0 ~ D7,需要借助74HC595
- 74HC595 是
串行输入并行输出的移位寄存器,可用3根线输入串行数据,8根线输出并行数据,多片级联后,可输出16位, 24位,32位等,常用于I/O口扩展
因为我们想要一次输出一列数据,74HC595的并行输出刚好符合我们的需求
原理图如下:

74HC595 通过控制 QA、QB…间接控制 D0 ~ D7
74HC595 寄存器内部原理图如下:

图中输入的数据,从高位到低位为:1010 0000
- SER:输入口,输入1位数据
- SERCLK:上升沿移位,当SERCLK = 1 时,寄存器中的数字会向下移1位,SER的数据会被移入寄存器
- RCLK:上升沿锁存,当 RCLK = 1 时,当前移位寄存器的 8 位数据会被并行输入到 QA ~ QH
输入数据的过程如下:

注意:此处控制的是D0 ~ D7,LED的阳极,给1才会亮
编码
LED点阵屏显示笑脸
可位寻址/不可位寻址:在单片机系统中,操作任意寄存器或者某一位的数据时,必须给出其物理地址,又因为一个寄存器里有8位,所以位的数量是寄存器数量的8倍,单片机无法对所有位进行编码,故每8个寄存器中,只有一个是可以位寻址的。对不可位寻址的寄存器,若要只操作其中一位而不影响其他位,可用 " &= “、” |= “、” ^= " 的方法进行位操作
- sft(special function register):特殊功能寄存器说明
- 例:
sft P0 = 0x80;声明P0口寄存器,物理地址为0x80
- 例:
- sbit(special bit):特殊位声明
- 例:
sbit P0_1 = 0x81 或 sbit P0_1 = P0^1声明P0寄存器的第1位
- 例:
74HC595 写入一个字节数据逻辑如下:
#include <REGX52.h>
//P3^5表示P3的第5位
sbit MatrixLED_SER = P3^4; //SER, 写入的1位数据
sbit MatrixLED_RCLK = P3^5; //RCLK, 上升沿锁存,置1发送8位数据
sbit MatrixLED_SRCLK = P3^6; //SRCLK, 上升沿移位,置1数据往下移//点阵屏列选择的寄存器
#define MatrixLEDColumn P0/*** @brief 74HC595发送一个字节数据,可控制点阵屏的行* @parm Byte:要发送的字节数据* @retval 无*/
void _74HC595_WriteByte(unsigned char Byte)
{int i = 0;for(i = 0; i < 8; ++i){MatrixLED_SER = Byte & (0x80 >> i);MatrixLED_SRCLK = 1;//数据移位MatrixLED_SRCLK = 0;}MatrixLED_RCLK = 1;//发送数据MatrixLED_RCLK = 0;
}
接下来控制P0,就可以显示指定列了
/*** @brief LED点阵屏显示一列数据* @parm Column: 要显示的列,控制点阵屏的列* @parm Data: 写入74HC595的数据,控制点阵屏的行* @retval 无*/
void MatrixLED_ShowColumn(unsigned char Column, unsigned char Data)
{_74HC595_WriteByte(Data);MatrixLEDColumn = ~(0x80 >> Column);Delayms(1);MatrixLEDColumn = 0xFF;//消影
}
完整代码如下:
延迟器模块
Delay.h
#ifndef __DELAY_H__
#define __DELAT_H__void Delayms(unsigned int xms);//等待指定毫秒#endif
Delay.c
#include <INTRINS.h>
/*** @brief 延迟一定时间* @parm 延迟的时间,单位是毫秒,范围:0 ~ 65535* @retval 无*/
void Delayms(unsigned int xms)
{unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}
}
点阵屏模块
MatrixLED.h
#ifndef __MATRIXLED_H__
#define __MATRIXLED_H__void MatrixLED_ShowColumn(unsigned char Column, unsigned char Data);
void MatrixLED_Init();#endif
MatrixLED.c
#include <REGX52.h>
#include "Delay.h"//P3^5表示P3的第5位
sbit MatrixLED_SER = P3^4; //SER, 写入的1位数据
sbit MatrixLED_RCLK = P3^5; //RCLK, 上升沿锁存,置1发送8位数据
sbit MatrixLED_SRCLK = P3^6; //SRCLK, 上升沿移位,置1数据往下移//点阵屏列选择的寄存器
#define MatrixLEDColumn P0/*** @brief 74HC595发送一个字节数据,可控制点阵屏的行* @parm Byte:要发送的字节数据* @retval 无*/
void _74HC595_WriteByte(unsigned char Byte)
{int i = 0;for(i = 0; i < 8; ++i){MatrixLED_SER = Byte & (0x80 >> i);MatrixLED_SRCLK = 1;//数据移位MatrixLED_SRCLK = 0;}MatrixLED_RCLK = 1;//发送数据MatrixLED_RCLK = 0;
}/*** @brief LED点阵屏显示一列数据* @parm Column: 要显示的列,控制点阵屏的列* @parm Data: 写入74HC595的数据,控制点阵屏的行* @retval 无*/
void MatrixLED_ShowColumn(unsigned char Column, unsigned char Data)
{_74HC595_WriteByte(Data);MatrixLEDColumn = ~(0x80 >> Column);Delayms(1);MatrixLEDColumn = 0xFF;//消影
}
/*** @brief 初始化74HC595,初始化点阵屏* @parm 无* @retval 无*/
void MatrixLED_Init()
{MatrixLED_RCLK = 0;MatrixLED_SRCLK = 0;
}
主程序——循环显示笑脸
main.cc
#include <REGX52.h>
#include <INTRINS.h>
#include "Delay.h"
#include "MatrixLED.h"void main()
{MatrixLED_Init();while(1){//显示笑脸MatrixLED_ShowColumn(0, 0x3C);MatrixLED_ShowColumn(1, 0x42);MatrixLED_ShowColumn(2, 0xA9);MatrixLED_ShowColumn(3, 0x85);MatrixLED_ShowColumn(4, 0x85);MatrixLED_ShowColumn(5, 0xA9);MatrixLED_ShowColumn(6, 0x42);MatrixLED_ShowColumn(7, 0x3C);}
}
完整项目链接:Gitee:LED点阵屏显示笑脸
效果如下:

LED点阵屏显示动画
此处暂不讲解,项目链接:Gitee:LED点阵屏显示动画
效果如下:
显示变化的笑脸
LED点阵屏显示动画——变化笑脸
动画显示Hello!!!
LED点阵屏显示动画——Hello!!!
以上就是本篇博客的所有内容,感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。

相关文章:
【51单片机】LED点阵屏 原理 + 使用
学习使用的开发板:STC89C52RC/LE52RC 编程软件:Keil5 烧录软件:stc-isp 开发板实图: 文章目录 LED点阵屏显示原理74HC595 编码LED点阵屏显示笑脸LED点阵屏显示动画 LED点阵屏 点阵屏在开发板的右上角,注意使用前需要…...
Java基于SpringBoot+Vue的宠物共享平台的设计与实现(附源码,文档)
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
【案例】Excel使用宏来批量插入图片
一、场景介绍 我有一个excel文件,需要通过一列的文件名称,按照规则给批量上传图片附件。 原始文件: 成功后文件: 二、实现方法 1. 使用【wps】工具打开Excel文件,将其保存为启用宏的文件。 2.找到编辑宏的【VB编辑器…...
报名开启|开放原子大赛“Rust数据结构与算法学习赛”
开放原子大赛“Rust数据结构与算法学习赛”报名进行中,报名截止时间为11月17日。 为了进一步促进开源技术的发展,提升国内开源社区的创新能力和国际影响力,开放原子开源基金会与清华大学开源操作系统训练营等单位,共同举办本次Rus…...
[翻译] 创始人模式(Founder Mode)
Founder Mode 上周在一次YC活动中,Brian Chesky发表了一场在场的每个人都难以忘怀的演讲。会后,我与大多数创始人交流时,他们都表示这是他们听过的最好的演讲。连Ron Conway也第一次忘记了记笔记。我不会试图在这里复述演讲内容,…...
拓扑排序(C++类封装+数组模拟队列和邻接表)
拓扑序列 对于任何无回路的AOV网,其顶点均可排成拓扑序列,并且其拓扑序列未必唯一。步骤如下: 1.从网中选择一个入度为0的顶点且输出。 2.从网中删除该顶点及其所有出边。 3.执行1,2,直至所有顶点已输出࿰…...
FP独立站引流革命:GG斗篷技术解锁流量新策略
在跨境电商领域,FP独立站的运营者们面临着一个共同的挑战:如何在遵守平台规则的同时,有效地吸引和保持流量。传统的引流方法如SEM、SEO、邮件推广和社交媒体营销,对于FP独立站来说,往往效果有限。但现在,一…...
管道(Pipes)、过滤器(Filters)和拦截器(Interceptors)
在Java中,管道(Pipes)、过滤器(Filters)和拦截器(Interceptors)是三种不同的概念,它们在应用中的作用和实现方式有所不同。以下是它们之间的主要区别: 一、管道…...
uniapp组件样式运行至小程序失效
文章目录 一、uniapp样式穿透打包运行至微信小程序失效 一、uniapp样式穿透打包运行至微信小程序失效 组件样式隔离文章参考 解决方案 options: {styleIsolation: "shared",},这个配置项改变了小程序组件的样式隔离模式,使得组件的样式能够共享和继承。…...
认识鸿蒙系统
鸿蒙系统作为华为推出的操作系统,近年来在智能手机、智能穿戴、车载和家居等多个领域取得了显著的发展。其独特的分布式技术、高性能和安全性等特点,使其在与安卓和iOS的竞争中逐渐崭露头角,有望形成三足鼎立之势。 从开发者角度来看&#x…...
Docker Compose部署Rabbitmq(Dockerfile安装延迟队列)
整个工具的代码都在Gitee或者Github地址内 gitee:solomon-parent: 这个项目主要是总结了工作上遇到的问题以及学习一些框架用于整合例如:rabbitMq、reids、Mqtt、S3协议的文件服务器、mongodb github:GitHub - ZeroNing/solomon-parent: 这个项目主要是…...
硬件基础06 滤波器——无源、有源(含Filter Solutions、Filter Pro、MATLAB Fdatool)
目录 一、Filter Solutions 1、软件资源及安装教程如下 2、使用相关内容 二、Filter Pro使用 1、软件资源及安装教程如下 2、使用相关内容 三、MATLAB Fdatool 1、在matlab命令中输入fdatool 2、输入相关参数,例如低通、FIR、20阶、hamming窗 3、调用 &am…...
shopify模块新增内容或图片
1、后台找到指定的liquid页面,在该页面下方{% schema %} 新增需求 2、添加轮播图功能 {% comment %} 轮播代码 {% endcomment %}{% if block.settings.enable_slider %}<divclass"size-guide-slider swiper"data-slides-per-view"{{ block.setti…...
【EMNLP2024】基于多轮课程学习的大语言模型蒸馏算法 TAPIR
近日,阿里云人工智能平台PAI与复旦大学王鹏教授团队合作,在自然语言处理顶级会议EMNLP 2024 上发表论文《Distilling Instruction-following Abilities of Large Language Models with Task-aware Curriculum Planning》。文章提出了一个名为 TAPIR 的知…...
置信传播算法复现
本文所涉及所有资源均在 传知代码平台 可获取。 目录 一.背景及意义介绍 1. 实际应用广泛 2. 理论研究重要性...
【在Linux世界中追寻伟大的One Piece】poll代码改写
目录 1 -> poll代码改写 1 -> poll代码改写 结合select代码,将select server更改成为pollserver,不是一件困难的事情。 #pragma once#include <iostream> #include <string> #include <poll.h> #include <memory> #inc…...
C++builder中的人工智能(17):神经网络中的自我规则非单调(Mish)激活函数
在这篇文章中,我们将探讨自我规则非单调激活函数——Mish在神经网络中的应用。了解Mish函数的工作原理,将有助于您在使用C IDE构建C应用程序时更加得心应手。 目录 神经网络中的激活函数是什么?能在C中创建激活函数吗?自我规则非…...
Java 的 Scanner 类:控制台输入与文件扫描
Java 的 Scanner 类是一个非常方便的工具类,主要用于从控制台或文件中扫描输入数据。虽然它也可以用于扫描文件内容,但我们通常更喜欢它用于控制台输入,因为扫描文件可以通过文件流来完成。接下来,我们将通过几个简单的示例来讲解…...
使用纯HTML和CSS绘制圣诞树:打造网页中的冬日奇景
### HTML & CSS 实现节日圣诞树:一步步打造你的冬季主题网页 在这篇文章中,我们将使用纯HTML和CSS创建一棵节日圣诞树。通过简单的代码,您可以在网页上实现一棵带有星星、彩球装饰的圣诞树,为网站增添节日氛围。 ### 实现思…...
深度学习-图像评分实验(TensorFlow框架运用、读取处理图片、模型建构)
目录 0、实验准备 ①实验环境 ②需要下载的安装包 ③注意事项(很关键,否则后面内容看不懂) ④容易出现的问题 1、查看数据并读取数据。 2、PIL库里的Image包进行读取(.resize更改图片尺寸,并将原始数据归一化处…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
