扩展 IO 口:移位寄存器 74HC595(含电路和程序)

▪ 基本信息

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 并行数据输出
9Q7' 串形数据输出
10MRMaster Reset主复位
11SH_CPShift Register移位寄存器时钟输入
12ST_CPStore Register存储寄存器时钟输入
13OEOutput Enable输出使能
14DSData Serial串形数据输入
16GND,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);
}

备注:优先发送数据字节的低位或者高位没有强制规定,只要处理能正常处理正确即可

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值