51单片机 8*8LED点阵(入门教学)

LED点阵是由发光二极管组成的显示器件,常用于汽车报站器和广告屏。8*8点阵由64个二极管构成,通过控制行线和列线的电平来点亮特定二极管。使用Proteus软件可以进行电路仿真,通过单片机控制I/O口实现点阵的点亮。动态显示和取字模软件的应用使得在点阵上显示数字和字符成为可能。
摘要由CSDN通过智能技术生成
  1. 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 点阵的使用也是非常简单的。

  1. 点阵显示

为了方便理解,这里使用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口都可能不一样
    }
}

  1. 显示数字等字符或图像

字符或图像就是由多个点组成,想要在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数组改为:

u8 hang={0x38,0x7C,0x7E,0x3F,0x3F,0x7E,0x7C,0x38};

仿真:

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值