点阵 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;
}
}
关键字:LED点阵 单片机
引用地址:
LED点阵的介绍
推荐阅读最新更新时间:2024-03-16 15:26
51单片机基础之流水灯(一)
代码: #include reg52.h //不再赘述 #define LED P2 //宏定义P2端口,偏于直接操作 void delay(unsigned int u16) //不再赘述 { while(u16--); } void main(void) { int i; //定义一个变量 while(1) { for(i=0;i 8;i++) //循环执行八次 { LED=~(0x01 i); //第一次执行的时候左移一位,第二次左移两位,第三次左移三位,以此类推
[单片机]
汽车无线遥控开门技术
1 引言 本文将对汽车无线遥控开门系统的新型设计方案与应用发展作分析介绍。汽车安全应用所使用的典型无线遥控开门系统-遥控钥匙(RKE)系统,如图1所示。该系统组成包括一个安装在汽车上的控制器(或称接收器)和一个由用户携带的收发器(或发射器),即无线遥控车门钥匙。收发器一般包括一个微控制器、RF器件以及按钮和LED等人机接口器件。微控制器可用DS89C440或PIC16F639,RF器件可用MAX7044或MAX1479或TRF6901。收发器通常关闭,只在按下按钮或需要发送数据时才工作。收发器用来向控制器发送数据,因此是单向通信。然而,这一情况正在改变。新型智能收发器即可发送数据,也可接收数据,因此是双向通信。在双向通
[单片机]
单片机驱动LED中上拉电阻的问题
驱动LED发光管的时候,应该分共阳接法和共阴接法这两种,共阳的时候LED正端接正电源,负端通过一个限流电阻接P口,这时不用接上拉电阻,只要这个限流电阻取合适就可以了发光管亮的时候电流就是从电源正——LED——限流电阻——P口,P口为低电位发光管灭的时候没有电流流过,P口为高电位或高阻状态共阴接法,LED负端接地,正端直接P口,这时候要接上拉电阻,这个上拉电阻是提供LED发光用的,发光管亮的时候电流是从电源正——上拉电阻——LED——地。这时上拉电阻也是限流用的。P口为高电位或高阻状态发光管暗的时候电流是从电源正——上拉电阻——P口,这时LED无电流流过,P口为低电位,限流电阻上流过电流全部从P口流入。要从单片机的输出驱动能力开始讲起
[单片机]
由MCU走向SoC,汽车芯片转战下一代ADAS和自动驾驶
定义一辆现代化汽车的不再只有外形、舒适度与行驶性能,还有汽车的智能化。从车载信息娱乐系统(IVI)到ADAS,这些都离不开车载芯片的功劳。过去汽车内部的控制系统相互孤立,如今在各大系统逐渐整合的趋势下,汽车芯片也慢慢由 MCU 转向SoC。 据统计机构的研究报告指出,2018年全球汽车SoC的总市值达129.315亿美元,预计在2019到2028年的周期内,其市值还将以8%的年复合增长率大幅上升。其中以增强型IVI的需求仍在不断增长,而终端用户中,对驾驶辅助以及安全意识的提高,将成为ADAS应用SoC增长的关键要素之一。出于同样的原因,专注于消费芯片的厂商,也开始在汽车芯片领域布局。 由于疫情影响了一定的汽车出货量,但从已经回
[汽车电子]
基于PIC16单片机对24X24 点阵屏驱动设计
花了几天时间,弄出个小东西,虽然有很多种实现方式在网上流传了,但我却从没有试过,乘有时间,也弄出了四种方式的显示,各位帮忙看看,哪里还有不好的地方,希不吝指教。 一。原理及仿真图 此种为从右往左显示。 此中为从左往右显示 此种为从下往上显示 此种为从上往下显示 原理图说明: 1. 本实例采用微芯 PIC16F877A 单片机,此单片机适合初学者 2. 点阵采用 24X24 点,左边为行线,采用 U1-U3 三个 74LS373 地址所存芯片,复用单片机 RB 端口。 右边为列线,采用 U4-U6 三个 74LS373 地址所存芯片,复用单片机 RD 端口。 3
[单片机]
51单片机(AT89C52)外部中断程序
#include reg52.h #define uchar unsigned char #define uint unsigned int #define DELAY 1000 void delay(uint z) //1ms { uint x,y; for(x=z;x 0;x--) for(y=111;y 0;y--); } void main() { uchar i,dt; EA=1; //开总中断 EX1=1; //开外部中断1 // IT1=0; //设置外部中断1为低电平触发 IT1=1; //设置外部中断1为下降沿触发 while(1)
[单片机]
Cortex内核独揽大局,MCU内核之争升级
随着 NXP 发布LPC1700系列 Cortex -M3内核的 MCU ,围绕着ARM新宠 Cortex 内核的竞争已经进入白热化。 目前 Cortex -M3处理器内核的授权客户数已达到28家,包括东芝、ST、Ember、Accent、Actel、ENERGY、ADI、 NXP 、TI、Atmel、Broadcom、Samsung、Zilog和Renesas,其中ST、TI、 NXP 、Atmel和东芝已经推出基于 Cortex -M3的 MCU 产品。 在这5家中,通过收购Luminary入局的TI和ST属于最先吃螃蟹的人,到现在已经成果初现; NXP 则凭借最新的V2版内核100MHz主频的LPC1700系列大有
[单片机]
单片机软件UART的设计思想
目前扩展串口的方法主要有以下方法, ①、采用串口扩展芯片实现,如ST16C550、ST16C554、SP2538、MAX3110等,虽然成本较高, 但系统的可靠性得到了保证,适用于数据量较大、串口需求较多的系统;②、采用分时切换的方法将一个串口扩展与多个串口设备通信,分时复用的方法成本低, 但只适用于数据量不大的场合, 并且只能由这个单片机主动和多个设备通信,实时性差;③、用软件模拟的方法扩展串口,其优势也是成本低、实时性好, 但要占用一些CPU时间。 一般的软件模拟扩展串口方法,使用1个I/O端口、1个INT外部中断和定时器,该方法扩展的串口有2个缺点,①、由于使用了INT外部中断,故只能使用2个INT外部中断扩展2个串口。②
[单片机]