分享

利用74HC595控制8X8LEDs矩阵的探讨

 wtrues 2017-04-28
一、简述
8X8LED是矩阵,即由8X8总共64个LED依次有序排列而成的。如下图:
利用74HC595控制8X8LEDs矩阵的探讨X
1088BSLEDS矩阵
而它的原理和内部结构如下图:
利用74HC595控制8X8LEDs矩阵的探讨LEDs矩阵原理图
为了方便区分,我用大写英文字母A-H分别代表了LED正极的行序。用数字1-8分别代表了LED阴极的列序。
当然,实际上的LEDs矩阵针脚并没有原理图上这么简单,当你拿到一个LEDs矩阵的时候?,切记要浏览一下它的说明,确定针脚的和矩阵的对应位置后再连接使用。如果你没有LEDs的型号,比如你使用的是旧点的,喷码已经被磨损了,那你只好自己使用万用表,一个一个针脚去确定。笔者使用的LEDs1088BS的针脚分布就是笔者自己使用万用表确定的,其实过程还是蛮有趣的。:-D
以下就是1088BS我自测的针脚分布:
利用74HC595控制8X8LEDs矩阵的探讨LEDs矩阵的正反依靠一边的型号喷码和凸起辨认
利用74HC595控制8X8LEDs矩阵的探讨自测的1088BSLEDs矩阵针脚分布
二、硬件连接
自此可以看出,单靠Arduino板来控制8X8LEDs矩阵至少需要16个I/O接口,但市
面上很多Arduino板最多只有13个?I/O接口,更别说还想要增加什么控制单元了。
为了解决这个问题,所以引入了74HC595芯片来相对应的减少Arduino板上所需的?I/O接口。
以下是74HC595芯片的封装图:
利用74HC595控制8X8LEDs矩阵的探讨74HC595封装图
这里简单说一下74HC595芯片的作用吧。
它是一个将串行信号输入后并行输出的芯片。比如,输入的信号为?8那么输出信号就是8的二进制信号(00001000)的并行输出。如果将LEDs矩阵8个针脚看做是二进制的信号,那么两个74HC595芯片正好可以控制LEDs矩阵正负极的16个针脚。
同时说明一下,74HC595最大的输出信号为255(11111111),也就是说它可以也仅可以单独输出0(00000000)-255(11111111)的信号。
不过,控制一个8X8的LEDs矩阵是绰绰有余了。?
注:多个74HC595串连的输出以及74HC595的连接控制方式等详细说明请查阅有关74HC595芯片的相关博文。?
接下来,就是硬件连接了:
利用74HC595控制8X8LEDs矩阵的探讨LEDs矩阵及74HC595硬件连接
利用74HC595控制8X8LEDs矩阵的探讨LEDs矩阵及74HC595硬件连接示意图
在示意图中,1号74HC595芯片负责控制LEDs矩阵正极,将正极序A-H分别连接芯片Q0-Q7管脚,同理2号负责负极,为了保护LEDs矩阵,负极连接时需通过电阻限流,笔者用的是300Ω的8个电阻。两个74HC595芯片Vcc电源管脚和SCLR管脚连接Arduino板的5V,GND连接Arduino板的GND。
因为是同时控制两个芯片,所以两个芯片的RCK脚可以同时连接到同一个Arduino板的输出?接口5,而SI和SCK管脚则需分别连接在四个Arduino板的输出?接口上。
笔者将2、3输出接口分别连接在1、2号芯片的SI管脚上,4、6?分别连接两个SCK管脚。
至于这些管脚的作用和其他管脚的作用及使用,详见?有关74HC595芯片的相关博文。
在编程中我们使用shiftOut()函数,所以这些连接好后其他的可以先不考虑。
三、程序
所有的硬件连接完毕后就可以下载程序了。如下就是一个简单的程序:
int latch=5;
int clock1=4;
int clock2=6;
int data1=2;
int data2=3;
void setup()
{
pinMode(latch,OUTPUT);
pinMode(clock1,OUTPUT);
pinMode(clock2,OUTPUT);
pinMode(data1,OUTPUT);
pinMode(data2,OUTPUT);
}
void loop()
{
for(int i=1;i<>
{
digitalWrite(latch,LOW);
shiftOut(data1,clock1,MSBFIRST,i);
shiftOut(data2,clock2,MSBFIRST,0);
digitalWrite(latch,HIGH);
delay(1000);
}
}
它的效果如下:


再来一发:
int latch=5;
int clock1=4;
int clock2=6;
int data1=2;
int data2=3;
void setup()
{
pinMode(latch,OUTPUT);
pinMode(clock1,OUTPUT);
pinMode(clock2,OUTPUT);
pinMode(data1,OUTPUT);
pinMode(data2,OUTPUT);
}
void loop()
{
for(int i=1;i<>
{
digitalWrite(latch,LOW);
shiftOut(data1,clock1,MSBFIRST,i);
shiftOut(data2,clock2,MSBFIRST,255-i);
digitalWrite(latch,HIGH);
delay(500);
}
}
它的效果如下:

这仅是两个简单的例子,但可以看出这种方式控制方法要比将LEDs矩阵直接连接在Arduino板上要方便快捷。因为仅需依照自己的需求更改shiftOut()函数的输出信号就可以形象的控制LEDs矩阵的效果了。:-D
之后我会陆续放出自测成功的各种LEDs变化效果的函数,或是其他好玩的程序出来分享。?
四、之后的探讨
在试过各种效果之后我们不难发现,这种原理的LEDs矩阵也有着不能实现的效果。
例如:
利用74HC595控制8X8LEDs矩阵的探讨示意图
当我们需要让左面两个灯亮起来时,A、C分别给予信号1。2给予信号0。
当我们需要让右边那个灯亮起来时,B给予信号1。3给予信号0。
可当这样的时候,B2、A3、C3的灯也会亮起来。
所以,这种形式的效果在这种原理的单个LEDs矩阵中是无法实现的。??

声明:如需转载请告知本人。
想和我一起探讨更多有关Arduino的,可以订阅我的博客或是关注我的微博哦。?:-D

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多