1、LED点阵屏简介
- LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等。LED点阵屏广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等
- LED点阵屏分类 按颜色:单色、双色、全彩 按像素:8*8、16*16等(大规模的LED点阵通常由很多个小点阵拼接而成)
2、LED点点阵屏显示原理
- LED点阵屏的结构类似于数码管,只不过是数码管把每一列的像素以“8”字型排列而已
- LED点阵屏与数码管一样,有共阴和共阳两种接法,不同的接法对应的电路结构不同
- LED点阵屏需要进行逐行或逐列扫描,才能使所有LED同时显示
stc89c52开发板上的引脚对应关系如下:
- P0_0~P0_7 为阴极,由单片机控制。置0为有效
- D0~D7 为阳极,由74HC595 芯片获取
3、74HC595芯片介绍
- OE :为芯片使能位 置0时芯片开始工作
- RCLK:(register clock)寄存器时钟 ——置1时,将数据搬移到右端
- SRCLR: (serial clear)串行清零端 (置0时清空)
- SRCLK:(serial clock)串行时钟——置1时,向下移动数据
- SER:串行数据 ——负责输入数据
- QH' :多片级联
4、C51中的str、sbit
- sfr(special function register):特殊功能寄存器声明 例:sfr P0 = 0x80; 声明P0口寄存器,物理地址为0x80
- sbit(special bit):特殊位声明 例:sbit P0_1 = 0x81; 或 sbit P0_1 = P0^1; 声明P0寄存器的第1位
- 可位寻址/不可位寻址:在单片机系统中,操作任意寄存器或者某一位的数据时,必须给出其物理地址,又因为一个寄存器里有8位,所以位的数量是寄存器数量的8倍,单片机无法对所有位进行编码,故每8个寄存器中,只有一个是可以位寻址的。对不可位寻址的寄存器,若要只操作其中一位而不影响其它位时,可用“&=”、“|=”、“^=”的方法进行位操作
5、使用LED点阵屏显示静态图形
#include <REGX52.H>
#include "Delay.h"sbit RCK=P3^5; //RCLK
sbit SCK=P3^6; //SRCLK
sbit SER=P3^4; //SER/*** @brief 往74HC595芯片中写入 一个字节数据 来控制 D0~D7 * @param Byte 一个字节数据* @retval 无*/
void _74HC595_WriteByte(unsigned char Byte)
{unsigned char i;for(i=0;i<8;i++){SER = (0x80>>i)&Byte; //写入数据SCK = 1; //向下移位SCK = 0;}RCK = 1;RCK = 0;
}/*** @brief LED点阵屏显示一列数据* @param Column 要选择的列,范围:0~7,0在最左边* @param Byte 选择列显示的一字节数据,高位在上,1为亮,0为灭* @retval 无*/
void MatrixLED_ShowColumn(unsigned char Column,Byte)
{_74HC595_WriteByte(Byte);P0=~(0x80>>Column);// LED 消影Delay(1);P0=0xFF;
}void main()
{SCK = 0;RCK = 0;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);}
}
利用LED点阵屏显示笑脸图形:
6、使用LED点阵屏显示动态图形——小日本
#include <REGX52.H>
#include "Delay.h"
#include "MatrixLED.h"//动画数据 小日本
unsigned char code Animation[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x12,0x01,0xFF,0x00,0x10,0x08,0x00,0x00,0x7F,0x49,0x49,0x49,0x7F,0x00,0x00,0x02,0x24,0x2A,0x32,0xFF,0x32,0x2A,0x24,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};void main()
{unsigned char i,Offset=0,Count=0;MatrixLED_Init(); // 前面实验的函数,进行了写到了MatrixLED.c 文件中了while(1){for(i=0;i<8;i++) //循环8次,显示8列数据{MatrixLED_ShowColumn(i,Animation[i+Offset]); // 前面实验的函数,进行了写到了MatrixLED.c 文件中了}Count++; //计次延时if(Count>15){Count=0;Offset++; //偏移+8,切换下一帧画面if(Offset>33){Offset=0;}}}
}
演示效果:
LED点阵屏 显示动画