介绍
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