动手学arduino(10)74HC595来控制数码管

有读者可能会问:为什么要用74HC595来控制数码管,是否多此一举?

上例中,用Arduino控制8个数码管,占用8个I/O端口。Arduino UNO只有 20个I/O口,仅数码管一个元件就占用8个端口,太浪费资源了。

使用74HC595的目的就是减少arduino I/O口的使用数量。引入74HC595后,可以用3个数字I/O口控制一个数码管,节约5个I/O口。

(下面一段看不懂没关系)

74HC595具有8位移位寄存器和一个存储器,三态输出功能。 移位寄存器和存储器有相互独立的时钟。数据在SH_cp(移位寄存器时钟输入)的上升沿输入到移位寄存器中,在ST_cp(存储器时钟输入)的上升沿输入到存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。

动手学arduino(10)74HC595来控制数码管

74HC595接在arduino与数码管之间,起到桥梁作用。连接方法如下:

①数码管的ABCDEFGH依次接芯片的Q7-Q0(依次!),数码管COM1,COM2(3,8)接+5v。
动手学arduino(10)74HC595来控制数码管
②74HC595的16、10脚接5v,13,8脚接地,11,12,14脚接arduino三个端口(本例中为4,5,2),Q0-7接数码管,9脚为扩展引脚,本例中空着。动手学arduino(10)74HC595来控制数码管
图中数码管的限流电阻为560欧姆。如果用220欧姆,仿真时提示74HC595会烧毁,但实际电路中不会出现烧毁芯片的现象。
 

74HC595各引脚功能介绍(看不懂没关系)
GND接地,VCC接5V电源,这个就不用说了。
Q0-Q7这8根引脚是芯片的输出引脚,直接跟数码管的8段引脚相连。
DS是串行输入引脚,所谓串行就是使数据在一根信号线上按顺序一位一位地传输,就像一串糖葫芦。
SHCP是移位寄存器的时钟引脚。SHCP发生一次上升沿的时候,74HC595从DS引脚上取得当前的数据(高/低电平)并把取到的这一位数据保存到移位寄存器里。
当我们向芯片发送数据时,要先在DS引脚上准备好要传送的数据,然后制造一次SHCP引脚的上升沿(先拉低电平再拉高电平),74HC595会在这个上升沿将DS引脚上的数据存入移位寄存器D0,同时D0原来的数据会顺移到D1,D1的数据位移到D2…D6的数据位移到D7。而原先D7的数据已经没有地方储存了,这一位数据会被输出到引脚Q7S上。(注意这里说的不是输出引脚Q0-Q7,而是指内部的8位移位寄存器里每一个“小房间”,芯片手册上并没有给这些小房间编号,这里为了说明方便进行了编号)
STCP是芯片内部另外一个8位锁存寄存器的时钟引脚。当移位寄存器的8位数据全部传输完毕后,制造一次锁存器时钟引脚的上升沿(先拉低电平再拉高电平)。74HC595会在这个上升沿将移位寄存器里的8位数据复制到锁存器中(锁存器里原来的数据将被替换)。注意,到这里为止,这8位数据还只是被保存在锁存器里,并没有输出到数码管上。
OE是输出使能引脚,在其他芯片里也很常见。作用是控制锁存器里的数据是否最终输出到Q0-Q7输出引脚上。低电平时输出,高电平时不输出(既不是高电平,也不是低电平而是高阻态,不通电)。本例为了方便直接接在GND上使其一直保持低电平输出数据。
MR是用来重置内部寄存器的引脚。低电平时重置内部寄存器。本例为了方便直接连接在Vcc上一直保持高电平。
Q7S引脚,串行输出引脚,本例不使用。
 
仿真效果: