0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

第7章 变量进阶与点阵LED(7.3 7.4)

137933yu 来源:137933yu 作者:137933yu 2025-12-11 14:56 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

7.3点阵的初步认识
点阵LED显示屏作为一种现代电子媒体,具有灵活的显示面积(可任意分割和拼装)、高亮度、长寿命、数字化、实时性等特点,应用非常广泛。
通过学习LED小灯和LED数码管后,再学习LED点阵就要轻松得多了。一个数码管是8个LED组成,同理,一个8*8的点阵就是由64个LED小灯组成。图7-1就是一个点阵LED最小单元,即一个8*8的点阵LED,图7-2是它的内部结构原理图。

图7-1 8*8LED点阵外观


图7-2 8*8点阵结构原理图


从图7-2上可以看出,其实点阵LED点亮原理还是很简单的。在图中大方框外侧的就是点阵LED的引脚号,左侧的8个引脚是接的内部LED的阳极,上侧的8个引脚接的是内部LED的阴极。那么如果把9脚置成高电平、13脚置成低电平的话,左上角的那个LED小灯就会亮了。下面就用程序来实现一下,特别注意,控制点阵左侧引脚的74HC138是原理图上的U4,8个引脚自上而下依次由U4的Y0~Y7输出来控制。
#include

sbit LED = P0^0;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

void main()
{
ENLED = 0; //U3、U4两片74HC138总使能
ADDR3 = 0; //使能U4使之正常输出
ADDR2 = 0; //经U4的Y0输出开启三极管Q10
ADDR1 = 0;
ADDR0 = 0;
LED = 0; //向P0.0写入0来点亮左上角的一个点
while(1); //程序停止在这里
}
同样的方法,通过对P0的整体赋值可以一次点亮点阵的一行,这次用程序来点亮点阵的第二行,对应的就需要编号U4的74HC138在其Y1引脚输出低电平了。
#include

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

void main()
{
ENLED = 0; //U3、U4两片74HC138总使能
ADDR3 = 0; //使能U4使之正常输出
ADDR2 = 0; //经U4的Y1输出开启三极管Q11
ADDR1 = 0;
ADDR0 = 1;
P0 = 0x00; //向P0写入0来点亮一行
while(1); //程序停止在这里
}
从这里可以逐步发现点阵的控制原理了。前面讲了一个数码管就是8个LED小灯,一个点阵是64个LED小灯。同样的道理,还可以把一个点阵理解成是8个数码管。经过前面的学习已经掌握了6个数码管同时显示的方法,那8个数码管也应该轻轻松松了。下面就利用定时器中断和数码管动态显示的原理来把这个点阵全部点亮。
#include

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

void main()
{
EA = 1; //使能总中断
ENLED = 0; //使能U4,选择LED点阵
ADDR3 = 0; //因为需要动态改变ADDR0-2的值,所以不需要再初始化了
TMOD = 0x01; //设置T0为模式1
TH0 = 0xFC; //为T0赋初值0xFC67,定时1ms
TL0 = 0x67;
ET0 = 1; //使能T0中断
TR0 = 1; //启动T0
while (1); //程序停在这里,等待定时器中断
}
/* 定时器0中断服务函数 */
void InterruptTimer0() interrupt 1
{
static unsigned char i = 0; //动态扫描的索引

TH0 = 0xFC; //重新加载初值
TL0 = 0x67;
//以下代码完成LED点阵动态扫描刷新
P0 = 0xFF; //显示消隐
switch (i)
{
case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=0x00; break;
case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=0x00; break;
case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=0x00; break;
case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=0x00; break;
case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=0x00; break;
case 5: ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=0x00; break;
case 6: ADDR2=1; ADDR1=1; ADDR0=0; i++; P0=0x00; break;
case 7: ADDR2=1; ADDR1=1; ADDR0=1; i=0; P0=0x00; break;
default: break;
}
}
7.4点阵的图形显示
LED小灯可以实现流水灯,数码管可以显示多位数字,点阵LED可以显示一些花样。要显示花样,往往要先做出一些小图形,这些小图形的数据要转换到程序当中,这时就需要取模软件。给大家介绍一款简单的取模软件,这种取模软件在网上都可以下载到,其操作界面如图7-3所示。

wKgZO2k6aj2ANzdyAACSQccYAqE943.png图7-3  字模提取软件界面


单击“新建图像”菜单,根据开发板上的点阵,把宽度和高度分别改成8,然后点击“确定”,如图7-4所示。

wKgZPGk6amqAFnjZAADF6OIE0Qo900.png图7-4  新建图形


单击左侧的“模拟动画”菜单,再点击“放大格点”选项,一直放大到最大,那就可以在8*8的点阵图形中用鼠标填充黑点画图形了,如图7-5所示。

wKgZO2k6aoWAScKRAACrFyAp4-Q519.png图7-5  字模提取软件画图


经过一番精心设计,画出来一个心形图形,并且填充满,最终出现想要的效果图,如图7-6所示。

wKgZPGk6aqOAGuwEAACfyot4b2o870.png图7-6  心型图形


由于取模软件是把黑色取为1,白色取为0,但点阵是1对应LED熄灭,0对应LED点亮,而这里需要的是一颗点亮的“心”,所以要选“修改图像”菜单里的“黑白反显图像”这个选项,再点击“基本操作”菜单里边的“保存图像”可以把设计好的图片进行保存,如图7-7所示。

wKgZPGk6asOAL732AADn5Ei94Ec897.png图7-7  保存图形


保存文件只是为了再次使用或修改使方便,当然也可以不保存。操作完了这一步后,点击“参数设置”菜单里的“其他选项”,如图7-8所示。

wKgZPGk6at6ASv_fAAE4pjDGMIA623.png图7-8  选项设置


这里的选项,要结合图7-2来进行设置,可以看到P0口控制的是一行,所以选择“横向取模”,如果控制的是一列,就要选“纵向取模”。选中“字节倒序”这个选项,是因为图7-2中左边是低位DB0,右边是高位DB7,所以是字节倒序,其它两个选项自己了解,点确定后,选择“取模方式”这个菜单,点一下“C51格式”后,在“点阵生成区”自动产生了8个字节的数据,这8个字节的数据就是取出来的“模”,如图7-9所示。

wKgZPGk6avqAZ0upAACsUQXuIi4350.png图7-9  取模结果


大家注意,虽然用了软件来取模,但是也得知道其原理是什么,在这个图片里,黑色的一个格子表示一位二进制的1,白色的一个格子表示一位二进制的0。第一个字节是0xFF,其实就是这个8*8图形的第一行,全黑就是0xFF;第二个字节是0x99,低位在左边,高位在右边,黑色的表示1,白色的表示0,就组成了0x99这个数值。
那么下面就用程序把这些数据依次送到点阵上去,看看运行效果如何。
#include

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

unsigned char code image[] = { //图片的字模表
0xFF, 0x99, 0x00, 0x00, 0x00, 0x81, 0xC3, 0xE7
};

void main()
{
EA = 1; //使能总中断
ENLED = 0; //使能U4,选择LED点阵
ADDR3 = 0;
TMOD = 0x01; //设置T0为模式1
TH0 = 0xFC; //为T0赋初值0xFC67,定时1ms
TL0 = 0x67;
ET0 = 1; //使能T0中断
TR0 = 1; //启动T0
while (1);
}
/* 定时器0中断服务函数 */
void InterruptTimer0() interrupt 1
{
static unsigned char i = 0; //动态扫描的索引

TH0 = 0xFC; //重新加载初值
TL0 = 0x67;
//以下代码完成LED点阵动态扫描刷新
P0 = 0xFF; //显示消隐
switch (i)
{
case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=image[0]; break;
case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=image[1]; break;
case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=image[2]; break;
case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=image[3]; break;
case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=image[4]; break;
case 5: ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=image[5]; break;
case 6: ADDR2=1; ADDR1=1; ADDR0=0; i++; P0=image[6]; break;
case 7: ADDR2=1; ADDR1=1; ADDR0=1; i=0; P0=image[7]; break;
default: break;
}
}
对于8*8的点阵,可以显示一些简单的图形,字符等。但大部分汉字通常要用到16*16个点,8*8的点阵只能显示一些简单笔画的汉字。使用大屏显示汉字的方法和小屏的方法是类似的,所需要做的只是按照相同的原理来扩展行数和列数而已。


审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led
    led
    +关注

    关注

    243

    文章

    24449

    浏览量

    687619
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    7 变量进阶点阵LED(7.1 7.2)

    走在马路上的时候,经常会看到马路两侧有一些LED点阵的广告牌,这些广告牌看起来绚烂夺目,非常吸引人,而且还会变化很多种不同的显示方式。本章就会学习到点阵LED的控制方式,同时也会学习C
    的头像 发表于 12-10 16:25 58次阅读

    FZH367 具有独立自动呼吸功能的LED(12×16)点阵驱动芯片 原厂技术支持

    概述 型号:FZH367FZH367是一种具有独立自动呼吸功能的LED(12×16)点阵驱动芯片。芯片通过I2C协议控制每个LED实现 3 种自动呼吸模式及PMW模式的切换控制。此外,芯片具备
    发表于 11-18 09:18

    原厂 FZH365 具有独立自动呼吸功能的LED(12×12)点阵驱动芯片

    是一种具有独立自动呼吸功能的LED(12×12)点阵驱动芯片。芯片通过I2C协议控制每个 LED实现 3 种自动呼吸模式及PMW模式的切换控制。此外,芯片具备对每一个LED的开短路检
    发表于 11-17 09:38

    原厂 FZH364 一款8×8点阵恒流LED驱动芯片

    )FZH364是一款8×8点阵恒流LED驱动芯片。可广泛应用于各种单色调光LED显示系统,或RGB 全彩LED显示系统。每颗LED都可以通过
    发表于 11-17 09:34

    2 点亮你的LED(2.5)

    程序5个步骤: 1步:芯片型号,选择STC89C52RC系列下的STC89C52RC/LE52RC,一定不能选错。 2步:扫描串口,根据查到的
    的头像 发表于 10-16 10:58 318次阅读
    <b class='flag-5'>第</b>2<b class='flag-5'>章</b> 点亮你的<b class='flag-5'>LED</b>(2.5)

    2 点亮你的LED(2.3 2.4)

    2.3 LED小灯 LED(light-emitting diode),即发光二极管,俗称LED小灯,它的种类很多,参数也不尽相同,Kingst51开发板上用的是普通的贴片发光二极管。这种二极管通常
    的头像 发表于 10-15 14:37 640次阅读
    <b class='flag-5'>第</b>2<b class='flag-5'>章</b> 点亮你的<b class='flag-5'>LED</b>(2.3 2.4)

    2 点亮你的LED

    本章的标题是点亮LED,虽然任务很简单,但是需要了解的单片机基础知识却很多,特别是对于初学者,刚开始要在头脑中建立一个单片机的概念,然后通过点亮一个LED小灯来增加初学者对单片机的兴趣和自信
    的头像 发表于 10-13 15:52 328次阅读
    <b class='flag-5'>第</b>2<b class='flag-5'>章</b>  点亮你的<b class='flag-5'>LED</b>

    Texas Instruments TPS92402 LED点阵控制器数据手册

    Texas Instruments TPS92402 LED点阵控制器支持8通道独立照明解决方案,提供高达2.5A像素级LED调光控制,具有4.5V至65V的宽输入范围。该器件包括一串八个串联的集成
    的头像 发表于 07-17 15:56 536次阅读
    Texas Instruments TPS92402 <b class='flag-5'>LED</b><b class='flag-5'>点阵</b>控制器数据手册

    Texas Instruments TPS92401 LED点阵控制器数据手册

    FET为单个LED提供PWM调光功能。TPS92401点阵控制器包含一个用于系统时钟的内部振荡器,可支持高达16位的集成PWM 发生器,其可编程PWM频率高达60kHz。这些LED点阵
    的头像 发表于 07-14 14:38 533次阅读
    Texas Instruments TPS92401 <b class='flag-5'>LED</b><b class='flag-5'>点阵</b>控制器数据手册

    RK3568驱动指南|第十二篇 GPIO子系统-130 GPIO的调试方法

    RK3568驱动指南|第十二篇 GPIO子系统-130 GPIO的调试方法
    的头像 发表于 06-03 11:32 999次阅读
    RK3568驱动指南|第十二篇 GPIO子系统-<b class='flag-5'>第</b>130<b class='flag-5'>章</b> GPIO的调试方法

    RK3568驱动指南|驱动基础进阶篇-进阶7 向系统中添加一个系统调用

    RK3568驱动指南|驱动基础进阶篇-进阶7 向系统中添加一个系统调用
    的头像 发表于 05-21 14:15 561次阅读
    RK3568驱动指南|驱动基础<b class='flag-5'>进阶</b>篇-<b class='flag-5'>进阶</b><b class='flag-5'>7</b> 向系统中添加一个系统调用

    单片机外围电路设计 (2版)

    及智能传感器的接口技术。4阐述单片机测控系统的设计。5阐述数据采集系统及新颖检测电路的设计。6
    发表于 04-18 16:16

    RK3568驱动指南|第三篇-并发与竞争-19 并发与竞争实验

    RK3568驱动指南|第三篇-并发与竞争-19 并发与竞争实验
    的头像 发表于 02-24 16:26 861次阅读
    RK3568驱动指南|第三篇-并发与竞争-<b class='flag-5'>第</b>19<b class='flag-5'>章</b> 并发与竞争实验

    点阵数码管驱动抗干扰数显数码管芯片VK1616

    驱动等电路。 SEG脚接LED阳极,GRID脚接LED阴极,可支持7SEGx4GRID的点阵LED显示面板。采用SOP16/DIP16的封
    发表于 02-14 17:00

    VK1618 SOP18/DIP18抗干扰LED数码管驱动/点阵LED驱动控制专用芯片

    8SEGx4GRID、7SEGx5GRID、6SEGx6GRID、5SEGx7GRID的点阵LED显示面 板,最大支持5x1按键。适用于要求可靠、稳定和抗干扰能力强的产品。 LJQ36
    的头像 发表于 12-12 16:25 911次阅读
    VK1618 SOP18/DIP18抗干扰<b class='flag-5'>LED</b>数码管驱动/<b class='flag-5'>点阵</b><b class='flag-5'>LED</b>驱动控制专用芯片