介绍
74HC595是一个8位串行输入、并行输出的位移缓存器:并行输出为三态输出。
在SCK 的上升沿,串行数据由SDL输入到内部的8位位移缓存器,并由Q7’输出,而并行输出则是在LCK的上升沿将在8位位移缓存器的数据存入到8位并行输出缓存器。当串行数据输入端OE的控制信号为低使能时,并行输出端的输出值等于并行输出缓存器所存储的值。
引脚说明
74HC595是3态高速位移寄存器,串行输入,并行输出的锁存器。
DS:14脚,串行数据输入引脚,级联的话接上一级的Q7’。
OE:13脚,输出使能控制脚,它是低电才使能输出,所以接GND
ST_CP:12脚,存储寄存器时钟输入引脚。上升沿时,数据从移位寄存器转存带存储寄存器。
SH_CP:11脚,移位寄存器时钟引脚,上升沿时,移位寄存器中的数据整体后移,并接受新 的数据(从 DS输入)。
MR:10脚,低电平时,清空移位寄存器中已有的数据,一般不用,接高电平即可。
Q7’:9脚,串行数据输出引脚。当移位寄存器中的数据多于8位时,会把已有的位“挤出 去”,就是从这里出去的。用于595的级联,将它接下一个74HC595的DS端。
Q1-Q7:1到7脚,并行输出引脚
核心工作原理:
OE:13脚接GND使能
DS:14脚,串行输入数据原理如下图(高位给完,到低位,一位一位时钟传)
SH_CP:11脚 给个上升沿,移位寄存器
ST_CP:12脚,存储寄存器时钟输。上升沿时,数据从移位寄存器转存带存储寄存器。而已一直保存
时序图:
74HC595.c 代码文件
//这里使用的是74HC595 级联的方式,单联也是差不多
#include "74HC595.h"
/*******************************************************************************
* 函 数 名 : delay_10us
* 函数功能 : 延时函数,ten_us=1时,大约延时10us
* 输 入 : ten_us
* 输 出 : 无
*******************************************************************************/
void delay_10us(unsigned int ten_us)
{
while(ten_us--);
}
/*******************************************************************************
* 函 数 名 : delay_ms
* 函数功能 : ms延时函数,ms=1时,大约延时1ms
* 输 入 : ten_us
* 输 出 : 无
*******************************************************************************/
void delay_ms(unsigned int ms)
{
unsigned int i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
/*******************************************************************************
* 函 数 名 : hc595_write_data(unsigned char dat)
* 函数功能 : 向74HC595写入4个字节的数据
* 输 入 :
dat1:对应74HC595(A)输出第1行-第8行
dat2:对应74HC595(B)输出第9行-第16行
dat3:对应74HC595(C)输出第1列-第8列
dat4:对应74HC595(D)输出第9列-第16列
* 输 出 : 无
*******************************************************************************/
void hc595_write_data(unsigned char dat1,unsigned char dat2,unsigned char dat3,unsigned char dat4)
{
unsigned char i=0;
for(i=0;i<8;i++)//循环8次即可将一个字节写入寄存器中
{
HC595_SER=dat4>>7;//优先传输一个字节中的高位
dat4<<=1;//将低位移动到高位
HC595_SRCLK=0;
delay_10us(1);
HC595_SRCLK=1;
delay_10us(1);//移位寄存器时钟上升沿将端口数据送入寄存器中
}
for(i=0;i<8;i++)
{
HC595_SER=dat3>>7;
dat3<<=1;
HC595_SRCLK=0;
delay_10us(1);
HC595_SRCLK=1;
delay_10us(1);
}
for(i=0;i<8;i++)
{
HC595_SER=dat2>>7;
dat2<<=1;
HC595_SRCLK=0;
delay_10us(1);
HC595_SRCLK=1;
delay_10us(1);
}
for(i=0;i<8;i++)
{
HC595_SER=dat1>>7;
dat1<<=1;
HC595_SRCLK=0;
delay_10us(1);
HC595_SRCLK=1;
delay_10us(1);
}
RCLK=0;
delay_10us(1);
RCLK=1;//存储寄存器时钟 上升沿将前面写入到寄存器的数据输出
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
/**********************************mian.c列子*********************************************
unsigned char ghc595_buf[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void main()
{
unsigned char i=0;
while(1)
{
for(i=0;i<8;i++)
{
hc595_write_data(ghc595_buf[i],0,0,0);//使74HC595(A)输出
delay_ms(500);//延时500ms
}
for(i=0;i<8;i++)
{
hc595_write_data(0,ghc595_buf[i],0,0);//使74HC595(B)输出
delay_ms(500);//延时500ms
}
}
}
************************************************************************************/
74HC595.H 代码文件
#ifndef _74HC595_H
#define _74HC595_H
#include "reg52.h"
//定义74HC595控制管脚 ==>HC595 内部结构有两个寄存器。1.移位寄存器 2.存储寄存器
sbit HC595_SRCLK=P3^6; //移位寄存器 时钟输入
sbit HC595_RCLK=P3^5; //存储寄存器 时钟输入
sbit HC595_SER=P3^4; //串行数据 输入
void delay_10us(unsigned int ten_us);
void delay_ms(unsigned int ms);
void hc595_write_data(unsigned char dat1,unsigned char dat2,unsigned char dat3,unsigned char dat4);
#endif