LED 的 595 串并转换驱动方案#
引脚连接#
下图取自Arduino多功能扩展板电路原理图。
引脚说明#
14脚:DS(SER),串行数据输入引脚
13脚:OE, 输出使能控制脚,它是低电才使能输出,所以接GND
12脚:RCK,存储寄存器钟输入引脚。上升沿时,数据从移位寄存器转存带存储寄存器。
11脚:SCK,移位寄存器时钟引脚,上升沿时,移位寄存器中的bit 数据整体后移,并接受新的bit(从SER输入)。
10脚:MR,低电平时,清空移位寄存器中已有的bit数据,一般不用,接高电平即可。
9 脚 :串行数据出口引脚。当移位寄存器中的数据多于8bit时,会把已有的bit“挤出去”,就是从这里出去的。用于595的级联。
Qx:并行输出引脚
From: 图解74HC595
为什么要两片595级连#
显示1位7段数码管数字需要8个引脚,每个595 只提供8个引脚,那么1个595刚好控制1个数位的显示。但是在显示2个或多个数字时,就需要2个或以上的595。
从多个数码管的位选不是用MCU引脚直接驱动,而是用一片595的输出作为位选,这样有利于节省单片机的引脚。
以此图为例,4位7段数码管的6,8,9,12引脚(左侧)确定位选信号,右侧的 595 (11,4,4,2,1,10,5,3 引脚)确定段选。一个595 最多8条线,可以最多控制8个位选。也就是说,2个595最少可控制2位,最多可控制8位。
两片或多片 595 级连使用时:将片选拉低后,将前后不同控制字节顺序发送(逐位移出所有控制字),然后拉高片选。
只用一片595#
只用一片 595 时,最多驱动8个 LED 或者一位7段数码管。
工作时序#
对照电路连接图,4位数码的控制原理如下:
串行 16bit 从左边的 14 引脚逐位移入,前面的8bit 进入右边的 U3 595,后面的 8bit 进入左边的 U2 595;
锁存触发信号到达,将前两个字节分别存入 U3 与 U2,其中 U2 的并行输出其实只会有一位为高,选中一位数码管,U3 则通过另一字节点亮和所需数字在数码管中的相应段。
下面说明595的时序图[1] 。该图较难理解的是 QA~QH。这8个引脚是并行输出,但它们并不是在8 bit 串行数据都到达后才输出,而是相应的位到达后,就立马在相应的位上立即会输出。只不过每一条位线只在自己的一个时间片接受输入,它的输出也只在该时间片与输入相同(实际是延迟一位的时钟时间),其它时间片时的值都为零。也就是说,8个并行引脚的输出的占空比都只有 1/8,并且其波特率是串行输入的 1/8。
疑问#
从微观上讲,一位数码管的8段还是在不同的时间被点亮的。另一方面,但这8位并行输出作为片选时,它也只在一个字的发送时间的 1/8 的时间有效。要点亮一个数字,既需要位选被选中,又需在段选选中,那么在位选与段选都只有部分时间有效时,会不会造成数字显示不完整,即有的段不能被点亮?
Output 是连接在 Storage Register 上,它相当于一个保持器。如果是这样,只需点亮一次即可?几种验证方法:
在程序中验证。在 setup() 部分只点亮一位,检查能不能保持常亮,若能,说明有保持功能。不要用点亮多位来验证,因为多位数码管需要分时输入数据被轮流点亮。??? Max7219 是否可以点亮一次后所有数码管常亮?似乎是可以,这说明 Max7219 驱动方案要更好,可以无开销地保持原图案,少频闪,更少消耗 CPU 时间。
用示波器验证。
通过 595 datasheet 上的电路原理图的锁存单元的功能上分析。
示例代码#
函数 print1digit() 定义了在指定位显示一个数字的功能。
int latchPin = 7;
int clockPin = 6;
int dataPin = 8;
// 在指定位上打字一个数字
// chan: 数字位,从左边开始记数
void print1digit(int chan, int number)
{
digitalWrite(latchPin, LOW); //将ST_CP口上面加低电平让芯片准备好接收数据
shiftOut(dataPin, clockPin, MSBFIRST,Dis_table[number]); //发送显示的数值编码
shiftOut(dataPin, clockPin, MSBFIRST,Dis_buf[chan] ); //发送通值 0-3
digitalWrite(latchPin,HIGH); //将ST_CP这个针脚恢复到高电平
delay(2); //延时2ms
}
讨论#
595 移位锁存寄存器的时序就是 SPI 吗?从宏观上看是如此?
文章 [2] 对如何移位发送,以及模拟多个引脚的时序、延时、和同步,给出了详细的示例。
Reference#
In-Depth: How 74HC595 Shift Register Works & Interface with Arduino
The 74HC595 Shift Register | Eight LEDs and a Shift Register | Adafruit (包含亮度控制)
74HC595 Shift Register Arduino Interfacing, Pinout, Working (多个例子)
Serial to Parallel Shifting-Out with a 74HC595 | Arduino Documentation