【51单片机】LED点阵屏 原理 + 使用

server/2024/11/15 6:30:22/

学习使用的开发板: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!!!


以上就是本篇博客的所有内容,感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
在这里插入图片描述


http://www.ppmy.cn/server/140713.html

相关文章

Win10在目录打开cmd,添加“在此处打开命令提示符”

1. 编辑文件***.reg Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Directory\shell\OpenCmdHere] "在此处打开命令提示符" "Icon""cmd.exe" [HKEY_CLASSES_ROOT\Directory\shell\OpenCmdHere\command] "cmd.exe /s /k push…

【Go语言】| 第1课:Golang安装+环境配置+Goland下载

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 &#x1f913; 同时欢迎大家关注其他专栏&#xff0c;我将分享Web前后端开发、人工智能、机器学习、深…

第四章:TDengine 的客户端管理工具 DBeaver

TDengine 的客户端管理工具 DBeaver DBeaver 是一款流行的跨平台数据库管理工具&#xff0c;方便开发者、数据库管理员、数据分析师等用户管理数据。DBeaver 从 23.1.1 版本开始内嵌支持 TDengine。 前置条件 使用 DBeaver 管理 TDengine 需要以下几方面的准备工作。 安装 …

数字IC后端实现Innovus 时钟树综合(Clock Tree Synthesis)典型案例

对于如下所示电路&#xff0c;要求以下几路做到等长&#xff0c;clock skew控制在50ps以内&#xff0c;clock tree insertion delay做到800ps! from FF/Q to FF1_1/D through the FF1 CK from FF/Q to FF2_1/D through the FF2 CK from FF/Q to FF3_1/D through the FF3 CK fr…

如何设置docker的定时关闭和启动

目录 使用Cron 使用Docker Compose 使用Docker Swarm 注意事项 在Docker中设置容器的定时关闭和启动可以通过多种方法实现。以下是两种常见的方法&#xff1a;使用系统级定时任务&#xff08;如cron&#xff09;和使用Docker特定的解决方案。 使用Cron 创建Cron Job: 打开…

编译google protobuf项目,生成相应语言的dll文件

步骤 1:安装 .NET SDK 确保你的系统上已安装 .NET SDK。你可以在 PowerShell 中运行以下命令来检查是否已安装: dotnet --version如果没有安装,可以从 .NET 官方网站 下载并安装合适的版本。 步骤 2:获取源代码 使用 git clone `google protobuf 的源代码。 使用 Git …

OceanBase中,如何解读 obdiag 收集的火焰图 【DBA早下班系列】

1. 前言 在之前的文章 遇到性能问题&#xff0c;如何给OceanBase“拍CT“&#xff08;火焰图与扁鹊图&#xff09;中&#xff0c;分享了obdiag 快速收集火焰图的方法&#xff0c;那么&#xff0c;紧接着的问题便是&#xff1a;收集到火焰图和扁鹊图之后&#xff0c;该如何解读…

Java与HTML中的标题、文本和图像

一、HTML中的标题 HTML标题标签的基础 在HTML中&#xff0c;标题使用<h1>到<h6>标签来定义&#xff0c;<h1>表示最高级别的标题&#xff0c;<h6>表示最低级别的标题。例如&#xff1a; html复制代码 <h1>这是一级标题</h1><h2>这是…