▪ 基本信息
74HC595 具有 8 位移位寄存器和一个 存储器,三态输出功能(可以认为是74HC164的高配版本)。
移位寄存器和存储器有相互独立的时钟;数据在SH_CP(移位寄存器时钟输入)的上升沿输入到移位寄存器中,在ST_CP(存储器时钟输入)的上升沿输入到存储寄存器中去。
如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。
移位寄存器有一个串行移位输入(DS),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。8位串行输入/输出或者并行输出移位寄存器,具有高阻关断状态。三态。将串行输入的8位数字,转变为并行输出的8位数字,例如控制一个8位数码管,将不会有闪烁。
通过上面的介绍可以知道 74HC595 是一个串转并的CMOS芯片,其拥有锁存功能(这点是和 74HC164 主要的区别),也就是说在8位数据传输到芯片移位寄存器的过程中输出引脚Q0~Q7并不会改变,而是保持上一个状态,当给一个上升电平给 ST_CP 引脚时则会将 移位寄存器中的数据送到存储器中去。
▪ 引脚定义
针脚 | 针脚 | 英文 | 详细说明 |
---|---|---|---|
Q0~Q7 | 并行数据输出 | ||
9 | Q7' | 串形数据输出 | |
10 | MR | Master Reset | 主复位 |
11 | SH_CP | Shift Register | 移位寄存器时钟输入 |
12 | ST_CP | Store Register | 存储寄存器时钟输入 |
13 | OE | Output Enable | 输出使能 |
14 | DS | Data Serial | 串形数据输入 |
16 | GND,VCC | 地,电源 |
▪ 使用原理
1、先把要传输的数据(8bit)从引脚 DS 输入到 74HC595
2、将从 DS 上的数据串行移入移位寄存器,需要时钟驱动(即引脚 SH_CP 每产生一个上升沿),DS上的数据往移位寄存器送入一位,先送低位,后送高位,经过8个上升沿后,8bit全部送入移位寄存器了。
3、将移位寄存器里的数据送入存储寄存器,需要引脚 ST_CP 产生一个上升沿后,该操作就完成了。
4、引脚 OE 为低电平,则步骤3送入存储寄存器的8bit数据(一个字节)就在Q7-Q0并行输出,并输出的数据会被所存起来。
备注:发送一个字节,先输入数据位最终将在Q7口输出,最后输入的数据位将在Q0口输出
注意:数据并行输出后,只要没有数据更新进来,原输出的数据保持不变,就是所谓的锁存(数据被锁存住)。在完成步骤123后,只要步骤4还没使能,输出都是保持不变的(这里是有误的,输出不是保持不变,不使能,输出是呈高阻态),当OE一使能,新的数据就输出,覆盖旧输出。
▪ 应用说明
这里我们以 74HC595 驱动 LED 灯来进行说明。
如果需要有更多的输出端口,可以把多个 74HC595 串联起来用。串联的方法入下图所示:上一个芯片的 Q7‘ 连接到下一个芯片的 DS 脚,以此类推理论是可以无限级联。
/**
* 74HC595 发送数据
* 该函数为 74HC595 发送字节的程序,该程序先发送的是最低位
* 备注:发送一个字节,先输入数据位最终将在Q7口输出,最后输入的数据位将在Q0口输出
*
* 当有多片 74HC595 串联时,只有多次调用该发送程序,先发的字节将会自动溢出到下一个 74HC595
* 由于 74HC595 的锁存机制,所以通过该函数发送数据后并不会马上输出数据到并行口,需要调用 HC595_SendOutput() 进行输出
*/
void HC595_SendByte( u8 byte )
{
// 变量初始化
...
// 发送字节数据
for( i = 0; i < 8; i++ ){
// 取字节最低位
dat = byte & 0x01;
// 发送字节位
// 时钟脚上升沿一次,74HC595 会从其数据脚读取一位数据
GPIO_WriteLow(clockPort, clockPin);
dat ? GPIO_WriteHigh(dataPort, dataPin) : GPIO_WriteLow(dataPort, dataPin);
GPIO_WriteHigh(clockPort, clockPin);
// 将发送的字节右移1位
byte >>= 1;
}
}
/**
* 74HC595 发送数据
* 由于 74HC595 的锁存机制,所以通过 HC595_SendByte() 函数发送数据后并不会马上输出数据到并行口,需要调用该函数进行输出
*/
void HC595_SendOutput()
{
// 变量初始化
...
// 输出数据
// 74HC595 第 13(OE)脚为低电平时,然后引脚 12(STCP)产生一个上升沿后就会输出
GPIO_WriteLow(clockPort, clockPin);
GPIO_WriteHigh(clockPort, clockPin);
}
备注:优先发送数据字节的低位或者高位没有强制规定,只要处理能正常处理正确即可