第十节 点阵屏模块
一、点阵屏介绍
LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等。LED点阵屏广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等。
LED点阵屏分类
按颜色:单色、双色、全彩
按像素:8*8、16*16等(大规模的LED点阵通常由很多个小点阵拼接而成)
二、显示原理
- LED点阵屏的结构类似于数码管,只不过是数码管把每一列的像素以“8”字型排列而已
- LED点阵屏与数码管一样,有共阴和共阳两种接法,不同的接法对应的电路结构不同
- LED点阵屏需要进行逐行或逐列扫描,才能使所有LED同时显示
这是 74HC595 驱动 LED 阵列 的原理图,核心是用移位寄存器扩展 IO 口,控制多盏 LED ,拆解如下:
(一)、核心器件:74HC595(移位寄存器)
1、作用:把单片机的串行数据转成并行输出,少引脚控制多LED(1个芯片可控制8路)。
2、关键引脚:
SER(14 脚):串行数据输入 → 接单片机引脚(图里是 P34 ),用来传要显示的数据。
SRCLK(11 脚):移位时钟 → 接单片机 P36 ,每来一个脉冲,SER 数据就 “移” 到内部寄存器。
RCLK(12 脚):锁存时钟 → 接单片机 P35 ,把移位好的数据 “锁” 到输出端,控制 LED 亮灭。
QA~QH(1~7 脚):并行数据输出 → 直接接 LED 负极(图里 D9~D16 ),输出高低电平控制 LED 。
OE(13 脚):输出使能 → 接 P35 ,低电平允许输出(一般接地或控使能 ,图里可能简化了)。
(二)、LED 与电阻(右侧电路)
1、LED 部分(D9~D16):
共阴极设计(正极接 VCC
,负极接 74HC595 输出 ),74HC595 输出低电平时,LED 会亮(电流从 VCC → LED → 74HC595 地 )。
2、电阻(RP6、RP8):
1K 限流电阻,保护 LED 不被大电流烧坏(限制回路电流在安全范围 )。
(三)、控制逻辑
串行传数据:单片机通过 P34(SER)发 8 位二进制数(比如想让 D9 亮,就传00000001)。
移位锁存:
每发 1 位数据,P36(SRCLK)打一个脉冲,数据 “移” 进 74HC595 内部移位寄存器。
8 位发完后,P35(RCLK)打一个脉冲,把移位好的数据 “锁” 到 QA~QH 输出。
LED 亮灭:74HC595 输出低电平的引脚,对应的 LED 就会亮(比如 QA 输出 0 → D9 亮 )。
(四)、简单总结
用 74HC595 把单片机 3 个引脚(P34、P35、P36 )扩展成 8 路输出,控制 8 个 LED 。
优势:省单片机引脚,适合需要控制多个外设(比如点阵屏、LED 矩阵)的场景。
简单说,这就是个 “串行转并行、少引脚控多设备” 的经典电路,学会它,玩点阵屏、LED 流水灯就轻松。
74HC595是串行输入并行输出的移位寄存器,可用3根线输入串行数据,8根线输出并行数据,多片级联后,可输出16位、24位、32位等,常用于IO口扩展。
2、开发板引脚对应关系:
通过矩阵排列的方式,控制8*8个LED,仅需要8+8=16个I/O口,其中D0 ~ D7控制LED的阳极,P00 ~ P07控制 LED 的阴极。想让一个LED亮,必须阳极阴极连通,例如想让最左上角的 LED 亮起,则D7 = 1 && P07 = 0。
三、C51的sfr、sbit
1、sfr(特殊功能寄存器声明)
功能:sfr 是 “Special Function Register” 的缩写,用于声明一个特殊功能寄存器,方便程序员直接访问 51 单片机内部的特殊功能寄存器,对单片机的硬件资源进行配置和控制,比如控制 I/O 端口、定时器、串口等 。
语法:sfr 特殊功能寄存器名 = 地址值; 。其中,地址值是该特殊功能寄存器在单片机内部 RAM 中的字节地址,必须是 8 的整数倍(因为特殊功能寄存器在地址空间中是按字节编址的),并且要使用十六进制表示。
例如:
// 声明P0口对应的特殊功能寄存器,P0口在51单片机中的字节地址为0x80
sfr P0 = 0x80;
// 下面就可以对P0口进行操作,比如将P0口输出高电平
P0 = 0xff;
2、sbit(special bit):特殊位声明
功能:sbit 用于声明一个特殊功能寄存器中的某一位,在已经使用 sfr 声明了特殊功能寄存器的基础上,进一步对寄存器中的某一位进行单独操作,比如单独读取或设置 P0 口的某一位电平。
语法:有三种声明方式。
sbit 位变量名 = 特殊功能寄存器名^位序号;
sbit 位变量名 = 字节地址^位序号;
sbit 位变量名 = 位地址;
其中,位序号是从 0 - 7,表示该位在寄存器中的位置 。
例如:
sfr P1 = 0x90; // 声明P1口对应的特殊功能寄存器,地址为0x90
// 使用第一种方式声明P1口的第0位
sbit P1_0 = P1^0;
// 单独对P1.0引脚进行操作,比如设置P1.0输出高电平
P1_0 = 1;
四、程序设计
1、点阵屏显示静态笑脸
1、Main.c
#include <REGX52.H>
#include " MatrixLED.h "void main(){MatrixLED_Init();while(1){MatrixLED_ShowColumn(0,0x3c);MatrixLED_ShowColumn(1,0x42);MatrixLED_ShowColumn(2,0xA9);MatrixLED_ShowColumn(3,0x85);MatrixLED_ShowColumn(4,0x85);MatrixLED_ShowColumn(5,0xa9);MatrixLED_ShowColumn(6,0x42);MatrixLED_ShowColumn(7,0x3c);}
}
2、MatrixLED.c
#include <REGX52.H>
#include "Delay.h"sbit RCK = P3^5; // RCLK
sbit SCK = P3^6; // SRCLK
sbit SER = P3^4; // SER
#define MATRIX_LED_PORT P0
/***brief 初始化点阵屏*param 无*retval 无
*/
void MatrixLED_Init()
{SCK=0;RCK=0;
}/***brief 74HC595写入的字节*param 要写入的字节*retval 无
*/
void _74HC595_WriteByte(unsigned char Byte)
{
// SER=Byte&0x80; // 取高位
// SCK = 1; // 上升沿存入一位数据
// SCK = 0; // 要置一
// SER=Byte&0x40; // 取第二位
// SCK = 1; // 上升沿存入一位数据
// SCK = 0; // 要置一
// ...unsigned char i;for(i=0;i<8;i++){SER=Byte&(0x80>>i);SCK=1;SCK=0;}RCK=1; // 发送数据SCK=0;
}
/***brief LED点阵屏显示一列数据*param Column 要选择的列,Data要显示的数据*retval 无
*/
void MatrixLED_ShowColumn(unsigned char Column,Data)
{// 显示的数据_74HC595_WriteByte(Data);// 第几列显示数据MATRIX_LED_PORT = ~(0x80>>Column);Delay(1);MATRIX_LED_PORT=0xFF; // 清零
}
3、MatrixLED.h
#ifndef __MATRIXLED_H__
#define __MATRIXLED_H__
void MatrixLED_Init();
void _74HC595_WriteByte(unsigned char Byte);
void MatrixLED_ShowColumn(unsigned char Column,Data);#endif
4、Delay.h
#ifndef __DELAY_H
#define __DELAY_Hvoid Delay(unsigned int xms);#endif
5、Delay.c
void Delay(unsigned int xms) //@12.000MHz
{unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}
}
2、显示动态笑脸
main.c
#include <REGX52.H>
#include "MatrixLED.h"
unsigned char code Animation[]={0x3C,0x42,0xA9,0x85,0x85,0xA9,0x42,0x3C,0x3C,0x42,0xA1,0x85,0x85,0xA1,0x42,0x3C,0x3C,0x42,0xA5,0x89,0x89,0xA5,0x42,0x3C,
};void main()
{unsigned char i,Offset=0,Count=0;MatrixLED_Init();while(1){for(i=0;i<8;i++) {MatrixLED_ShowColumn(i,Animation[i+Offset]);}Count++; if(Count>15){Count=0;Offset+=8; if(Offset>16){Offset=0;}}}
}
其他代码同上。
3、点阵屏显示动态字符
main.c
#include <REGX52.H>
#include "Delay.h"
#include "MatrixLED.h"
unsigned char code Animation[]={
//加code相当于放在单片机的flash里面,一般数据放在单片机的RAM里面,由于flash空间大,我们一般选择放在flash里面,放在Flash里面就不可以更改了。
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0x08,0x08,0x08,0xFF,0x00,0x0E,0x15,
0x15,0x15,0x08,0x00,0x7E,0x01,0x02,0x00,
0x7E,0x01,0x02,0x00,0x0E,0x11,0x11,0x0E,
0x00,0x7D,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//上面是hello字节每一列字节表示
};//主函数的意思是首先将LED屏上前8列的数字显示出来,显示出来以后,我们定义一个count,将count计数到20,相当于将LED屏上的数字延迟20s(我们姑且将20的单位当作秒),20s以后,图片偏移量开始增加,从0移植增加到40,(为什么是40呢,我们要保证偏移量能够将数组里的除了前8位数字全部过一遍,hello字符全部显示)同时随着偏移量的增加,LED点阵屏上的动画向左移动,当移动了40列以后,offset清0,又从头开始。
void main()
{unsigned char i,count=0;unsigned char offset=1;//图片的偏移量void MatrixLED_Init();while(1){for(i=0;i<8;i++){MatrixLED_ShowColumn(i,Animation[i+offset]);}count++;if(count>20)//将LED屏上的数字扫描20遍,相当于延时{count=0;//扫描20次后,清0.offset++;//将LED屏上的数字向左移动if(offset>40)//当图片偏移量大于40时,偏移量清0{offset=0;}}}
}
51单片机实操(8*8LED点阵屏静态显示爱心)(8*8LED点阵屏动态显示hello!)-CSDN博客
【51单片机】LED点阵屏 原理 + 使用-CSDN博客
51单片机学习——7--8*8LED点阵显示_单片机led8*8点阵显示7-CSDN博客