上图是CS1088B的8x8
LED点阵的部分技术文档截图,最下面就是这个点阵模块的基本电路图。
其实很简单,每一横行控制LED的一极,每一竖列又控制LED的另一极。又因为是一个矩阵,所以每一个LED都有一个控制其单独发光的一个二进制值,能控制8x8坐标轴上任意一个LED的亮灭。
举个例子,假设每一横行我都接LED的正极,即基本电路图中的位置9、14、8、12、1、7、2、5位置,都接主机(如第一片74HC595D)的正极(如第一片74HC595D的8个并出口QA~QH),每一列我都接LED的负极即基本电路中
的位置13、3、4、10、6、11、15、16,都接主机(如第二片)的负极(如第二片74HC595D的8个并出口QA~QH)。
连接好以后,等于构成了完全控制LED正负极电平的能力,在程序中给8x8坐标轴内对应的LED点发送指定的高低电平信号就可以灵活控制其的亮灭。
以上为两片74HC595D串联后和8x8点阵连接的电路图,单片机和74HC595D连接省略。
注意:
控制LED点阵行(正极)的,第一片的QA要从LED点阵的正向的从上往下数,第一行开始连接,一直连接到第一片的QH结束
控制LED点阵列(负极)的,第二片的QA要从LED点阵正向从左往右数,第一列开始连接,一直连接到第二片的QH结束
这里的连接开始和结束顺序直接决定了后面程序中向74HC595D芯片送入的16位数据中,每个二进制位对应控制的行和列,所以一定要连接正确
规律:每颗LED的正极都接横行,每颗LED的负极都接竖列
规律:第一片74HC595D控制LED点阵的横行,第二片74HC595D控制LED点阵的竖列
对应实际焊接完成的电路,方向、位置对应如下图:
此电路板是7cmx9cm的,底部标有“7CM*9CM”字样的,就是将来显示汉字的底边,对应的一边就是汉字的顶边。这幅图就是字体正确的显示方向。
红色字标出的位置分别接第一片74HC595D的8个并出口,来控制ELD点阵的正极;蓝色字标出的位置分别接第二片74HC595D的8个并出口,来控制ELD点阵的负极。
这样将实物和电路图对照一下,就很清晰了。在焊接上为了方便和美观,接第二片的负极(列)做了个右侧的走向。
常规情况下,电路中使用单颗74HC595D芯片,从串行数据的输入到并行数据的输出,要经历以下3个步骤:
注意:
刚才有提到,后面写程序控制点阵时,要向74HC595D发送16位二进制数据。
两片74HC595D串联后,就有16个并出引脚,正好对应这16位二进制数据。其中的8位数据控制行,另外8位数据控制列。
下面来看一个示意图,看看16位二进制数中的每一位是如何控制行和列的:
再次回顾电路图:
第一片74HC595D的8个并出引脚,分别连接LED点阵每一行的正极位置,即:第一片74HC595D控制行
第二片74HC595D的8个并出引脚,分别连接LED点阵每一列的负极位置,即:第二片74HC595D控制列
注意:
由于两片74HC595D是串联的,也就是说,如果先发送了一个8位数据,那么是先会进到第一片74HC595D的锁存器中的。**同时遵循“先送高位,再送低位,由高位至低位输送”的原则,最先送入的数据在最高位(QH引脚对应的移位寄存器中),最后送入的数据再最低位(QA引脚对应的移位寄存器中)。
此时第一片74HC595D中已有8位数据了。再继续发送8位数据,那么在第一片74HC595D中的8位数据,会被逐次挤到第二片74HC595D中。也就是说,第一片74HC595D移位寄存器中的8位数据是第二次发送的新的8位数据。
第一片74HC595D的8个并行输出引脚,分别连接LED点阵每一行的正极位置。
即:第一片74HC595D控制行。那么想要某个LED亮,这个LED所在行必须要输入高电平
第二片74HC595D的8个并行输出引脚,分别连接LED点阵每一列的负极位置。
即:第二片74HC595D控制列。那么想要某个LED亮,这个LED所在行必须要输入低电平
上面两个条件必须同时成立,某个LED才会因为两端有电位差而亮起。
行(从上到下)(对应第一片74HC595D)值依次为:0 1 0 0 0 0 0 0
列(从左到右)(对应第二片74HC595D)值依次为:1 0 1 1 1 1 1 1
以上16位值就是单独点亮第二行第二列的LED的正确值。但是顺序还需要验证一下,要和电路图对应。
按照“先输入列,后输入行”的规律,先要输入第二片74HC595D的8位串行数据。那么每一次输入到芯片内的原理释义如下:
第二片74HC595D – 第1次输入串行数据:1 | ||||||||
---|---|---|---|---|---|---|---|---|
并出引脚符号 | QH | QG | QF | QE | QD | QC | QB | QA |
锁存器(存储寄存器) | ||||||||
移位寄存器 | ||||||||
SI串行输入数据 | 1 | 空 | 空 | 空 | 空 | 空 | 空 | 空 |
第二片74HC595D – 第2次输入串行数据:0 | ||||||||
并出引脚符号 | QH | QG | QF | QE | QD | QC | QB | QA |
锁存器(存储寄存器) | ||||||||
移位寄存器 | ||||||||
SI串行输入数据 | 1 | 0 | 空 | 空 | 空 | 空 | 空 | 空 |
第二片74HC595D – 第3次输入串行数据:1 | ||||||||
并出引脚符号 | QH | QG | QF | QE | QD | QC | QB | QA |
锁存器(存储寄存器) | ||||||||
移位寄存器 | ||||||||
SI串行输入数据 | 1 | 0 | 1 | 空 | 空 | 空 | 空 | 空 |
第二片74HC595D – 第4次输入串行数据:1 | ||||||||
并出引脚符号 | QH | QG | QF | QE | QD | QC | QB | QA |
锁存器(存储寄存器) | ||||||||
移位寄存器 | ||||||||
SI串行输入数据 | 1 | 0 | 1 | 1 | 空 | 空 | 空 | 空 |
第二片74HC595D – 第5次输入串行数据:1 | ||||||||
并出引脚符号 | QH | QG | QF | QE | QD | QC | QB | QA |
锁存器(存储寄存器) | ||||||||
移位寄存器 | ||||||||
SI串行输入数据 | 1 | 0 | 1 | 1 | 1 | 空 | 空 | 空 |
第二片74HC595D – 第6次输入串行数据:1 | ||||||||
并出引脚符号 | QH | QG | QF | QE | QD | QC | QB | QA |
锁存器(存储寄存器) | ||||||||
移位寄存器 | ||||||||
SI串行输入数据 | 1 | 0 | 1 | 1 | 1 | 1 | 空 | 空 |
第二片74HC595D – 第7次输入串行数据:1 | ||||||||
并出引脚符号 | QH | QG | QF | QE | QD | QC | QB | QA |
锁存器(存储寄存器) | ||||||||
移位寄存器 | ||||||||
SI串行输入数据 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 空 |
第二片74HC595D – 第8次输入串行数据:1 | ||||||||
并出引脚符号 | QH | QG | QF | QE | QD | QC | QB | QA |
锁存器(存储寄存器) | ||||||||
移位寄存器 | ||||||||
SI串行输入数据 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 |
可以看到上面8次输入串行数据,每一次输入进去的新数据用红色加粗字体表示。确实是由高向低位逐个送入的。
按照“先输入列,后输入行”的规律,再输入第一片74HC595D的8位串行数据。那么每一次输入到芯片内的原理释义如下:
第一片74HC595D – 第9次输入串行数据:0 | ||||||||
---|---|---|---|---|---|---|---|---|
并出引脚符号 | QH | QG | QF | QE | QD | QC | QB | QA |
锁存器(存储寄存器) | ||||||||
移位寄存器 | ||||||||
SI串行输入数据 | 0 | 空 | 空 | 空 | 空 | 空 | 空 | 空 |
第一片74HC595D – 第10次输入串行数据:0 | ||||||||
并出引脚符号 | QH | QG | QF | QE | QD | QC | QB | QA |
锁存器(存储寄存器) | ||||||||
移位寄存器 | ||||||||
SI串行输入数据 | 0 | 0 | 空 | 空 | 空 | 空 | 空 | 空 |
第一片74HC595D – 第11次输入串行数据:0 | ||||||||
并出引脚符号 | QH | QG | QF | QE | QD | QC | QB | QA |
锁存器(存储寄存器) | ||||||||
移位寄存器 | ||||||||
SI串行输入数据 | 0 | 1 | 0 | 空 | 空 | 空 | 空 | 空 |
第一片74HC595D – 第12次输入串行数据:0 | ||||||||
并出引脚符号 | QH | QG | QF | QE | QD | QC | QB | QA |
锁存器(存储寄存器) | ||||||||
移位寄存器 | ||||||||
SI串行输入数据 | 0 | 1 | 0 | 0 | 空 | 空 | 空 | 空 |
第一片74HC595D – 第13次输入串行数据:0 | ||||||||
并出引脚符号 | QH | QG | QF | QE | QD | QC | QB | QA |
锁存器(存储寄存器) | ||||||||
移位寄存器 | ||||||||
SI串行输入数据 | 0 | 1 | 0 | 0 | 0 | 空 | 空 | 空 |
第一片74HC595D – 第14次输入串行数据:0 | ||||||||
并出引脚符号 | QH | QG | QF | QE | QD | QC | QB | QA |
锁存器(存储寄存器) | ||||||||
移位寄存器 | ||||||||
SI串行输入数据 | 0 | 1 | 0 | 0 | 0 | 0 | 空 | 空 |
第一片74HC595D – 第15次输入串行数据:1 | ||||||||
并出引脚符号 | QH | QG | QF | QE | QD | QC | QB | QA |
锁存器(存储寄存器) | ||||||||
移位寄存器 | ||||||||
SI串行输入数据 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 空 |
第一片74HC595D – 第16次输入串行数据:0 | ||||||||
并出引脚符号 | QH | QG | QF | QE | QD | QC | QB | QA |
锁存器(存储寄存器) | ||||||||
移位寄存器 | ||||||||
SI串行输入数据 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
可以看到上面8次输入串行数据,每一次输入进去的新数据用红色加粗字体表示。确实是由高向低位逐个送入的。
注意:
源代码:
/**
* 单文件实验程序
* 两片74HC595D串联后,控制5*6LED点阵
*
* Created by SteveJrong on 2019/12/22.
* Version: 1.0
*
* Copyright 2019 SteveJrong. All rights reserved.
*/
#include
// 定义STC89C52RC给74HC595D输入串行数据的引脚(物理编号:14)
sbit SI_DS = P1 ^2;
// 定义STC89C52RC连接74HC595D存储寄存器的引脚(物理编号:12)
sbit RCK_STCP = P1 ^3;
// 定义STC89C52RC连接74HC595D移位寄存器的引脚(物理编号:11)
sbit SCK_SHCP = P1 ^4;
// 定义STC89C52RC连接74HC595D移位寄存器清零输入的引脚(物理编号:10)
sbit SCLR_MR = P1 ^5;
// 定义STC89C52RC连接74HC595D输出使能控制端的引脚(物理编号:13)
sbit G_OE_SHCP = P1 ^6;
void delay(unsigned int n) {
int i, j;
for (i = n; i > 0; i--)
for (j = 110; j > 0; j--);
}
/**
* 并行输出数据
* 向74HC595D的锁存器(存储寄存器)时钟输入引脚发送高低电平信号,通知74HC959D将存在锁存器内的数据并行输出到QA~QH引脚上
*/
void lighting() {
RCK_STCP = 1;
delay(1);
RCK_STCP = 0;
}
void disable_output() {
G_OE_SHCP = 1;
}
void enable_output() {
G_OE_SHCP = 0;
}
/**
* 发送串行数据到74HC595D
*
* @param inputData 要传入的数据
*/
void send_data(int binaryArray[]) {
int i = 0;
for (; i < 16; i++) {
SI_DS = binaryArray[i];
SCK_SHCP = 0;
SCK_SHCP = 1;
}
}
/**
* 主入口
*/
void main() {
int i = 0, j = 0, binaryArray[1][16] = {
{1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0},
};
// 初始时,存储寄存器置为低电平
RCK_STCP = 0;
// 初始时,移位寄存器置为低电平
SCK_SHCP = 0;
enable_output();
for (; i < 1; i++) {
send_data(binaryArray[i]);
lighting();
}
}
可以看到,程序预期执行,点亮了第二行第二列的LED。
项目仓库地址:
https://gitee.com/stevejrong1024/festive-lantern.git
文件:
labs / lab5.c
另外在以下位置增加了一个8x8点阵的16位二进制数生成器,就不用一个个对着电路图去手写了。网页上勾选好checkbox以后,直接粘贴进ten这个三维数组中即可。注意要改三维数组中一维和二维的数组总长度:
labs / lab5-led-font-generator / led-font-generator.html
已知问题: