1.LED灯排线图
1.该线为共阳极点阵图,一行的阳极都是接在一条线上的
如果要亮第一排第一个灯,需要9号行位置为1(即5V),13号列为0(即0V)形成电流,该灯就亮。
2.故行为1000 000控制只有第一行有入口是高电压的,列为0111 1111控制只有第一列为低电压。
控制一个LED灯可以直接控制,但控制两个不在同一行的LED灯得用动态显示。
3.动态思想:我们确认好每行亮那几个LED灯,然后用1000 0000不断右移动,每次只亮一行的LED灯,然后每行变化很快(其实每次只有一行亮,但因为切换快,人眼看到是所有行),就可以看到显示所要显示的灯。
2.LED点阵屏的连接(74HC595)
8*8有16个接口,而16乘16就有32个接口,而通常都是成千上万的LED灯,不可能都用单片机的接口,这样耗费资源,故就用到74H595芯片。
3. 74HC595
74HC595芯片是一种串入平出的芯片,广泛用于LED屏显示。
串行平出就是8位数据可以一个一个排队通过一条通道,然后多行输出
平行平入就是一位数据一个通道,这样虽然很快,但是耗费的接口很多,然而LED并不需要这么快。
1.Q0到Q7就是数据输出端,连接8个LED灯端口
2.Q7’(第九脚)是串行数据输出,(连接的是两个该芯片,有16个端口,会传入16位数据,但都是只传入到第一片芯片中,然后由Q7‘把数据不断分配)(这个连到下一片的ds端口,没有下一片就不连)。
3.MR(第10脚),低电平时将寄存器数据清除,所有通常直接连到电源(开机就保存数据,关机就没)。
4.SH-CP(14脚),数据输入时间线,每片芯片的该端口都连到一个I/O口,通过产生一次上升沿(数据从0变成1,即电压从0V到5V),就录入一位数据到芯片寄存器内。
5.ST-CP(第12脚),通过产生一次上升沿(数据从0变成1,即电压从0V到5V),输出存在该芯片内寄存器的数据,直接8位数据通过Q0到Q7输出。
6.OE(第13脚),当它为高电平时为高阻态,所有通常把它接入地线。
所以只有到三个接口就可以控制到88的点阵屏(如果要1616的点阵屏,就在接两个该芯片,同样是3个接口)。
三个接口中
CLK为控制接收数据节奏(通过上升沿一位位接受)。
DI为传入数据的端口。
LE控制全部输入数据到寄存器内时输入到每个芯片的8个接口(通过上升沿直接全部输出)。
代码展示
这是阳极LED点阵,只有阴极用到了74HC595
#include "reg51.h"
#include "intrins.h"
typedef unsigned int u16;
typedef unsigned char u8;
u8 ledduan[] ={0x7E,0x3C,0x00,0x81,0x81,0xC3,0xE7,0xFF
};//每行亮的位置
sbit SRCLK=P3^6; //移位数据时钟
sbit RCLK=P3^5; //输出数据时钟
sbit SER=P3^4; //数据输入口(一位一位)
void delay(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);
}
void Hc595SendByte(u8 dat) //74HC595芯片使用的程序
{
u8 a;
SRCLK = 0;
RCLK = 0; //全部归0,以便拉高形成上升沿
for(a=0;a<8;a++)
{
SER = dat >> 7; //接受第8位数据
dat <<= 1; //通过数据左移动,不断接受所有数据
SRCLK = 1; //每得到一位就通过移位数据时钟(为一,产生上升沿)传入寄存器
SRCLK = 0; //归0
}
RCLK = 1; //数据8位直接输出
RCLK = 0;
}
void main()
{
u8 i,ROW;
while(1)
{
ROW = 0x80; //从第一行开始1000 0000
for(i=0;i<8;i++)
{
P0=ledduan[i]; //我们这开发板是8个口是直接连到P0位置端口,这是阳极
Hc595SendByte(ROW); //发送列数据,阳极对应的行与阴极对应亮那里就控制了这一行亮的灯
ROW = _cror_(ROW,1); //控制阳极的”1“位移,需要用到头文件。
}
}
}
结果