1.LED点阵屏介绍
LED点阵屏由独立的LED组成,一般有8*8,16*18,LED以矩阵形式排列。
2.LED屏显示原理
LED点阵屏的结构类似于数码管,只不过是数码管把每一列的像素以“8”字型排列而已
LED点阵屏与数码管一样,有共阴和共阳两种接法,不同的接法对应的电路结构不同
LED点阵屏需要进行逐行或逐列扫描,才能使所有LED同时显示
该实验数码管先确定列,再确定行。每一列是共阴接法,每一行是共阳接法。
3.74HC595串行移位寄存器
在开始实验之前,我们先介绍一下74HC595的bit流如果流向LED点阵屏。
当我们开始向74HC595写人1个字节,1字节相当于8bit.
具体步骤:1.SER置1,8个数据排好队依次移动位置。
2.SERCLK上升沿置1。bit流开始流动,bit流开始从高位向低位移动。
3.SERCLK上升沿置0。bit流动结束清0。
4.RCLK置1。当8Bit数据流占满位置时(一字节流动到位置后上升沿锁存)
5.RCLK置0。把8位数据送到IO口。
从上图我们可以看出,74HC595的QA-QH端口连接的是LED点阵屏的D0-D7。
4.LED点阵静态显示爱心
4.1delay.c
void Delay(unsigned char xms) //@12.000MHz
{
unsigned char i, j;
while(xms)
{
i = 195;
j = 138;
do
{
while (--j);
} while (--i);
xms--;
}
}
4.2delay.h
#ifndef __DELAY_H__
#define __DELAY_H__
void Delay(unsigned char xms);
#endif
4.3main函数
#include <REGX52.H>
#include "Delay.h"
//74HC595特殊寄存器端口配置
sbit RCK=P3^5;//RCLK
sbit SCK=P3^6;//SRCLK 所有IO口初始化以后都是高电平,因此主程序中要置0
sbit SER=P3^4;//SER 74H595配置
//作用:74HC595写入一个字节(循环写入8个字节)
//参数:要写入的字节
void _74HC595_WriteByte(unsigned char Byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
SER=Byte&(0x80>>i);//向右移位 8个数据排好队依次移动位置
SCK=1;//上升沿置1,bit流开始流动
SCK=0;//上升沿置1结束后要置0
}
RCK=1;//一字节流动到位置后上升沿锁存
RCK=0;//锁存后置0
}//把8位数据送到IO口
//LED屏依次显示一列数据
//参数:list要选中的列:0-7,0在最左边
//参数 Data选择列显示的数据,高位在上,1为亮,0为灭
void MatrixLED_ShowColumn(unsigned char list,Data)
{
_74HC595_WriteByte(Data);
P0=~(0x80>>list);//列选
Delay(0);//位延迟
P0=0xFF;//位清0;
// if(list==0)(P0=~0X80);//取反后结果是0111 1111 第一列数码管亮
// if(list==1)(P0=~0X40);
// if(list==2)(P0=~0X20);
// if(list==3)(P0=~0X10);
// if(list==4)(P0=~0X08);
// if(list==5)(P0=~0X04);
// if(list==6)(P0=~0X02);
// if(list==7)(P0=~0X01);
}
void main()
{
SCK=0;//上升沿移位 一上电就要把它赋值为0
RCK=0;//上升沿锁存 一上电就要把它赋值为0
while(1)
{
MatrixLED_ShowColumn(0,0x70);//0x70代表74HC595送来的1bit流,1bit流随后流到了LED点阵屏第0列
MatrixLED_ShowColumn(1,0x48);
MatrixLED_ShowColumn(2,0x44);
MatrixLED_ShowColumn(3,0x22);
MatrixLED_ShowColumn(4,0x22);
MatrixLED_ShowColumn(5,0x44);
MatrixLED_ShowColumn(6,0x48);
MatrixLED_ShowColumn(7,0x70);
}
}
4.4成果展示
5.LED点阵屏动态显示hello
5.1函数模块分类
这一部分我们把LED点阵屏模块封装成一个函数MatrixLED.c。同时还需要以下函数模块。Delay.c和Delay.h,MatrixLED.c和MatrixLED.h。以及主函数main.c。Delay.c和Delay.h和第四部分静态爱心制作一致。
5.2main.c函数
注意:主函数的意思是首先将LED屏上前8列的数字显示出来,显示出来以后,我们定义一个count,将count计数到20,相当于将LED屏上的数字延迟20s(我们姑且将20的单位当作秒),20s以后,图片偏移量开始增加,从0移植增加到40,(为什么是40呢,我们要保证偏移量能够将数组里的除了前8位数字全部过一遍,hello字符全部显示)同时随着偏移量的增加,LED点阵屏上的动画向左移动,当移动了40列以后,offset清0,又从头开始。
void main()
#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;
}
}
}
}
5.3MatrixLED.c函数
#include <REGX52.H>
#include "Delay.h"
sbit RCK=P3^5;//RCLK
sbit SCK=P3^6;//SRCLK 所有IO口初始化以后都是高电平,因此主程序中要置0
sbit SER=P3^4;//SER 74H595配置
//LED点阵屏初始化
void MatrixLED_Init()
{
SCK=0;//上升沿移位 一上电就要把它赋值为0
RCK=0;//上升沿锁存 一上电就要把它赋值为0
}
//作用:74HC595写入一个字节(循环写入8个字节)
//参数:要写入的字节
void _74HC595_WriteByte(unsigned char Byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
SER=Byte&(0x80>>i);//向右移位 8个数据排好队依次移动位置
SCK=1;//上升沿置1,bit流开始流动
SCK=0;//上升沿置1结束后要置0
}
RCK=1;//一字节流动到位置后上升沿锁存
RCK=0;//锁存后置0
}//把8位数据送到IO口
//LED屏依次显示一列数据
//参数:list要选中的列:0-7,0在最左边
//参数 Data选择列显示的数据,高位在上,1为亮,0为灭
void MatrixLED_ShowColumn(unsigned char list,Data)
{
_74HC595_WriteByte(Data);
P0=~(0x80>>list);//位选
Delay(0);//位延迟
P0=0xFF;//位清0;
// if(list==0)(P0=~0X80);//取反后结果是0111 1111 第一列数码管亮
// if(list==1)(P0=~0X40);
// if(list==2)(P0=~0X20);
// if(list==3)(P0=~0X10);
// if(list==4)(P0=~0X08);
// if(list==5)(P0=~0X04);
// if(list==6)(P0=~0X02);
// if(list==7)(P0=~0X01);
}
5.4MatrixLED.h函数
#ifndef __MATRIXLED_H__
#define _MATRIXLED_H__
void MatrixLED_Init();
void _74HC595_WriteByte(unsigned char Byte);
void MatrixLED_ShowColumn(unsigned char list,Data);
#endif
5.5成果展示