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

news2024/11/24 6:49:50

学习使用的开发板: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.coloradmin.cn/o/2237088.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Chrome扩展是程序员做独立开发的绝佳入场机会

一、开发成本低&#xff0c;难度低 简便灵活&#xff1a;相比开发移动应用&#xff0c;浏览器扩展的开发过程更加简便灵活&#xff0c;更适合初学者。省时省力&#xff1a;通过扩展&#xff0c;你可以修改现有网站的功能&#xff0c;无需从零开始搭建应用&#xff0c;大大节省…

记录一下最近遇到的两个问题

问题1 网友问&#xff1a;一个数据同步的程序之前运行正常&#xff0c;突然数据有问题了&#xff0c;俺的回答是退出杀毒软件 问题是很快解决了&#xff0c;但是网友后来说&#xff0c;客户觉得程序很不稳定。俺不清楚这算不算背锅。 问题2 今天下午&#xff0c;调试着程序蓝…

30.1 时序数据库TSDB的典型特点

本节重点介绍 : db-ranking网站对db进行排名时序数据特点时序数据库特点时序数据库遇到的挑战开源时间序列数据库 db-ranking 一个神奇的网站 https://db-engines.com/en/ranking 时序数据ranking https://db-engines.com/en/ranking/timeseriesdbms 排名方法 https://db-en…

Linux SSH私钥认证结合cpolar内网穿透安全高效远程登录指南

文章目录 前言1. Linux 生成SSH秘钥对2. 修改SSH服务配置文件3. 客户端秘钥文件设置4. 本地SSH私钥连接测试5. Linux安装Cpolar工具6. 配置SSHTCP公网地址7. 远程SSH私钥连接测试8. 固定SSH公网地址9. 固定SSH地址测试 前言 开发人员在工作中经常需要远程访问服务器和数据中心…

vscode摸鱼学习插件开发

不知道大家在摸鱼的时候&#xff0c;会不会想要学习&#xff1f; 或者有没有考公人&#xff0c;下班要学习的&#xff1f; 上班时间摸鱼&#xff0c;下班时间不够学习&#xff1f; 为此&#xff0c;我决定开发一个vscode插件&#xff0c;来刷粉笔题 粉笔插件名称&#xff1a;…

深入浅出WebSocket(实践聊天室demo)

文章目录 什么是WebSocket?WebSocket连接过程WebSocket与Http的区别重连机制完整代码使用方法心跳机制实现聊天室demo(基于Socket.io)参考文章、视频小广告~什么是WebSocket? WebSocket 是一种在单个TCP连接上进行全双工通信的协议(计算机网络应用层的协议) 在 WebSocket A…

[ Linux 命令基础 7 ] Linux 命令详解-磁盘管理相关命令

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

ElasticSearch 添加IK分词器

ElasticSearch 添加IK分词器 前言一、IK分词器的算法二、Ik分词器的下载安装&#xff08;Winows 版本&#xff09;三、Ik分词器的下载安装&#xff08;Linux 版本&#xff09;四、验证测试&#xff08;postman工具&#xff09;测试 ik_smart 分词算法测试 ik_max_word 分词算法…

aws(学习笔记第十一课) 使用AWS的EFS,以及AWS Storage Gateway

aws(学习笔记第十一课) 使用AWS的EFS和AWSStorage Gateway 学习内容&#xff1a; 使用AWS的EFS使用AWS Storage Gateway 1. 使用AWS的EFS 什么是EFS EFS是 Elastic File System的缩写。前面练习的实例存储和EBS都是同时只能一个EC2实例进行挂载&#xff0c;不能实现多个EC2实…

Diffusion Policy——斯坦福刷盘机器人UMI所用的扩散策略(含Diff-Control、ControlNet详解)

前言 本文一开始是属于此文《UMI——斯坦福刷盘机器人&#xff1a;从手持夹持器到动作预测Diffusion Policy(含代码解读)》的第三部分&#xff0c;考虑后Diffusion Policy的重要性很高&#xff0c;加之后续还有一系列基于其的改进工作 故独立成本文&#xff0c;且把原属于另一…

计算机毕业设计 | SpringBoot慈善公益平台 爱心互助活动发布管理系统(附源码)

1&#xff0c;项目介绍 爱慈善公益平台&#xff08;love-charity&#xff09;是一个基于 SpringBoot 开发的标准 Java Web 项目。整体页面非常的简约大气&#xff0c;项目的完整度较高&#xff0c;是一个偏向公益论坛的系统。非常适合刚刚接触学习 SpringBoot 的技术小白学习&…

【深入浅出】之Linux进程(二)

&#x1f4c3;博客主页&#xff1a; 小镇敲码人 &#x1f49a;代码仓库&#xff0c;欢迎访问 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f30f; 任尔江湖满血骨&#xff0c;我自踏雪寻梅香。 万千浮云遮碧…

bert-base-chinese模型使用教程

向量编码和向量相似度展示 import torch from transformers import BertTokenizer, BertModel import numpy as npmodel_name "C:/Users/Administrator.DESKTOP-TPJL4TC/.cache/modelscope/hub/tiansz/bert-base-chinese"sentences [春眠不觉晓, 大梦谁先觉, 浓睡…

Qt/C++ 海康SDK开发示例Demo

*** 工业相机在机器视觉中起到关键作用&#xff0c;本文基于海康 SDK 详细解读了设备连接与控制的各个步骤。内容涵盖设备枚举、句柄创建、图像采集回调以及设备异常处理&#xff0c;帮助开发者快速理解如何通过代码控制相机&#xff0c;实时采集并处理图像数据。*** 1. 搜索并…

RabbitMQ的应用

七种工作模式介绍 1.Simple(简单模式) P&#xff1a;生产者&#xff0c;也就是要发送信息的程序 C&#xff1a;消费者&#xff0c;消息的接收者 Queue&#xff1a;消息队列。图中黄色背景部分&#xff0c;类似一个邮箱&#xff0c;可以缓存发送信息&#xff1b;生产者向其中…

K8S网络插件故障处理

1网络插件故障 1此故障问题处理方法 查询ip是否正常是否是主节点IP地址如果不是需要更改 更改方式 1 修改calico.yaml文件的相应参数 # Cluster type to identify the deployment type - name: IP_AUTODETECTION_METHOD #增加内容value: "interfaceens*" 或者 value…

【论文速看】DL最新进展20241109-图像超分、物理信息神经网络、扩散模型

目录 【图像超分】【物理信息神经网络】【扩散模型】 【图像超分】 [2024 红外图像超分] Infrared Image Super-Resolution via Lightweight Information Split Network 论文链接&#xff1a;https://arxiv.org/pdf/2405.10561v2 代码链接&#xff1a;无 单图像超分辨率&…

Python学习从0到1 day26 第三阶段 Spark ① 数据输入

要学会 剥落旧痂 然后 循此新生 —— 24.11.8 一、Spark是什么 定义&#xff1a; Apache Spark 是用于大规模数据处理的统一分析引擎 简单来说&#xff0c;Spark是一款分布式的计算框架&#xff0c;用于调度成百上千的服务器集群&#xff0c;计算TB、PB乃至EB级别的海量数据…

[Python学习日记-63] 继承与派生

[Python学习日记-63] 继承与派生 简介 继承 派生 简介 上一篇文章我们学习了类如何使用&#xff0c;以及相关特性&#xff0c;也做了相关的练习&#xff0c;在练习当中发现类与类之间有时也会存在重复代码&#xff0c;其实在类中我们还有一个继承和派生的概念没有说&#xf…

基于 Encoder-only 架构的大语言模型

基于 Encoder-only 架构的大语言模型 Encoder-only 架构 Encoder-only 架构凭借着其独特的双向编码模型在自然语言处理任务中表现出色&#xff0c;尤其是在各类需要深入理解输入文本的任务中。 核心特点&#xff1a;双向编码模型&#xff0c;能够捕捉全面的上下文信息。 En…