单片机入门(第8篇):纯干货,LED显示屏原来是这样设计的呀

前面的一系列文章中,我们提到了单片机最小系统,外部I/O口的基本使用,数码管以及按键的相关案例。今天我们介绍个不一样的。LED点阵,它长啥样的?

8x8LED点阵模块

8x8x4LED点阵模块

这个东西让我们施了魔法之后可以做成啥样呢?

这样的速度显示牌要不要了解一下!

高铁速度显示

这样的广告牌要不要了解一下!

LED广告牌

这样的LED显示器要不要了解一下!

LED显示器

这些的显示器,我们,现在都设计不了!

哈哈哈哈哈哈哈!

好像挺尴尬的


那我们现在可以做什么样的呢?

这样的!

LED点阵显示爱心

这样的!

LED点阵显示汉字

Q:想不想知道怎么设计呢?

A:那肯想了,还用问!

那么,就接下来,我们就来一步一步向大家展示这么好玩的东西怎么去设计出来。

0、效果展示,功能分析

视频加载中...

看了视频,那么我们就来分析一下如何实现这些功能。

  • 显示部分使用LED点阵显示,后面会介绍LED点阵的原理。

LED点阵模块

  • LED点阵驱动电路。

74ls245驱动电路

  • 单片机主控模块

主控模块 AT89C51

有了基本的模块选择,那么如何去实现功能呢?

科普时间到了,小本本记下来哦!

LED点阵模块如何驱动呢?

首先我们要知道,既然叫LED点阵,那么说到底,还是LED,那就无非两个状态:亮,不亮。

用数电的说法就是 1,0。知道了这个,那我们就来看一张图。

LED点阵原理图

这还是8*8的LED点阵原理图,我们从原理图中可以看到什么呢?

很多LED灯,被乱七八糟的连起来了,第一眼就是这样的感觉。大家如果第一次接触这玩意儿,可能就是这种感觉。

但不要慌,容科技仔来分析一下:

首先我们从最右边开始看,每一列的LED的负极(有一条横线那边),都被一条导线连起来了,从这里可以知道,这条导线就是列线。这里先不管什么是列线,先接着看。

接下来我们从最下边开始看,每一行的LED的正极都被一条导线连起来了,那么这条线就是行线了。同样的,接着往下看。

行线有8条,列线有8条,那么大家有没有想起数码管的的驱动方式呢?动态数码管的驱动方式,不断的扫描位选端,实现动态显示。

那么因为8*8的LED点阵的数据量较大,所以只能采用动态扫描显示。

我们将一个图像(任何数字、汉字、字母等等在这里都是图像)分解成很多部分,把显示数据送到列线上,然后一次点亮一行,并不断循环,实现动态显示的效果。实际实现方法如下。

for(m=0;m<100;m++) // 循环显示100次
	{ 
		w=0x01; // 行选数据
		 for(j=0;j<8;j++) //循环八次进行行选,实现动态显示
		{ 	
					 P1=w;		 // 将行选数据送至P1端口,后面是LED点阵的行线
					 P0=~led[5][j]; // 将需要显示的数据送至P0端口,后面是LED点阵的列线 
					 delay(100); // 延时显示时长
					 w<<=1; // 左移行选数据 
 P0=0xff; // 关闭显示,防止拖影
	 }
	}

当然这个代码还是看起来比较抽象,那么我们在仿真的情况下把延时调长一点,就会出现明显的卡顿,那么就是在不断的进行扫描显示。

我们来举个例子,什么叫扫描显示。

比如,我们一共有8个人,要上8楼,有一个横排电梯可以让他们上去,但要求每上一层做一个不同的动作。我们提前把动作编好,然后告诉他们,现在是几楼了(传递行数据),然后他们就做自己在对应层数要做的动作(传递列数据)。然后我们让他们多来几次,再搞个延时拍摄,最后再快放,只要他们配合的好,这就是一个LED点阵的效果了。没有动画演示,实在对不住大家,能力有限。

不知道这个例子有没有让大家理解到什么是扫描显示,有一个地方不太完美,其实列数据是发送到了每一个数码管上的,但只有输入行数据的那一列才会被点亮,希望大家可以理解我的意思。

知道了原理,那我们就开始造吧!

1、硬件电路设计

这东西就直接给了吧,也没啥好藏着掖着的。

如果你整不好这张图,那就关注我吧,我,可以教你!

如果你整好了这张图,那也关注我吧,你,可以教我!

如果你想要这个仿真,那必须关注我,私信发送“03”获取仿真与程序!

那么图来了:

硬件电路图

这里就不去解释为什么这么连了。

有一点必需要注意,我们要知道哪边是行线,哪边是列线!

但你知道怎么测试吗?

这里又要输出一点知识了,我只说一遍啊,如果你后来忘了,那我就不管了,除非你想起再来这里看看。

  • 如果我们拿到的是真实的LED点阵模块,要去使用,那么我们就用万用表的蜂鸣档去测试,红表笔为正极,黑表笔为负极。接上LED点阵两边的引脚上面,一次不行就反过来再试一次,直到有一个LED灯亮起的时候,那么接红标笔的那边就是行线。

那么这是为什么呢,我们的代码中行线是高电平,大家也看到了代码:

......
w = 0x01;
......
w <<=1;

相信大家都是直到这两句话是什么意思,但我是还是想说一下,w <<= 1;就是把w左移一位,那么w的中的高电平位1,就会向左移一下,那么是不是就实现每次只点亮一行的效果呢,再不断的循环。嗯,对,就是那感觉。

  • 如果是仿真模块,那我们该如何去判断呢,这里和实际的模块原理上是一模一样,你想到了怎么去做吗?我们给一个模块的两边分别加上高低电平,其中一个LED小灯就会亮,看哪边是高电平,高电平的那边确定为行线。为什么是这样,那就和上面的解释是一样的了。

判断行线

Q:那你说,这个情况下那边是行线呢?

A:这很明显嘛,左边是行选线嘛。

Q:不错不错,一点就通啊!

A:那是肯定的啦

额,说了这么多,还是要搬上实际的代码才有用啊。

2、程序设计

什么都不说,就是这么直接干上代码。

#include "reg51.h" 
void delay(unsigned int i); 
// 主函数
void main() 	 
{
// 显示二维数组
 unsigned char code led[6][8]={
		 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, //不显示	
		 {0x18,0x24,0x24,0x24,0x24,0x24,0x24,0x18}, //0
 {0x00,0x18,0x1c,0x18,0x18,0x18,0x18,0x18},	//1
 {0x00,0x1e,0x30,0x30,0x1c,0x06,0x06,0x3e},	//2
 {0x00,0x1e,0x30,0x30,0x1c,0x30,0x30,0x1e},	//3
 {0x00,0x66,0x99,0x00,0x18,0x81,0x42,0x3C}}; // 笑脸
 
 unsigned char w; // 用于保存行选数据
 unsigned int j,k,m; // j,k,m控制循环次数
	for(k = 1; k < 5; k++) // 循环三次,分别显示1,2,3
	{
		for(m = 0; m < 100; m++) // 此循环是为了加长显示时间
		{
		w = 0x01; // 行数据
 		for(j = 0; j < 8; j++) // 循环八次进行行选,实现动态显示
 		{
 			P1 = w;
 			P0 = ~led[k][j];
 			delay(100);
 			w<<=1;
 			P0 = 0xff;
 		}
 		delay(1000); // 延时
 	}
 	}										 
 while(1) // 一直显示笑脸
 {
 	for(m=0;m<100;m++) 
 	{ 
 		w=0x01;
 		 for(j=0;j<8;j++)
 		{ 	
 					 P1=w;		 
 					 P0=~led[5][j]; 		
 					 delay(100); 
 					 w<<=1;P0=0xff;
 	 }
 	} 
 	delay(1000);
 	for(m = 0;m < 100; m++)
 	 {
 		 P0 = 0X00; // 关闭显示
 		 P1 = 0X00; // 关闭显示 其实写一句也是一样的,这里是为了强制确认关闭
 		 delay(100);
 	 }
 }
 }
 // 延时函数
 void delay(unsigned int i) 	 
 {
 unsigned int k;
 	for(k=0;k<i;k++);
 }

关于显示部分我就不说了,主要来讲一讲这个数组是怎么来的。

在LED原理解释里面我讲到了行选数据和列选数据,那么这个数组就是列选数据,通过将想要表现的数据通过取模软件编码出来,再在这里写出来,再通过一系列巴拉巴拉的操作,你就可以看到视频中的那个效果了。

3、软硬件联调

这种数据线比较的程序其实是非常不好调的,我在做的时候就乱码了很多次,当然8*8的相对来说比较简单,也不会出现太多问题。主要是让大家了解这种点阵是如何工作的,了解了一个,那么几个拼在一起,实现一个大的显示屏,也是可以实现的。

调试嘛,还是一样的,就在视频里面。

4、写在最后

今天写的东西说实话让我费了很多心思,想了好多种写的方式,但表现的还是不算很好,还需要继续学习。希望大家能从我的文章中学到一点东西,这便是我最大的期望。

那么,为了让你想要关注我,我就给你看一个更厉害的东西。

16*16LED点阵

很好,现在你看了,那就必须要关注我。

关注我,私信发送“03”就可以获得两个实例的仿真和程序,以及对应的字模软件,还有小编的在线指导操作与讲解哦。赶紧行动吧!

关注+点赞+转发,是我创作的动力,我希望更多人看得到我的文章,让我的文章可以被更多想要学习这些知识的人看到。希望大家继续支持我这枚小小科技仔。

举报
评论 0