这次来详细介绍74HC595这个扩展IO芯片的使用方法,虽然这个IC使用简单,但对于初学者理解还是较为困难,所以这次来拿例程解释助理解。
一、芯片介绍:
简单的理解74HC595芯片,是个扩展输出IO的芯片。
当用1颗时,可以用3个IO扩展到8个IO;
当用2颗时,可以用3个IO扩展到16个IO;
当用3颗时,可以用3个IO扩展到24个IO
……
不过串的越多,时效性越低,所以需权衡使用。
二、芯片引脚如下图:
引脚介绍
第1~7、15:Q0~Q7为输出电平引脚(可以理解为:扩展出来的IO);
第9:Q7'为高位数据输出引脚(可以理解为:如果需要再串一颗74HC595芯片时,这个引脚作为下一颗的输入引脚);
第10:MR为复位引脚,低电平复位(一般也不用,直接拉高即可);
第11:SH_CP为时钟引脚(可以理解为:通讯协议中的SCL时钟线);
第12:ST_CP为数据输出使能引脚(可以理解为:每次ST_CP引脚一次高电平脉冲,Q0~Q7的引脚进行输出);
第13:OE引脚为总开关(在低电平时输出Q0~Q7,一般持续拉低即可);
第14:DS引脚为数据输入引脚(可以理解为:通讯协议中的SDA数据线);
第8、16:接地和电源(电源可直接接5V,这样Q0-Q7的高电平也为5V,同时SDA、SCL、ST_CP也可以3.3V逻辑电压输入)
具体参见下图
三、原理说明:
一般使用方法:首先给SH_CP引脚时钟信号,给DS引脚数据信号,让存储8位数据。然后给ST_CP引脚给上升沿脉冲,即可在Q0~Q7管脚上输出8位数据。
注意事项:同时注意OE是总开关,低电平才输出电平,MR是复位引脚,一直拉高即可。
Q7’说明:Q7’是高位输出引脚(意思是每给SH_CLK一个上升沿时,Q7的数据会通过Q7’移出)。在串联第二颗74HC595时,这个Q7’就可以接入第二颗的DS引脚,这样当在给芯片输入16Bit数据时,先发送的8Bit就会从Q7’输入到第二个芯片里面,从而在第二个芯片的Q0~Q7输出电平。
四、绘制原理图介绍:
以上原理图中使用了4颗IC驱动了16*8+16*8的2块点阵,拼接在一起也是16*16点阵。我是单独控制16*8+16*8。。
左下脚的U2和U4是串行控制的接法。通过3个IO控制,分别是接在U2芯片上的第11、12、14脚,也就是(SDA、SCL、SER),其中11、12脚接相同的Mcu IO;Q7’的使用是:通过U2的Q7’接到U2的14脚(SDA脚)。
右下角U3和U5是单独控制的接法。
五、C51程序例程
以下是51单片机调用程序代码,可供查看。
//Note: MR 主复位接电源正极, OE 使能端,输出有效接电源负极
/*--------------------------------------------*/
#ifndef __74HC595_H__
#define __74HC595_H__
/*--------------------------------------------*/
sbit SD = P1^4; //串行数据输入
sbit ST_CK = P1^5; //存储寄存器时钟输入
sbit SH_CK = P1^6; //移位寄存器时钟输入
/*--------------------------------------------*/
//数码管断码和位码的定义
//unsigned char code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00,0xff};
//0 1 2 3 4 5 6 7 8 9 a b c d e f 8 无
//unsigned char code pos[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//1 2 3 4 5 6 7 8
/*--------------------------------------------*/
//函数声明
void Ser_IN(unsigned char Data); //串行数据输入
void Par_OUT(void); //串行数据输出
//void Ser_Par(unsigned char Data); //串行输入,并行输出
/*--------------------------------------------*/
//串行数据输入
void Ser_IN(unsigned char Data)
{
unsigned char i;
for(i = 0; i < 8; i++)
{
SH_CK = 0; //CLOCK_MAX=100MHz
SD = Data & 0x80;
Data <<= 1;
SH_CK = 1; //产生上升沿脉冲,数据移位,即数据左移一位
}
}
//并行数据输出
void Par_OUT(void)
{
ST_CK = 0;
ST_CK = 1; //产生上升沿脉冲,数据从Q0~Q7引脚输出电平
}
/*--------------------------------------------*/
//串行输入,并行输出
void Ser_Par(unsigned char Data)
{//外部调用此函数,即可实现输出芯片的使用,Data是8位数据
Ser_IN(Data);
Par_OUT();
}
/*--------------------------------------------*/
#endif
六、74HC595A和75HC595D的区别
74HC595A和75HC595D都是SOP-16贴片的封装,以上的介绍对2种都适用。但是:74HC595A的IO输出均为开漏输出,什么意思呢?就是如果要输出高电平,必须接上拉电阻。所以我在上次怀疑各种原因,最终发现了是IO是开漏输出,所以2者不能直接替换。
以下是2者需要注意的事项