LED点阵实验
LED点阵介绍
LED 点阵是由发光二极管排列组成的显示器,在我们的日常生活中随处可见,广泛应用于汽车报站、广告屏等。如下所示:
通常更常用的是 88 然后使用多个点阵 88 点阵可以形成不同的分辨率 LED例如,点阵显示屏 16* 16 可使用点阵 4 个 8* 8 因此理解了点阵的构成。 8 * 8LED点阵的工作原理,其他分辨率 LED 点阵显示屏是一样的。 8* 8LED 点阵介绍。其内部结构图如下:
8*8 点阵共由 64 发光二极管由一个发光二极管组成,每个发光二极管放置在行线和当相应的行放置时 1 电平,某列 0 电平时,相应的二极管会亮起;如果你想点亮第一个, 1 脚接高电平 a 脚接低电平,第一点亮;如果你想点亮第一行,那么第一行 1 脚要接高电平,而(a、b、c、d、e、f、g、h )这些引脚连接低电平,然后第一行就会点亮;如果要点亮第一列,第一列就会点亮 a 脚接低电平,而(1、2、3、4、5、6、7、8)接高电平,则第一列将被点亮。由此可见,LED点阵的使用也很简单。
硬件设计
A5-A7开发板:
A5:
如果选择A5-A7.开发板可自由连接,如A5中的74HC595既可以连接J从而控制点阵线,P0端口连接J6-245芯片再连接列,也可连接J6-245芯片控制点阵列,P0端口连接J34从控制行。
A6:
A7:
软件编程
点亮一个灯
如点亮灯一,按照A2-A4开发板设计
代码
#include"reg52.h" typedef unsigned char u8; typedef unsigned int u16; sbit SRCLK=P3^6; sbit rCLK=P3^5;//RCLK c51已经定义,以避免重定义,因此定义为rCLK sbit SER=P3^4; #define LEDDZ_COL_PORT P0 void delay_1ms(u16 ms) {
u16 i,j; for(i=ms;i>0;i--) for(j=110;j>0;j--);//注意分号 } void delay_10us(u16 ten_us) {
while(ten_us--); } //HC595发送数据函数 void hc595_write_data(u8 dat) {
u8 i=0; for(i=0;i<8;i++)
{
SER=dat>>7;
dat<<=1; //dat=dat<<1
SRCLK=0; //设置时钟脉冲
delay_10us(1);//设置持续时间
SRCLK=1;
delay_10us(1);
}
rCLK=0;
delay_10us(1);
rCLK=1;
}
void main()
{
LEDDZ_COL_PORT=0x7f;
while(1)
{
hc595_write_data(0x80);
}
}
实验现象
显示数字
代码
#include"reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit SRCLK=P3^6;
sbit rCLK=P3^5;//RCLK c51内已经定义过了,避免重定义,所以定义为rCLK
sbit SER=P3^4;
#define LEDDZ_COL_PORT P0
u8 gled_row[8]={
0x00,0x3C,0x42,0x81,0x81,0x42,0x3C,0x00};//LED点阵显示数字0
u8 gled_col[8]={
0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
void delay_1ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);//注意分号
}
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
//HC595发送数据函数
void hc595_write_data(u8 dat)
{
u8 i=0;
for(i=0;i<8;i++)
{
SER=dat>>7;
dat<<=1; //dat=dat<<1
SRCLK=0; //设置时钟脉冲
delay_10us(1);//设置持续时间
SRCLK=1;
delay_10us(1);
}
rCLK=0;
delay_10us(1);
rCLK=1;
}
void main()
{
u8 i=0;
while(1)
{
for(i=0;i<8;i++){
LEDDZ_COL_PORT=gled_col[i];
hc595_write_data(gled_row[i]);
delay_1ms(1);//延时
hc595_write_data(0x00);
}
}
}
实验现象
显示图像
取模软件使用
取模软件不仅可以用来取汉字、数字等字符数据,还可以用来取图像数据,这里以“心”形图像为例,教大家如何使用该软件来获取图像数据。 (1)新建图像。弹出选择框,开发板 LED 点阵是 8X8 的,就建一个高 8 宽8 的。
(2)选中图像需用格点。这里每一个格点代表一个 LED 灯,点击可选中,再次点击也可取消。在界面上点出爱心。如下图:
(3)参数设置。“参数设置” 选项中有许多可选项,可以自己进行设置,得到自己想要的结果。可参考前面取模里面的设置。如下所示:
(4)生成数据。设计好图案和参数以后,就需要生成可用数据。当点击格式以后会出现相应数据。如下图所示:
这里将生成的图形数据复制出来粘贴到例程中,替换数字 0 的数据,如下: u8 gled_row[8]={0x38,0x7C,0x7E,0x3F,0x3F,0x7E,0x7C,0x38};//LED 点阵 显示图像的行数据其余代码与显示数字完全一样,这里就不再列出。
代码
#include"reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit SRCLK=P3^6;
sbit rCLK=P3^5;//RCLK c51内已经定义过了,避免重定义,所以定义为rCLK
sbit SER=P3^4;
#define LEDDZ_COL_PORT P0
u8 gled_row[8]={
0x38,0x7C,0x7E,0x3F,0x3F,0x7E,0x7C,0x38};//LED点阵显示爱心
u8 gled_col[8]={
0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
void delay_1ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);//注意分号
}
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
//HC595发送数据函数
void hc595_write_data(u8 dat)
{
u8 i=0;
for(i=0;i<8;i++)
{
SER=dat>>7;
dat<<=1; //dat=dat<<1
SRCLK=0; //设置时钟脉冲
delay_10us(1);//设置持续时间
SRCLK=1;
delay_10us(1);
}
rCLK=0;
delay_10us(1);
rCLK=1;
}
void main()
{
u8 i=0;
while(1)
{
for(i=0;i<8;i++){
LEDDZ_COL_PORT=gled_col[i];
hc595_write_data(gled_row[i]);
delay_1ms(1);//延时
hc595_write_data(0x00);
}
}
}
实验现象
显示汉字
代码
#include"reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit SRCLK=P3^6;
sbit rCLK=P3^5;//RCLK c51内已经定义过了,避免重定义,所以定义为rCLK
sbit SER=P3^4;
#define LEDDZ_COL_PORT P0
u8 gled_row[7][8]={
{
0x38,0x7C,0x7E,0x3F,0x3F,0x7E,0x7C,0x38},{
0x25,0xFF,0x2A,0x85,0x9A,0xBC,0xD1,0x1E},
{
0x25,0xFF,0x2A,0x85,0x9A,0xBC,0xD1,0x1E},{
0x7F,0xC9,0x49,0x7F,0x20,0xC8,0x41,0x7F},
{
0x00,0x08,0x10,0x01,0xFF,0x00,0x10,0x08},{
0x61,0x55,0x55,0xDF,0x55,0x57,0x61,0x00},
{
0x61,0x55,0x55,0xDF,0x55,0x57,0x61,0x00}};//LED点阵依次显示图像
u8 gled_col[8]={
0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
void delay_1ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);//注意分号
}
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
//HC595发送数据函数
void hc595_write_data(u8 dat)
{
u8 i=0;
for(i=0;i<8;i++)
{
SER=dat>>7;
dat<<=1; //dat=dat<<1
SRCLK=0; //设置时钟脉冲
delay_10us(1);//设置持续时间
SRCLK=1;
delay_10us(1);
}
rCLK=0;
delay_10us(1);
rCLK=1;
}
void main()
{
u16 k=100;
u8 i=0,j=0;
while(1)
{
for(j=0;j<7;j++){
while(k--){
//循环一次需要8ms,则k=100时,一个数字显示0.04秒
for(i=0;i<8;i++){
LEDDZ_COL_PORT=gled_col[i];
hc595_write_data(gled_row[j][i]);
delay_10us(5);//延时0.05ms
hc595_write_data(0x00);
}
}
delay_1ms(500);//延时500ms
k=100;
}
}
}