51单片机之LED点阵屏

news2024/12/26 14:03:27

目录

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.coloradmin.cn/o/1581366.html

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

相关文章

签名失败当前系统没有安装苹果根证书

发生背景 第一次我没有iOS证书(.p12)和描述文件(.mobileprovision)。按照这个文档https://ask.dcloud.net.cn/article/152拿到后&#xff0c;安心打包出问题。 错误信息 [Info] begin getCertCName... [Info] begin codesignFramwork to ipa... [Error] DCUniBase.framework…

Mac 安装 brew brew cask 遇到的问题以及解决办法

安装Homebrew和Homebrew Cask是在Mac上管理软件包的常用方法。虽然大多数情况下安装这两个工具是比较简单的&#xff0c;但有时候也可能遇到一些问题。下面是一些常见的问题以及解决办法&#xff1a; 问题1&#xff1a;无法安装Homebrew 解决办法&#xff1a; 1.确保你的Mac已连…

跟TED演讲学英文:Why AI will spark exponential economic growth by Cathie Wood

TED英文文稿 文章目录 TED英文文稿Why AI will spark exponential economic growthIntroductionVocabularyTranscriptSummary Why AI will spark exponential economic growth Link: https://www.ted.com/talks/cathie_wood_why_ai_will_spark_exponential_economic_growth? …

打印CSDN博客只需两步

打印博客 关闭浏览器限制 浏览器打开对应博客&#xff0c;F12&#xff0c;在console下粘贴如下代码&#xff0c;回车 (function doPrint(){var head_str "<html><head><title></title></head><body>"; var foot_str "&…

three.js跟着教程实现VR效果(四)

参照教程&#xff1a;https://juejin.cn/post/6973865268426571784&#xff08;作者&#xff1a;大帅老猿&#xff09; 1.WebGD3D引擎 用three.js &#xff08;1&#xff09;使用立方体6面图 camera放到 立方体的中间 like “回” 让贴图向内翻转 &#xff08;2&#xff09;使…

【机器学习—聚类】

文章目录 1、前言1.1、定义1.2、数据 2、亲和力传播3、聚合聚类4、BIRCH5、DBSCAN6、K-均值7、Mini-Batch K-均值8、均值漂移聚类9、OPTICS10、光谱聚类11、高斯混合模型12、参考 1、前言 1.1、定义 聚类分析&#xff0c;即聚类&#xff0c;是一项无监督的机器学习任务。它包…

本地开发nginx代理服务器

1、nginx 解释 nginx 是一个高性能的HTTP和反向代理服务器&#xff0c;同时也是一个IMAP/POP3/SMTP 代理服务器。 在性能上&#xff0c;Nginx占用很少的系统资源&#xff0c;能支持更多的并发连接&#xff0c;达到更高的访问效率&#xff1b; 在功能上&#xff0c;Nginx是优…

番茄 abogus rpc调用

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018601872 本文章…

SpringMVC:搭建第一个web项目并配置视图解析器

&#x1f449;需求&#xff1a;用spring mvc框架搭建web项目&#xff0c;通过配置视图解析器达到jsp页面不得直接访问&#xff0c;实现基本的输出“hello world”功能。&#x1f469;‍&#x1f4bb;&#x1f469;‍&#x1f4bb;&#x1f469;‍&#x1f4bb; 1 创建web项目 1…

web安全学习笔记【22】——文件上传(1)

WEB攻防-PHP应用&文件上传&函数缺陷&条件竞争&二次渲染&黑白名单&JS绕过 演示案例&#xff1a; PHP-原生态-文件上传-前后端验证PHP-原生态-文件上传-类型文件头验证PHP-原生态-文件上传-后缀黑白名单验证PHP-原生态-文件上传-解析配置&二次渲染…

网页布局与样式设计:从简单到复杂

✨✨祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一. 基础布局技巧 1.使用CSS Grid布局设计网页布局 1.1 创建网格容器 1.2. 定义…

GridView控件的使用(一)

GridView控件通常用于在Windows窗体或Web应用程序中显示数据表格。它是一个强大的数据绑定控件&#xff0c;能够灵活地显示和编辑数据源中的数据。 在何种情况下应使用GridView进行绑定控件&#xff1a; 显示结构化数据&#xff1a;当您需要展示一系列具有相同字段的数据记录…

Go语言中的互斥锁(Mutex)和读写锁(RWMutex)

Mutex Mutex结构体 type Mutex struct {state int32 //表示互斥锁的状态,比如是否被锁定等sema uint32 //表示信号里,协程阻塞等待的信号量,解锁的协程释放信号量从而唤醒等待信号量的协程 } Locked: 表示Mutex是否已被锁定(1表示已经被锁定)Woken: 表示是否有协程被唤醒(1已有…

【JVM】面试题汇总

JVM1. 什么是JVM&#xff1f;2. 了解过字节码文件的组成吗&#xff1f;3. 什么是运行时数据区4. 哪些区域会出现内存溢出5. JVM在JDK6-8之间在内存区域上有什么不同 6. 类的生命周期 7. 什么是类加载器&#xff1f;类加载器有哪几种 8. 什么是双亲委派机制&#xff1f;有什么好…

HJ43 迷宫问题(动态规划,从(0,0)开始,四个方向遍历,深度优先搜索,找到一条路径。)

从&#xff08;0&#xff0c;0&#xff09;开始&#xff0c;四个方向遍历&#xff0c;深度优先搜索&#xff0c;找到一条路径。 import java.util.Scanner; import java.util.ArrayList;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public stati…

网络基础三——IP协议补充和Mac帧协议

全球网络及网段划分的理解 ​ 根据国家组织地区人口综合评估进行IP地址范围的划分&#xff1b; ​ 假设前8位用来区分不同的国家&#xff0c;国际路由器负责全球数据传输&#xff0c;子网掩码为IP/8&#xff1b;次6位区分不同的省份&#xff0c;国内路由器负责全国数据的传输…

微服务学习3

目录 1.微服务保护 1.1.服务保护方案 1.1.1.请求限流 1.1.2.线程隔离 1.1.3.服务熔断 1.2.Sentinel 1.2.1.微服务整合 1.2.2.请求限流 1.3.线程隔离 1.3.1.OpenFeign整合Sentinel 1.3.2.配置线程隔离 1.4.服务熔断 1.4.1.编写降级逻辑 1.4.2服务熔断 2.分布式事…

threejs 基础知识点汇总

threejs 基础知识点汇总 之前写了几篇博文&#xff0c;但是我觉得写的不好&#xff0c;我今天再补充一篇还不好的&#xff0c;把基础知识点汇总一下&#xff0c;不写运行的代码了&#xff0c;只写关键代码&#xff0c;但是看了之前我写的那几篇&#xff0c;看这篇的话问题其实不…

OpenCV C++学习笔记

1.图像的读取与显示 1.1 加载并显示一张图片 #include<opencv2/opencv.hpp> #include<iostream>using namespace cv; using namespace std; int main(int argc,char** argv){Mat srcimread("sonar.jpg");//读取图像if(src.empty()){printf("Could…

大型语言模型如何助力推荐系统:综述研究

论文地址&#xff1a;https://arxiv.org/pdf/2306.05817.pdf 这篇论文主要探讨了推荐系统&#xff08;RS&#xff09;如何从大型语言模型&#xff08;LLM&#xff09;中获益。论文首先指出&#xff0c;随着在线服务和网络应用的快速发展&#xff0c;推荐系统已成为缓解信息过载…