其实看到025大神的帖子后半段的人大概都能了解keng板的控制原理了吧,那么我在这里附一张图来为大家讲解一下keng板。
先借用一下pengchang大蜀熟给我的keng板原理图(我也忘了作者是谁)
那么这张图就表示了三个595芯片的连接状态。先讲最基础的吧,三个595分别控制后六列LED的负极、前八列LED的负极、五行LED的正极。为什么是负极呢,这个就要去查GH60原理图了。三个595首尾相连,所以在代码里面对应的就是三条SPI.transfer放在一起,与之一一对应。
有些细心的同学如果在这个时候比对上一楼给出的全灯亮的代码就可能会疑问了:这对应关系是不是错了啊?
我很负责任的告诉大家:没错。因为这个涉及到了595级联的知识。
请允许我引用pengchang大蜀熟的形象的比喻吧:
你把数据看成一队小学生 一共3*8 24个
595看成3个可以站八个人 并且出口入口相连的房子
0x多少代表学生性别
你的clk就是命令
一个clk就进一个学生
发了8个之后 第一间房占满了8个小学生
你继续发这一队学生继续往前走 这时候第一个进去的小学生会走到第二间房子的第一个位子
以此类推 24个学生都走进来的时候 最先进来的八个人已经在第三间房子了
SPI.transfer(0x00); SPI.transfer(0xff); SPI.transfer(0xff);
为啥要这样对LED进行这样“复杂”的控制呢?估计有些大神看到这里要笑了,那你们就先跳过去,这一段给我们这样的无脑小白讲一讲吧。
先来一张表示LED灯阵控制大体原理的图片
(图片转自百度文库)
这是讲解了LED灯阵的控制原理。我们可以把Nano 328芯片理解为控制芯片,是控制者;而那三块595就是执行者,控制行列的通断电。
有些小白朋友可能会感到奇怪,为毛要用0x00 这样奇怪的字符来控制595的输出呢?如果你真想到这里请先打自己屁股!!快去前面看原理图。每个595有8个引脚(第九个是作为通讯的),每个引脚的输出高低电平用0 1表示。0表示低电平,1表示高电平。所以595的输出情况就可以用8位二进制数字表示了。(比如00011000)
为什么要用16进制的数字来替换呢?我也不知道,但是至少两位的16进制数字可以表示8位二级制数字。
这样就好理解关于这些SPI代码的意义了吧。
这里送出来自己瞎写的双排流水灯代码:
#include <SPI.h> void setup() { pinMode (8, OUTPUT); pinMode (9, OUTPUT); pinMode (10, OUTPUT); digitalWrite(8, HIGH); SPI.begin(); digitalWrite(10, LOW); SPI.transfer(0x00); SPI.transfer(0xff); SPI.transfer(0xff); digitalWrite(10, HIGH); digitalWrite(9, LOW); delay(100); } void loop() { int i; for(i=1;i<256;i*=2) { digitalWrite(10, LOW); SPI.transfer(0xff); SPI.transfer((byte)(0xff-i)); SPI.transfer((byte)(0xff-i)); digitalWrite(10, HIGH); delay(50); } }
在这里感谢一下pengchang大蜀熟帮助我来理解代码