LED 点阵介绍
LED 点阵是由发光二极管排列组成的显示器件,在我们日常生活的电器中随 处可见,被广泛应用于汽车报站器,广告屏等。 通常应用较多的是 8*8 点阵,然后使用多个 8*8 点阵可组成不同分辨率的 LED 点阵显示屏,比如16*16 点阵可以使用 4 个 8*8 点阵构成。因此理解了 8*8LED 点阵的工作原理,其他分辨率的 LED 点阵显示屏都是一样的。这里以 8*8LED 点 阵来做介绍。其内部结构图如下所示:
8*8 点阵共由 64 个发光二极管组成,且每个发光二极管是放置在行线和列线 的交叉点上,当对应的某一行置 1 电平,某一列置 0 电平,则相应的二极管就亮; 如要将第一个点点亮,则 1 脚接高电平 a 脚接低电平,则第一个点就亮了;如果 要将第一行点亮,则第 1 脚要接高电平,而(a、b、c、d、e、f、g、h )这些 引脚接低电平,那么第一行就会点亮;如要将第一列点亮,则第 a 脚接低电平, 而(1、2、3、4、5、6、7、8)接高电平,那么第一列就会点亮。由此可见,LED 点阵的使用也是非常简单的。
点阵显示
为了方便理解,这里使用Proteus仿真软件绘制电路图。
首先,我们来点亮左上角第一个灯。
原理图如下:
在选择led点阵的时候,一定要判断那边正那边负,像下图这样,一边接地一边接Vcc,来判断点阵的正负级,便于编写程序。
上面为负极,控制列。下面为正极,控制行。
下面这张图的左右两个电路原理是一样的,只要控制相应的I/O口,就可以点亮我们想要的哪一个灯。
点亮第一个灯的程序代码:
#include "reg52.h"
#define LED_col P2 //列
#define LED_row P3 //行
void main()
{
LED_col=0x7F;//第一列,根据实际电路连接判断,每个人连接电路的I/O口都可能不一样
while(1)
{
LED_row=0x80;//第一行,根据实际电路连接判断,每个人连接电路的I/O口都可能不一样
}
}
显示数字等字符或图像
字符或图像就是由多个点组成,想要在LED点阵上显示数字或简单的图像,首先要获取在 LED 点阵上显示数字字符所需的数据,即一个数字字符在 LED 点阵上显示,对应的每行每列都会有一些灯点亮或者熄灭,这样就会构成一组数据,也就是数字字符的显示数据,我们只要将这些数据通过单片机发送到点阵对应的行或列就能显示数字字符。
要实现行列不同位置亮灯,需要使用动态显示的方法,也要结合扫描的方法。 在第一行亮灯一段时间以后灭掉,点亮第二行一段时间以后灭掉,点亮第三行一 段时间以后灭掉,如此点亮,直到八行全部点亮一次,在第一行点亮到最后一行 灭掉的总时间不能超过人肉眼可识别的时间,即 24 毫秒。在每一行点亮的时候, 给列一个新的数据,此时对应列的数据就可以体现在这行上要点亮的灯上。这样 就和动态数码管的显示一样,只不过数码管的 LED 灯是段值。这里使用 LED 点 阵显示数字,也是多个 LED 同时点亮。
数字字符数据如何获取呢?这里给大家介绍一个非常好用的工具-取字模软 件。
双击打开该软件,首先选择“基本操作->新建图像”,设置图像的宽度和高 度为8,点击确定后将在显示窗口出现一个8*8的白色格子,这个就类似于8*8LED 点阵,具体操作如下:
可以看到上图 8*8 点阵区域非常小,我们可以将其放大,选择“模拟动画”, 后点击“放大格点”,如下所示:
然后设置取模数据的取模方式等内容,选择“参数设置”后点击“其他 选项”,具体操作如下:
然后可以在这个 8*8 白色格子里面点击,点击后即会在对应位置出现一 个黑点,表示在 LED 点阵对应位置的 LED 灯点亮,未点击位置(白色)表示 LED 点阵对应位置的 LED 灯熄灭。 比如在 8*8LED 点阵上显示数字 0,那么可以在图中 8*8 白色框内通过点 击对应位置描出一个数字 0 ,如下所示:
到这里我们就将数字 0 的数据生成了,然后将生成的数据复制到我们程序定义的数组中,如:
u8 hang[8]={0x00,0x7E,0x81,0x81,0x81,0x81,0x7E,0x00};
这些数据其实就是上述描绘的数字 0 从左到右依次每列对应的行数据。 至于其它数字或字符及简单图形的显示取模方法与上述类似。 既然是动态扫描,就需要不断的扫描每列,因此可以把 LED 点阵的列控制也 用数组存储起来,为后面循环调用提供方便。根据数字 0 取模的数据特点是从左 至右每列对应的行数据,因此扫描时也应该从左至右的顺序,如下:
u8 lie[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
显示0的代码:
#include "reg52.h"
typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;
u8 lie[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
u8 hang[8]={0x00,0x7e,0x81,0x81,0x81,0x81,0x7e,0x00};
#define LED_col P2 //列
#define LED_row P3 //行
void delay_10us(u16 ten_us)//延时函数,ten_us=1 时,大约延时 10us
{
while(ten_us--);
}
void main()
{
u8 i=0;
while(1)
{
for(i=0;i<8;i++)//循环 8 次扫描 8 行、列
{
LED_col=lie[i];//传送列选数据
LED_row=hang[i];//传送行选数据
delay_10us(100);
LED_row=0x00;//消影
}
}
}
仿真结果:
这里不知道为啥,需要把点阵转过来,如果不转显示的0就是横这的,有知道的小伙伴可以评论区讨论。我觉得还是灵活多变吧。
如果要显示心型就把hang数组改为:文章来源:https://www.toymoban.com/news/detail-786116.html
u8 hang={0x38,0x7C,0x7E,0x3F,0x3F,0x7E,0x7C,0x38};
仿真:文章来源地址https://www.toymoban.com/news/detail-786116.html
到了这里,关于51单片机 8*8LED点阵(入门教学)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!