干货是这样单片机显示屏入门LED(点阵是这样干货单片机显示屏)「基于单片机的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点阵原理图这还是88的LED点阵原理图,我们从原理图中可以看到什么呢?很多LED灯,被乱七八糟的连起来了,第一眼就是这样的感觉
大家如果第一次接触这玩意儿,可能就是这种感觉
但不要慌,容科技仔来分析一下:首先我们从最右边开始看,每一列的LED的负极(有一条横线那边),都被一条导线连起来了,从这里可以知道,这条导线就是列线
这里先不管什么是列线,先接着看
接下来我们从最下边开始看,每一行的LED的正极都被一条导线连起来了,那么这条线就是行线了
同样的,接着往下看
行线有8条,列线有8条,那么大家有没有想起数码管的的驱动方式呢?动态数码管的驱动方式,不断的扫描位选端,实现动态显示
那么因为88的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、软硬件联调这种数据线比较的程序其实是非常不好调的,我在做的时候就乱码了很多次,当然88的相对来说比较简单,也不会出现太多问题
主要是让大家了解这种点阵是如何工作的,了解了一个,那么几个拼在一起,实现一个大的显示屏,也是可以实现的
调试嘛,还是一样的,就在视频里面
4、写在最后今天写的东西说实话让我费了很多心思,想了好多种写的方式,但表现的还是不算很好,还需要继续学习
希望大家能从我的文章中学到一点东西,这便是我最大的期望
那么,为了让你想要关注我,我就给你看一个更厉害的东西
1616LED点阵很好,现在你看了,那就必须要关注我
关注我,私信发送“03”就可以获得两个实例的仿真和程序,以及对应的字模软件,还有小编的在线指导操作与讲解哦
赶紧行动吧
关注+点赞+转发,是我创作的动力,我希望更多人看得到我的文章,让我的文章可以被更多想要学习这些知识的人看到
希望大家继续支持我这枚小小科技仔
干货是这样单片机显示屏入门LED(点阵是这样干货单片机显示屏)
(图片来源网络,侵删)

联系我们

在线咨询:点击这里给我发消息