74HC595 驱动

目录

一、芯片介绍

二、驱动电路

三、驱动程序

四、实测波形

五、 两片级联


 

一、芯片介绍

本例使用的芯片为飞利浦的74HC595芯片

该芯片支持100M的操作频率

各个pin脚的定义

 

Q0~Q7: 并行数据数据输出端;

GND: 接地引脚;

Q7S: 串行数据输出(多芯片级联时使用);

MR: 复位引脚,当引脚接低电平时芯片内部数据存储寄存器数据清零复位.如不使用一般接高电平;

SHCP: 移位寄存器的时钟输入,当接收到上升沿时移位寄存器内部数据整体后移;

STCP: 数据存储寄存器时钟输入,当检测到上升沿时使能数据存储寄存器,将芯片接收到的数据输出到Q0~Q7 ,Q7S引脚.可以将其理解为锁存信号,当数据发送给芯片完成后对该引脚发送上升沿;

OE: 输出使能引脚,为高电平时芯片输出引脚为高组态,当为低电平时芯片输出引脚为高(低)电平.该引脚可用于同时控制并行输出引脚的电平,如控制LED闪烁等.当不使用该功能时通常接低电平;

DS: 串行数据输入端

VCC: 电源引脚

功能框图:从功能框图中可以看出74HC595含有一个移位寄存器,一个存储寄存器和一个三态输出控制器。

逻辑框图和时序图

 

二、驱动电路

 

三、驱动程序

.c文件

/*******************************************************************************

* 名称: void HC595_Init(void)

* 功能: 74HC595的初始化操作;

* 说明: 总共3个端口,SER-PC1,RCLK(ST)-PC2,SRCLK(SH)-PC3;

*******************************************************************************/

void HC595_Init(void)
{
    //将595所有引脚设为推挽输出
    Gpio_InitIOExt(DS_SER_PORT, DS_SER_PIN, GpioDirOut, TRUE, FALSE, FALSE, FALSE);
    Gpio_InitIOExt(ST_CP_PORT, ST_CP_PIN, GpioDirOut, TRUE, FALSE, FALSE, FALSE);
    Gpio_InitIOExt(SH_CP_PORT, SH_CP_PIN, GpioDirOut, TRUE, FALSE, FALSE, FALSE);

    //将所有指示灯都关闭
    HC595Send(HC595_LED_Leakage,FALSE);
    HC595Send(HC595_LED_LED_Run,FALSE);
    HC595Send(HC595_LED_LED_Gun,FALSE);
    HC595Send(HC595_LED_Signal2,FALSE);
    HC595Send(HC595_LED_Overload,FALSE);
    HC595Send(HC595_Relay,FALSE);
}



void GPIO_WriteHigh(u8 _port,u8 _pin)
{
    Gpio_SetIO(_port,_pin,TRUE);
}


void GPIO_WriteLow(u8 _port,u8 _pin)
{
    Gpio_SetIO(_port,_pin,FALSE);
}

/*******************************************************************************

* 名称: void HC595Send(HC595_TypeDef _location,u8 _state)

* 功能: 8位串行输出函数;

* 说明: 第一个为点灯的位置,第二个为目标的状态

*******************************************************************************/
void HC595Send(HC595_TypeDef _location,u8 _state)
{
    static u8 current_data = 0;
    u8 data = 0;
    if(_state == TRUE)
    {
        current_data|=(0x01<<_location);
    }
    else
    {
        current_data&=(~(0x01<<_location));
    }
    data = current_data;
    for(u8 i=0;i<8;i++)
    {
        GPIO_WriteLow(SH_CP_PORT,SH_CP_PIN);
        __NOP();
        __NOP();
        if(data&0x80)
            GPIO_WriteHigh(DS_SER_PORT,DS_SER_PIN);
        else
            GPIO_WriteLow(DS_SER_PORT,DS_SER_PIN);
        GPIO_WriteHigh(SH_CP_PORT,SH_CP_PIN);
        data = data<<1;
    }
    __NOP();
    __NOP();
    GPIO_WriteLow(ST_CP_PORT,ST_CP_PIN);
    __NOP();
    __NOP();
    GPIO_WriteHigh(ST_CP_PORT,ST_CP_PIN);
    Delay_Tim_1ms(1);
}

 

.h文件

/* 595控制端口定义 */

#define SH_CP_PORT 2
#define SH_CP_PIN 7

#define ST_CP_PORT 3
#define ST_CP_PIN 1

#define DS_SER_PORT 3
#define DS_SER_PIN 2

typedef enum
{
    HC595_LED_Leakage = 1,
    HC595_LED_LED_Run = 2,
    HC595_LED_LED_Gun = 3,
    HC595_LED_Signal2 = 4,
    HC595_LED_Overload = 5,
    HC595_Relay = 6,
} HC595_TypeDef;

 

四、实测波形

五、 两片级联

 

 

猜你喜欢

转载自blog.csdn.net/zhuimeng_ruili/article/details/112537225