【51单片机】LED点阵屏(江科大)
9.1LED点阵屏
1.LED点阵屏介绍
LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等。
2.LED点阵屏工作原理
LED点阵屏的结构类似于数码管,只不过是数码管把每一列的像素以“8”字型排列而已。原理图如下

每一行的阳极连在一起,每一列的阴极连在一起
LED点阵屏需要进行逐行或逐列扫描(扫描的速度很快),才能使所有LED同时显示
例如,要想显示第二行第二列的LED灯,只需将DPg置1,其余行置0,P06置0,其余列置1,即可
尽管使用8*8的矩阵来控制64个LED等,但16个10口还是比较多的,并且也不能直接使用16个10口,因为本单片机IO口输出是弱上拉的,
输出高电平的电流较小,输出低电平的电流较大(正常),所以如果直接用16个10口的话,LED点阵屏的每一行的输出的电流较小,会使每个的灯光较暗。
于是本开发板使用了74HC595模块来控制A1-A8这8行的I0口,74HC595模块原理图如下,使用P34、P35、P36三个10口来控制8个10口
的输出。J24模块在LED点阵屏的左上方。
3.74HC595

74HC595是串行输入并行输出的移位寄存器,可用3根线输入串行数据,8根线输出并行数据,多片级联后,可输出16位、24位、32位
等,常用于IO口扩展。
OE:输出使能,低电平有效,接GND,即使用跳线帽将J24的OE和GND连起来
RCLK:寄存器时钟
SRCLR:串行清零,接VCC,表示不清空数据
SRCLK:串行时钟,用于输入串行数据
SER: 串行数据输入端
QH’:用于多片级联,接到下一个74HC595的SER口
74HC595工作原理:
74HC595工作原理简图如下:

该模块可用于数据串行输入,并行输出
左边是个移位寄存器,SER输入一位数据,SERCLK在上升沿到来时,将移位寄存器的数据向下移动一位,之后SER再输入一位数据,在SERCLK时钟的上升沿时移位,数据填满移位寄存器后,在RCLK的上升沿到来时,将该寄存器的数据复制到右边的数据缓冲寄存器中,即为输出的数据。同时数据也可以通过QH‘输出到下一个74HC595的SER口作为串行数据输入。
4.开发板引脚对应关系

LED点阵屏的列直接接在IO口上,通过P0口直接输入,行通过74HC595来进行数据输入
9.2LED点阵屏显示图形
C51的sfr、sbit
·sfr (special function register):特殊功能寄存器声明
例:sfr PO=0x80;
声明P0口寄存器,物理地址为0x80
·sbit(special bit):特殊位声明
例:sbit P0_1=0x81;或 sbit P0_1=P0^1;
声明P0寄存器的第1位
·可位寻址/不可位寻址:在单片机系统中,操作任意寄存器或者某一位的数据时,必须给出其物理地址,又因为一个寄存器里有8位,所
以位的数量是寄存器数量的8倍,单片机无法对所有位进行编码,故每8个寄存器中,只有一个是可以位寻址的。对不可位寻址的寄存器,
若要只操作其中一位而不影响其它位时,可用“&=”、“=”、“A=”的方法进行位操作
1、位声明
根据原理图,将IO口进行位声明,方面之后使用

2、74HC595写入字节函数

当i=0时,0x80为1000 0000,Byte第一位为1,SER为1;第一位为0,SER为0,即写入第一位
当i=1时,0x80>>i为0100 0000,Byte第二位为1,SER为1;第二位为0,SER为0,即写入第二位
…
SCK=1为上升沿,Byte每写入一位,向下移动一位
RCK=1为上升沿,将八位数据送到IO口
3、显示数据函数

为了消除残影,需要在函数的最后进行P0口的清零
如果想要进行扫描的话,也需要进行消影,和数码管的操作类似(之前我们说数码管进行段选-位选-段选-位选-段选-位选的过程中,刚把下一位段选送入的时候,它会把这个段选送到上一位选,因为上一位的位选还没来得及改变,产生串位的现象,也就是残影的问题)
那么我们需要加一个过程,就是位选后,位选清零。
于是就变成段选-位选-位清零-段选-位选 -位清零-段选-位选
顺便加一段延时过程
段选-位选-延时-位清零-段选-位选-延时-位清零-段选-位选
这样即使它发生串位也是串到了位清零的时刻,但是位清零什么都没有显示,这样就能达到消影的效果。
4、LED点阵屏显示笑脸
main.c
#include <REGX52.H>
#include "Delay.h"sbit RCK=P3^5; //RCLK
sbit SCK=P3^6; //SRCLK
sbit SER=P3^4; //SER#define MATRIX_LED_PORT P0/*** @brief 74HC595写入一个字节* @param Byte 要写入的字节* @retval 无*/
void _74HC595_WriteByte(unsigned char Byte)
{unsigned char i;for(i=0;i<8;i++){SER=Byte&(0x80>>i);SCK=1;SCK=0;}RCK=1;RCK=0;
}/*** @brief LED点阵屏显示一列数据* @param Column 要选择的列,范围:0~7,0在最左边* @param Data 选择列显示的数据,高位在上,1为亮,0为灭* @retval 无*/
void MatrixLED_ShowColumn(unsigned char Column,Data)
{_74HC595_WriteByte(Data);P0=~(0x80>>Column);Delay(1);P0=0xFF;
}void main()
{SCK=0;RCK=0;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);}
}
9.3LED点阵屏显示动画
1、模块化
MatrixLED.c
#include <REGX52.H>
#include "Delay.h"sbit RCK=P3^5; //RCLK
sbit SCK=P3^6; //SRCLK
sbit SER=P3^4; //SER#define MATRIX_LED_PORT P0/*** @brief 74HC595写入一个字节* @param Byte 要写入的字节* @retval 无*/
void _74HC595_WriteByte(unsigned char Byte)
{unsigned char i;for(i=0;i<8;i++){SER=Byte&(0x80>>i);SCK=1;SCK=0;}RCK=1;RCK=0;
}/*** @brief 点阵屏初始化* @param 无* @retval 无*/
void MatrixLED_Init()
{SCK=0;RCK=0;
}/*** @brief LED点阵屏显示一列数据* @param Column 要选择的列,范围:0~7,0在最左边* @param Data 选择列显示的数据,高位在上,1为亮,0为灭* @retval 无*/
void MatrixLED_ShowColumn(unsigned char Column,Data)
{_74HC595_WriteByte(Data);MATRIX_LED_PORT=~(0x80>>Column);Delay(1);MATRIX_LED_PORT=0xFF;
}
MatrixLED.h
#ifndef __MATRIX_LED_H__
#define __MATRIX_LED_H__void MatrixLED_Init();
void MatrixLED_ShowColumn(unsigned char Column,Data);#endif
2、利用文字取模软件生成图像数据
点击“基本操作”,再点击“新建图像”,高度选8,宽度随意,这里选32
之后点击“参数设置”,再点击“其他选项”,在这里选择纵向取模,不选择字节倒序,其余不变
点击“模拟动画”,再点击“放大格点”,将图像进行放大
描绘自己想要的图像
点击“取模方式“,选择C51格式,将生成的数据保存
3、保存图像数据
将数据保存在数组中,数组的每一个元素表示一列LED的数据

main.c
#include <REGX52.H>
#include "Delay.h"
#include "MatrixLED.h"//动画数据
unsigned char code Animation[]={0x3C,0x42,0xA9,0x85,0x85,0xA9,0x42,0x3C,0x3C,0x42,0xA1,0x85,0x85,0xA1,0x42,0x3C,0x3C,0x42,0xA5,0x89,0x89,0xA5,0x42,0x3C,
};void main()
{unsigned char i,Offset=0,Count=0;MatrixLED_Init();while(1){for(i=0;i<8;i++) //循环8次,显示8列数据{MatrixLED_ShowColumn(i,Animation[i+Offset]);}Count++; //计次延时if(Count>15){Count=0;Offset+=8; //偏移+8,切换下一帧画面if(Offset>16){Offset=0;}}}
}
Animation数组是存储在RAM中,当要显示的图像很多时,数据量会很大,RAM可能会不够,所以可以将数据保存在Flash里面,
在char后面添加一个code就行。但是定义之后便不能更改(ROM的特性)。
unsigned char code Animation[]={};
相关文章:
【51单片机】LED点阵屏(江科大)
9.1LED点阵屏 1.LED点阵屏介绍 LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等。 2.LED点阵屏工作原理 LED点阵屏的结构类似于数码管,只不过是数码管把每一列的像素以“8”字型排列而已。原理图如下 每一行的阳极连在一起,每一列…...
Microsoft OneNote 图片文字提取
Microsoft OneNote 图片文字提取 1. 文件 -> 新建 -> 我的电脑 -> 名称 -> 位置 -> 创建笔记本2. 插入图片3. 复制图片中的文本References 1. 文件 -> 新建 -> 我的电脑 -> 名称 -> 位置 -> 创建笔记本 2. 插入图片 3. 复制图片…...
Linux系统安全——iptables相关总结
在使用iptables时注意要先关闭firewalld(systemctl stop firewalld.service) 1.查看iptables规则 iptables -vnL 选项含义-v查看时显示更多详细信息-n所有字段以数字形式显示-L查看规则列表 例,拒绝来自192.168.241.22的源地址 直接丢弃 …...
深度学习(14)--x.view()详解
在torch中,常用view()函数来改变tensor的形状 查询官方文档: torch.Tensor.view — PyTorch 2.2 documentationhttps://pytorch.org/docs/stable/generated/torch.Tensor.view.html#torch.Tensor.view示例 1.创建一个4x4的二维数组进行测试 x torch.…...
最新wordpress外贸主题
日用百货wordpress外贸主题 蓝色大气的wordpress外贸主题,适合做日用百货的外贸公司搭建跨境电商网站使用。 https://www.jianzhanpress.com/?p5248 添加剂wordpress外贸建站主题 橙色wordpress外贸建站主题,适合做食品添加剂或化工添加剂的外贸公司…...
Spring Cloud Gateway:使用RestController动态更新路由
相关类介绍 动态路由(自己控制,非注册中心控制)涉及两个很重要的Bean: RouteDefinitionWriter:用于添加、修改、删除路由规则。RouteDefinitionLocator:用于查询路由规则。 以及一个相关事件:…...
用Python动态展示排序算法
文章目录 选择冒泡插入排序归并排序希尔排序 经常看到这种算法可视化的图片,但往往做不到和画图的人心灵相通,所以想自己画一下,本文主要实现归并排序和希尔排序,如果想实现其他算法可参考这篇 C语言实现各种排序算法[选择&#x…...
vscode代码快捷键
1、 log console.log()2、edf export default (first)>{ second } 或者 export default function(params)>{ }可以使用tab键切换修改项 3、ednf export default function first(second) {third}4、! 生成html模板 5、div#app <div id"app"></di…...
深入了解C++:形参、内联、重载、引用、const和指针、new和delete
形参带默认值的函数 1.给默认值的时候从右向左给。 2.定义出可以给形参默认值,声明也可以给形参默认值。 3.形参默认值只能出现一次。 4.参数调用的效率问题 #sum(10,20)对应了五条汇编指令 mov eax,dword ptr[ebp-8] push eax mov ecx dword ptr[ebp-4] push …...
Linux 目录结构结构
Linux 目录结构结构 概念 Linux 没有 C、D、E...盘符,只有一个目录树。通过挂载,将不同的磁盘挂载到目录树下,通过目录访问磁盘。 不同目录的作用 目录存放内容/作用/根目录,目录树的起点,存放所有文件。…...
C++基础入门:掌握核心概念(超全!)
C作为一门广泛使用的编程语言,以其高性能和灵活性在软件开发领域占据重要地位。无论是游戏开发、系统编程还是实时应用,C都是一个不可或缺的工具。本博客旨在为初学者提供C编程语言的核心概念,帮助你建立坚实的基础。 C关键字 C关键字是编程…...
Linux第47步_安装支持linux的第三方库和mkimage工具
安装支持linux的第三方库和mkimage工具,做好移植前的准备工作。 编译linux内核之前,需要先在 ubuntu上安装“lzop库”和“libssl-dev库”,否则内核编译会失败。 mkimage工具会在zImage镜像文件的前面添加0x40个字节的头部信息,就可以得到uI…...
数据工程工程师学习路线图
数据工程岗位要求 Skill Sets required: - Hands on experience enabling data via Adobe Analytics and/or Google Analytics - Understanding of how customer level data is captured and stitched with behavioural data - Experience working with Testing (QA) and D…...
MySQL主从同步与分库分表
分库分表...
百度PaddleOCR字符识别推理部署(C++)
1 环境 1.opencv(https://sourceforge.net/projects/opencvlibrary/) 2.cmake(https://cmake.org/download/) 3.vs2019((https://github.com/PaddlePaddle/PaddleOCR/tree/release/2.1) 4.paddleOCR项目-建议2.0(http…...
C++ Qt框架开发 | 基于Qt框架开发实时成绩显示排序系统(2)折线图显示
对上一篇的工作C学习笔记 | 基于Qt框架开发实时成绩显示排序系统1-CSDN博客继续优化,增加一个显示运动员每组成绩的折线图。 1)在Qt Creator的项目文件(.pro文件)中添加对Qt Charts模块的支持: QT charts 2…...
Microsoft Excel 加载数据分析工具
Microsoft Excel 加载数据分析工具 1. 打开 Excel,文件 -> 选项2. 加载项 -> 转到…3. 分析工具库、分析工具库 - VBA4. 打开 Excel,数据 -> 数据分析References 1. 打开 Excel,文件 -> 选项 2. 加载项 -> 转到… 3…...
Day32 贪心算法part02
买卖股票的最佳时机 太牛了我,随随便便双指针秒杀 md题解里面双指针都没用直接for循环秒杀 跳跃游戏 写成这样纯粹是没有看到第一次跳跃必须从第一个开始 class Solution:def canJump(self, nums: List[int]) -> bool:if len(nums) 1:return Truefor i in …...
3分钟带你了解Vue3的nextTick()
前言 Vue 实现响应式并不是数据发生变化之后 DOM 立即变化,而是按一定的策略进行 DOM 的更新。简单来说,Vue在修改数据后,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之后,再统一进行视图更新ÿ…...
数据库的使用方法
sqlite3 API: 头文件: #include <sqlite3.h> 编译时候要加上-lsqlite3 gcc a.c -lsqlite3 1)sqlite3_open int sqlite3_open(const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db …...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
