51单片机之LED点阵屏

目录

1.LED点阵屏简介

2.配置LED点阵屏代码


1.LED点阵屏简介

        LED点阵屏真的是遍布我们我们生活的每个角落,从街边的流动显示字的招牌到你的液晶显示屏,都是基于点阵屏的原理研究出来的。还有那个世界上最大的球状建筑物:MSG Sphere,也是基于LED点阵的原理实现的:

        把单色的LED换成彩色的RGB,实现幻彩般的视觉观感,这也是科技的魅力吧。

        我们单片机上的就是比较简单的一种点阵屏,它不仅仅是一些LED,我们需要了解的更多应该是怎么实现使用更少的IO口控制这个LED点阵屏。

        我们开发板上的LED点阵屏一共有16个,我们使用这些点阵屏可以制作很多有意思的东西。比如网上很火的坤坤跳舞(doge)和贪吃蛇小游戏,这里我们就来了解一下它到底是使用什么方式实现的吧。

        首先LED点阵屏和数码管还有矩阵键盘都有异曲同工之处,使用循环行列式扫描实现图像显示,然后是使用共阴共阳连接减少IO口占用。至于行列扫描,我们应该都比较熟悉了,还是一样的,这里主要介绍一下IO口的占用。

        如果说,数码管的显示数据减少IO口的方式是使用74HC138芯片实现位选,74HC245芯片实现数选,这里我们对LED点阵屏的使用也要有相应的芯片达到减少IO占用的结果,而这里我们使用的是74HC595芯片来减少IO占用。

        74HC595是串行输入并行输出的移位寄存器,可用3根线输入串行数据,8根线输出并行数据,多片级联后,可输出16位、24位、32位等,常用于IO口扩展。

具体功能的实现像一个队列,只不过换了一种形式:

        这个是大概的实现原理的流程图:我们使用从SRC端口接入数据,当上升沿移位寄存器从0变成1的时候,从SER的数据就再进入一个,把前面得到的数据往下移1位,SERCLK变回0。当上升沿锁存寄存器RCLK置为1的时候,在整个寄存器中的数据就会全部移到和输出端相连的输出缓存处,直接输出数据,从而实现全部数据同时输出的作用。

        当当前的数据储存存满了之后,我们可以使用片级联的方法,使得再进入数据可以继续储存数据,从而实现16位32位甚至更多。

        像这样,离总输出端最近的部分再次输入数据,数据就会通过最下方传输到下一个级联的SER,为下一个级联的部分输入数据。等到上升沿锁存置为1的时候,所有的芯片都会向IO口输出数据,从而实现更多位的LED输出。

2.配置LED点阵屏代码

        这里配置一下LED点阵屏的代码

        这里可以看到我们需要配置三个引脚,RCLK,SRCLK,SER。

        我们可以把这几个引脚使用sbit重新命名一下。

这里说明一下,类似引脚这样的重命名是使用sbit和sfr两种

针对P0,P1,P2等这样的寄存器重新命名使用sfr,比如我们可以把使用LED时把P2命名成LED,即sfr LED = P2;

这样我们就可以直接对我们取的名字直接操纵,比如LED = 0xf0;

sbit针对的是一个寄存器中更加精确的位,例如P2^2,我们使用sbit LED = P2^2;就定义了单位,如果我们不重新命名,我们就要使用P2^2就只能使用P2_2 = 0;这样才可以使用,因为在头文件中定义的只有P2_2这样的形式,P2^2这样的定义意思其实就是P2寄存器中第二位的意思,这样才找到的这个位。

这里我们使用sbit重新定义这几个引脚,目的是增加代码可读性

        这里我们不能直接定义P3^5为RCLK,在头文件的184行有一个定义过的RCLK,所以我们就要使用别的名字,只要知道谁是谁就好了。

sbit RCK = P3^5;
sbit SRCLK = P3^6;
sbit SER = P3^4;

        现在开始编写函数实现输入一个8位二级制数据,使用74HC595芯片把内容写入。首先我们要知道的是,我们是使用一位一位的把数据输入到芯片SER引脚,每次需要把一位数据输入到芯片里面,我们的SERCLK就要置为高电平,然后数据才会移位,我们再把SERCLK置为0.。循环这个过程,直到我们的数据全部都进入,这个时候我们就要使用上升沿锁存RCLK置为高电平,把数据输出到缓存区。

void Write74HC595(unsigned char byte)
{unsigned char i = 0;for(i = 0;i<8;i++){SER = byte&(0x80>>i);SRCLK  = 1;SRCLK  = 0;}RCK = 1;RCK = 0;
}

        这样我们调用函数,我们就可以把数据输出了。但是我们要实现点阵屏亮,还要实现一点东西:

        根据原理图我们可以知道:我们74HC595芯片输出的是LED点阵的一列A1-A8的阳极,我们还需要在K1-K8输入低电平才可以让LED点阵亮起来。

        假设我想要让一个对角线亮起来,我们就要使用循环控制行和列来实现,就好像我们的数码管的数选和位选,我们就要使用循环的形式达成。

        这里我们再实现一个函数,让我们可以通过输入列的数和输入芯片的数据,然后输出一列的对应的LED

void MartixLEDShow(unsigned char col,unsigned char byte)
{SRCLK  = 0;RCK = 0;Write74HC595(byte);P0 = ~(0x80>>(col-1));
}

然后我们调用函数:

void main()
{while(1){MartixLEDShow(1,0x80);MartixLEDShow(2,0x40);MartixLEDShow(3,0x20);MartixLEDShow(4,0x10);MartixLEDShow(5,0x08);MartixLEDShow(6,0x04);MartixLEDShow(7,0x02);MartixLEDShow(8,0x01);}
}

        然后到了这里如果LED点阵还没亮,不要慌,把LED点阵旁边的跳线帽J24拔下来,插到另外两个针头上就可以了

          这样我们就可以在我们的LED上显示一个对角线的灯光了,但是我们还有一点问题,就是我们会发现:我们的LED点阵屏上有一些本来不该亮的地方亮了,其实就和前面讲过的数码管一样的原理,就是位选+数选的叠加导致上一个数选和下一个位选结合或者上一个数选和下一个位选结合然后导致显示的错误,所以我们就要做一件事:消隐。保证消除上一次的位选或者数选。

        同时,消隐会道义一点问题:就是我们的这个亮度会变暗,所以我们就要消隐前使用Delay函数把这个LED亮的时长增加,就可以实现正常亮度了。

        更改之后的函数如下:

void MartixLEDShow(unsigned char col,unsigned char byte)
{SRCLK  = 0;RCK = 0;Write74HC595(byte);P0 = ~(0x80>>(col-1));Delay(1);P0 = 0Xff;//消隐
}

        这样就实现了一个对角线的LED点阵亮。

        实现一个对角线还是比较简单的,这里我们再实现一个笑脸:

        这里实现这个笑脸,红色部分是需要点亮的地方,我们要把每一列的数据都记录在一个数组里面:

unsigned char Image[] = {0x3c,0x42,0xa9,0x85,0x85,0xa9,0x42,0x3c};

 对了,这里可以在数组名字前面加上51的关键字:code,这样我们就可以把数组的内容存储在单片机的flash缓存中了,我们也就可以写入更多的数据了:
 

unsigned char code Image[] = {0x3c,0x42,0xa9,0x85,0x85,0xa9,0x42,0x3c};

然后再在main函数里调用函数就可以实现一个笑脸了:

void main()
{while(1){unsigned char i = 0;for(i=0;i<8;i++){MartixLEDShow(i+1,Image[i]);}}
}

这里再封装一个函数,我们输入数组的名字+长度就可以实现调用了:

void ImageShow(unsigned char*Image,unsigned int len)
{unsigned char i = 0;for(i=0;i<len;i++){MartixLEDShow(i+1,Image[i]);}
}void main()
{while(1){ImageShow(Image,8);}
}

        对了,这里可以使用一个软件,也是买板子的时候给的:

        这个是取模软件,我们可以自行生成想要图案,但是这个生成文字的功能需要16*16以上的点阵,这里就只使用8*8的功能:

选择新建一个8*8的图像

放大,以便操作

点击格点画图

点击生成之后复制代码到自己的数组中使用即可。

当然,还想要实现什么都可以靠自己实现。

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

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

相关文章

三极管结构难?——秒了

前边我们已经学完了PN结&#xff0c;二极管&#xff0c;在分析了二极管后&#xff0c;我们对这些东西有了一定深度的了解&#xff0c;但是只给我们一个二极管去研究&#xff0c;这玩意好像真的没啥大用&#xff0c;其实我们追求的是用半导体材料去代替电子管的放大作用&#xf…

网络安全(防火墙,IDS,IPS概述)

问题一:什么是防火墙,IDS,IPS? 防火墙是对IP:port的访问进行限制,对访问端口进行制定的策略去允许开放的访问,将不放开的端口进行拒绝访问,从而达到充当防DDOS的设备。主要是拒绝网络流量,阻断所有不希望出现的流程,禁止数据流量流通,达到安全防护的作用。如将一些恶…

tensorflow.js 使用 opencv.js 将人脸特征点网格绘制与姿态估计线绘制结合起来,以获得更高的帧数

系列文章目录 如何在前端项目中使用opencv.js | opencv.js入门如何使用tensorflow.js实现面部特征点检测tensorflow.js 如何从 public 路径加载人脸特征点检测模型tensorflow.js 如何使用opencv.js通过面部特征点估算脸部姿态并绘制示意图 文章目录 系列文章目录前言一、实现步…

Lecture 2~4 About Filter

文章目录 空间域上的滤波器- 线性滤波器盒状滤波器Box Filter锐化Sharpening相关运算 vs. 卷积运算 Correlation vs. Convolution - 非线性滤波器高斯滤波器Gaussian filter - 实际问题- 纹理texture 频域上的滤波器 滤波的应用- 模板匹配- 图像金字塔 空间域上的滤波器 图像…

Django的中间件

Django的中间件 【一】重点&#xff1a; django中间件是django的门户 请求来的时候需要经过中间件才能到达真正的django后端响应走的时候也需要经过中间件才能发送出去中间件按照顺序依次执行 ​ Django 中间件&#xff08;Middleware&#xff09;是 Django 框架提供的一种…

设计模式——代理模式12

代理模式给某对象提供一个代理对象&#xff0c;由代理对象来控制对原对象的引用。该模式经常出现在系统框架或相关组件中&#xff0c;如Spring框架如何解决循环依赖&#xff0c;在Mybatis 定义 Dao 层相关接口 不写实现 如何通过注解或者xml映射到对应到sql语句。下面介绍 静态…

再见 MybatisPlus,阿里推出新 ORM 框架更牛X

最近看到一个 ORM 框架 Fluent Mybatis 挺有意思的&#xff0c;整个设计理念非常符合工程师思维。 我对官方文档的部分内容进行了简单整理&#xff0c;通过这篇文章带你看看这个新晋 ORM 框架。 官方文档&#xff1a;https://gitee.com/fluent-mybatis/fluent-mybatis/wikis 提…

Nginx反向代理与Tomcat实现ssm项目前后端分离部署

Nginx nginx是一款http和支持反向代理的web服务器&#xff0c;以其优越的性能被广泛使用。以下是百度百科的介绍。 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.…

智慧园区水电能源监控管理系统

随着智慧城市的快速发展&#xff0c;智慧园区作为城市智能化的重要组成部分&#xff0c;其能源监控管理系统显得尤为关键。智慧园区水电能源监控管理系统&#xff0c;是利用先进的信息技术和自动控制技术&#xff0c;对园区内的水电能源使用进行实时监控、管理和优化的综合性智…

美国34401A安捷伦数字万用表

181/2461/8938产品概述&#xff1a; 附加功能: 6 1/2位数分辨率10种测量功能:DC/交流电压、DC/交流电流、2线和4线电阻、二极管、连续性、频率、周期基本精度:0.0035% DC&#xff0c;0.06%交流1000 V最大电压输入&#xff0c;3 A最大电流输入每秒1000次读数512读取记忆 安捷…

Linux C++ 027-STL之deque容器

Linux C 027-STL之deque容器 本节关键字&#xff1a;Linux、C、deque 相关库函数&#xff1a;pubsh_back、begin、front、sort deque基本概念 功能&#xff1a;双端数组&#xff0c;可以对头端进行插入删除操作。 deque 与 vector 的区别&#xff1a; &#xff08;1&#x…

vue将html生成pdf并分页

jspdf html2canvas 此方案有很多的css兼容问题&#xff0c;比如虚线边框、svg、页数多了内容显示不全、部分浏览器兼容问题&#xff0c;光是解决这些问题就耗费了我不少岁月和精力 后面了解到新的技术方案&#xff1a; jspdf html-to-image npm install --save html-to-i…

关于pandas 无法读取 csv 文件数据的解决方式

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 …

LabVIEW和2D激光扫描的受电弓滑板磨耗精确测量

LabVIEW和2D激光扫描的受电弓滑板磨耗精确测量 在电气化铁路运输中&#xff0c;受电弓滑板的健康状况对于保障列车安全行驶至关重要。受电弓滑板作为连接电网与列车的直接介质&#xff0c;其磨损情况直接影响到电能的有效传输及列车的稳定运行。精确、快速测量受电弓滑板磨损情…

IntelliJ IDEA 2024.1安装与激活[破解]

一&#xff1a;IDEA官方下载 ①如题&#xff0c;先到IDEA官方下载&#xff0c;简简单单 ②IDEA官方&#xff1a;IntelliJ IDEA – the Leading Java and Kotlin IDE 二&#xff1a;获取脚本 &#x1f31f;网盘下载&#xff1a;jetbra (密码&#xff1a;lzh7) &#x1f31f;获取…

CLI的使用与IOS基本命令

1、实验目的 通过本实验可以掌握&#xff1a; CLI的各种工作模式个CLI各种编辑命令“?” 和【Tab】键使用方法IOS基本命令网络设备访问限制查看设备的相关信息 2、实验拓扑 CLI的使用与IOS基本命令使用拓扑如下图所示。 3、实验步骤 &#xff08;1&#xff09;CLI模式的切…

Visual Studio Code 终端为管理员权限

第一部 1、 Visual Studio Code 快捷方式启动选项加上管理员启动 第二步 管理员方式运行 powershell Windows 10的任务栏自带了搜索。或者开始菜单选搜索只需在搜索框中输入powershell。 在出来的搜索结果中右击Windows PowerShell&#xff0c;然后选择以管理员方式运行。 执…

使用Docker Registry-v2搭建镜像仓库详细教程

我们使用docker来部署私有化镜像仓库… 1、下载 registry:v2 镜像 docker pull registry:22、在私有仓库所在的主机目录新建一个文件夹&#xff0c;用于持久化保存仓库中的镜像 mkdir -p /opt/registry3、启动registry镜像 使用docker镜像启动私有仓库容器服务&#xff0c;…

ArcGIS Desktop使用入门(四)工具箱——属性域

系列文章目录 ArcGIS Desktop使用入门&#xff08;一&#xff09;软件初认识 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——标准工具 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——编辑器 ArcGIS Desktop使用入门&#xff08;二&#x…

nacos服务治理

nacos 服务演变之路 单体架构 集群级垂直化 SOA 微服务 微服务优缺点 SOA与微服务区别 springcloud技术栈 服务发现概念 服务发现两种方式–客户端服务发现 服务发现两种方式–服务端发现 服务发现技术对比 nacos架构图 nacos实战 服务发现 源码解析 nacos实现了springcloud…