先引用一句官方语:“74HC595是硅结构的CMOS器件, 兼容低电压TTL电路,遵守JEDEC标准。”
长话短说,它的功能是8位串行输入并行输出移位寄存器,也就是串行转并行。下图是封装图:

74HC595内部有两个寄存器:8位移位寄存器和8为存储寄存器,下面要PROTEUS做下各个引脚的测试:
调试一下可以看出:
DS为串行数据输入口;SH_CP为串行时钟输入口,SH_CP每个上升沿到来时,芯片内部的移位寄存器会左移一位,最低位由DS决定,最高位移出丢失,次高位成为最高位,并在Q7'体现出来(根据Q7'可以看出,74HC595也有串行输出功能);ST_CP每个上升沿会将移位寄存器的值输出到存储寄存器,存储寄存器直接和引脚Q0~Q7相连,所以存储寄存器的值会直接反映在引脚Q0~Q7上,从而实现串行转并行功能;OE是输出使能,高电平时Q0~Q7为高阻态,低电平时Q0~Q7为存储寄存器的值;MR为低电平时,移位寄存器会被清0,高电平时无效;VCC接电源;GND接地。好了,所有引脚介绍完了。有的封装图引脚名字不太一样,功能是一致的。
下面用两片74HC595(U1和U2)分别控制四位数码管(U1)的显示和选位(U2),为了减少连线,两片74HC595串联(U2的Q7'输出到U1的DS),这样连续向U2的DS写两个字节(第一个是要显示的数字,第二个是位选),就可以显示了。这样LPC2103用三个口(P0.4连SH_CP,P0.6连DS,P0.7连P0.7ST_CP)就可以操作此四连共阴数码管(注意是共阴,不是上篇的共阳,两者之间转换容易,把“要显示的数字”和“位选”取反即可)。如下图:
这个实验测试下:
//*****************************************************************************************************
//功能:LPC2103利用两片74HC595操作四位共阴数码管
//说明:
//用两片74HC595(U1和U2)分别控制四位数码管(U1)的显示和选位(U2),
//为了减少连线,两片74HC595串联(U2的Q7'输出到U1的DS),这样连续向U2的DS写
//两个字节(第一个是要显示的数字,第二个是位选),就可以显示了。这样LPC2103
//用三个口(P0.4连SH_CP,P0.6连DS,P0.7连ST_CP)就可以操作此四连共阴数码管。
#include<LPC2103.H>
#define SH_CP 1<<4 //移位时钟
#define DS 1<<6 //数据
#define ST_CP 1<<7 //字节输出时钟
#define u8 unsigned char
void display(u8 data,u8 n);
void send(u8 byte);
void delay(unsigned int i);
//注意:这是共阳数码管的码表,但用在共阴数码管上,两者之间转换容易,把数据取反即可
u8 table[16] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
int main()
{
PINSEL0=0; //GPIO
IODIR=SH_CP|DS|ST_CP; //三位设定为输出
while(1)
{
display(0x5,1); //在1位显示数字5
delay(1000000);
display(0xA,2);
delay(1000000);
display(0xF,3);
delay(1000000);
display(7,4);
delay(1000000);
}
}
//在“n”位处显示数字“data”,用于共阴数码管
void display(u8 data,u8 n)
{
send(~table[data]); //发送数字,若要用于共阳,去掉“~”
send( ~(1<<(n-1)) ); //发送 位,若要用于共阳,去掉“~”
}
//向74HC595发一个字节
void send(u8 byte)
{
u8 i;
IOCLR=ST_CP; //先拉低,为后面的上升沿做准备
for(i=0;i<8;i++)
{
IOCLR=SH_CP; //先拉低,为后面的上升沿做准备
if(byte&0x80) IOSET=DS; //将字节最高位 输出 在DS线上
else IOCLR=DS;
byte=byte<<1; //该字节右移一位
IOSET=SH_CP; //使74HC595接收该位(DS)
}
IOSET=ST_CP; //使74HC595输出该字节
}
void delay(unsigned int i)
{
while(i--);
}
//**************************************************************************
proteus仿真结果如下图:
硬件测试如下图:
可见,操作四位数码管本来需要12个口,利用74HC595后只要三个口就行了,大大节约了硬件资源。
/************************************************************************************************************************************************************************/
串行到并行的数据转换
Remote control holding register.
#include<reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit stcp1=P2^2;
sbit ds1=P2^1;
sbit shcp1=P2^0;
sbit stcp2=P2^5;
sbit ds2=P2^4;
sbit shcp2=P2^3;
uchar code DAT[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//共阴数码管显示码
uchar code tab[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
uchar code wei[9]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};
void delay(uint ms)
{
uint x,y;
for(x=ms;x>0;x--)
for(y=255;y>0;y--);
}
void QR0_5951(uchar num1)
{
uchar j;
for (j=0;j<8;j++)
{
num1=num1<<1 ;
ds1=CY;
shcp1=1;//上升沿发生移位
// shcp1=0;
}
}
void OUT_5951()//将移位寄存器内的数据锁存到输出寄存器并显示
{
stcp1=0;
stcp1=1;//上升沿将数据送到输出锁存器
stcp1=0;
}
void QR1_5952(uchar num2)
{
uchar j;
for (j=0;j<8;j++)
{
num2=num2<<1 ;
ds2=CY;
shcp2=1;//上升沿发生移位
// shcp2=0;
}
}
void OUT_5952()//将移位寄存器内的数据锁存到输出寄存器并显示
{
stcp2=0;
stcp2=1;//上升沿将数据送到输出锁存器
stcp2=0;
}
void main()
{
uchar i;
while(1)
{
for(i=0;i<2;i++)
{
QR0_5951(DAT[0]);
OUT_5951();
QR1_5952(wei[i]);
OUT_5952();
delay(1);
}
}
}