1 LED点阵简介
1.1 什么是LED点阵
(1)外观。
(2)作用。
(3)内部构造原理图。点阵的优势就是8+8个IO口独立控制8*8个LED亮灭。
(4)LED点阵如何工作。
1.2 如何驱动LED点阵
(1)单片机端口直接驱动。要驱动8*8的点阵需要2个IO端口(16个IO口)、要驱动16*16的点阵需要4个IO端口(32个IO口)。
(2)使用串转并移位锁存器驱动。要驱动16*16点阵只需要4个74HC595+3个IO口即可(数据口、SCLK、RCLK)。
SER 10101100 同一个引脚不同的时间送进来,串入(串行输入)
QA 1 同时在不同引脚输出,并出(并行输出)
QB 0
… …
QH 0
2 原理图分析
2.1 POS1-16和NEG1-16分别接移位锁存器并行输出端
(1)POS就是Positive正极,NEG是negetive负极。
2.2 74HC595的接法分析
(1)QA-QH8路并行输出接到点阵的一个端口。
(2)QH’串行输出口接下一个74HC595的串行输入SER(串联顺序按照ABCD)。
(3)SER串行输入接:第一个595的SER通过跳线帽JP595接P3.4,后面的每一个SER接前一个的QH’。这样就构成了ABCD4个595芯片依次串联。所以将来编程时整个4个74HC595的串行数据都是从P3.4出来的。
(4)SCLK(SRCLK)接P3.6。
(5)RCLK接P3.5。
总结:
(1)SCLK和RCLK是一样的接法,都在接在P3.5和P3.6上。
(2)总共涉及到的IO口有3个:P3.4、P3.5、P3.6。
(3)外部接线重点:2个8pin杜邦线+1个跳线帽(JP595)。
3 LED点阵编程实践
3.1 74HC595的时序分析
(1)芯片与芯片之间的通信,都是按照一定的时序进行的。
(2)时序就是芯片与芯片之间的通信引脚上电平变化以时间轴为参考的变化顺序。
(3)时序是通信双方事先定义好的,通信的发送方必须按照时序来发送有意义的信息,通信的接收放按照时序去接收解析发送方发来的电平变化信息,然后就知道发送方要给我发送什么东西了。
(4)我们编程时:发送方是单片机,接收方是74HC595。因为595芯片本身是不能编程的,他的时序芯片出厂时已经设定好了。因此我们单片机必须迁就595芯片,按照595芯片的时序来给他发信息。
(5)所以我们要先搞清楚74HC595的时序规则。595的芯片手册上就有它的时序描述(时序图),参考描述就可以明白595芯片的时序规则,然后将其用编程语言表述出来就是程序了。
(6)74HC595的时序关键是:SCLK和RCLK。SCLK是移位时钟,595芯片内部在每个SCLK的上升沿会对SER引脚进行一次采样输入,就向595内部输入了1位,如此循环8次就输入了8位二进制。RCLK是锁存时钟,QA-QH的8位并行输出信号在RCLK的上升沿进行一次锁存更新。(锁存的含义是指在下一次锁存之前维持输出引脚的电平信号不变,但是如果不进行锁存的话,输出引脚的电平还是会随着输入引脚电平的变化而发生变化)。
(7)理解74HC595芯片的通信时序关键,其实就是:SER进行数据的串行输入,SCLK提供移位时钟,RCLK提供锁存时钟。
3.2 sbit定义位变量
(1)之前编程都是直接操作一个IO端口,可以用端口名(P0、P1)来整体操作一个IO端口中的8个引脚。但是这种方法不能操控单独1个IO口。
(2)今天编程需要单独操作1个IO引脚,譬如要操作P3.4,但是直接写P3.4的话C语言是不认识的,而必须使用sbit关键字来定义一个引脚。
sbit SER = P3^4;
3.3 全屏点亮测试
总结:
(1)编写硬件控制代码,时序理解是关键。只要时序理解正确的,并且代码按照时序的要求去写,就没问题。
(2)时序操作部分的代码只要写好了并且是正确的,下来这一块就没问题了,很简单了,因为它是死板的不变的。
#include <reg51.h>
sbit SER = P3^4; // 74HC595的串行输入端
sbit RCLK = P3^5; // 锁存时钟
sbit SCLK = P3^6; // 移位时钟
void main(void)
{
unsigned char i = 0;
unsigned char d1, d2, d3, d4; // 要给4个595并行输出端输出的值
d1 = 0;
d2 = 0;
d3 = 0xff;
d4 = 0xff;
SCLK = 0;
RCLK = 0;
for (i=0; i<8; i++)
{
SER = d1 >> 7; // 将d1的最高bit取出来给SER
SCLK = 0;
SCLK = 1; // 2步制造了一个SCLK的上升沿
d1 = d1 << 1;
}
// 至此已经在8个SCLK上升沿把d1的8位依次全部发出去了
// 但是还没有进行锁存,所以QA-QH还没东西</