问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

74HC595芯片并行输出控制详解

创作时间:
作者:
@小白创作中心

74HC595芯片并行输出控制详解

引用
CSDN
1.
https://blog.csdn.net/rain1070/article/details/139776140

74HC595是一种常用的串行输入并行输出(SIPO)移位寄存器芯片,广泛应用于各种电子设备中。本文将详细介绍74HC595的工作原理、引脚功能、内部构造和时序图,并通过示例代码展示如何实现级联控制。

0 前言

本文主要介绍74HC595工作原理,根据工作原理实现简单控制功能,并给出示例代码。

1 74HC595工作原理

1.1 芯片引脚

引脚功能说明

  • PIN14(SER):串行数据输入引脚
  • PIN13(OE):输出使能控制,低电平有效
  • PIN12(RCLK):存储器存储时钟输入引脚,上升沿,数据从移位寄存器转存到存储寄存器
  • PIN11(SRCLK):移位寄存器时钟输入引脚,上升延,移位寄存器的bit数据整体后移,并接收新的bit(SER输入)
  • PIN9(QH):串行数据出口引脚,当移位寄存器中的数据大于8bit时,会把现有的bit“挤出去”,这样可以用于595级联
  • QA~QH:并行输出引脚

工作原理

74HC595两个重要的功能:串行输入、并行输出

74HC595两个重要的寄存器:移位寄存器、存储寄存器

74HC595的数据输入只有一个SER端口,一次只能输入一个bit,那么连续输入8次,就可以得到一个字节的数据

移位寄存器

在时钟脉冲上升沿,第1个输入的bit是并行输出的最后一个bit,即“先入后出”,类似数据入栈,经过8个时钟脉冲上升沿,1个字节数据就写入了移位寄存器(串行输入)

存储寄存器

因为移位寄存器和存储寄存器的引脚是相连的(从内部构造可知),所有在存储寄存器时钟的上升沿,移位寄存器的的数据转移到存储寄存器(形成并行输出)

1.2 内部构造

内部结构由RS触发器组成(根据时钟和数据输入,可以画出其时序图)

真值表

1.3 时序图

2 74HC595级联

2.1 级联接线

级联其实就是将第1级的QH‘输入到第2级的SER,RCLK和CLK共用

2.2 示例代码

对级联中的TEMP24_CS进行控制

uint8_t hc_ioset[2] = { 0xff, 0xff};
static void _delay( uint32_t count )
{
    while( count > 0 )
    {
        count--;
    }
}
void hc595_set()
{
    uint8_t i, loop;
    uint8_t data;
    
    uint32_t delay = 0xff;
    for ( loop = 0; loop < 2; loop ++ )
    {
        data = hc_ioset[loop];
        
        for ( i = 0; i < 8; i++ )
        {
            // 从最高bit开始传输
            if ( data & 0x80 )
            {
                CS_DATA_H();
            }
            else
            {
                CS_DATA_L();
            }
            CS_CLK_L();
            _delay(delay);
            CS_CLK_H();
            _delay(delay);
            data <<= 1;
        }
    }
    
    // 进行存储
    CS_RCLK_L();
    _delay(delay);
    CS_RCLK_H();
    _delay(delay);
}
void hc595_set_pin( uint8_t pos )
{
    uint8_t i, j;
    if (pos > 15 )
    {
        return ;
    }
    i = (pos+1) / 8;
    j = pos % 8;
    hc_ioset[i] |= 0x01 << j;
}
void hc595_reset_pin( uint8_t pos )
{
    uint8_t i, j;
    if (pos > 15 )
    {
        return ;
    }
    i = (pos+1) / 8;
    j = pos % 8;
    hc_ioset[i] &= ~(0x01 << j);
}
void hc595_write_pin( uint8_t set, uint8_t pin )
{
    if ( set )
    {
        // TEMP24_CS 输出高电平
        hc595_set_pin(15);
    }
    else
    {
        // TEMP24_CS 输出低电平
        hc595_reset_pin(15);
    }
}
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号