移位寄存器有一个串行移位输入(SI),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能 OE时(为低电平),存储寄存器的数据输出到总线。
QB--|1 16|--VccQC--|2 15|--QAQD--|3 14|--SIQE--|4 13|--/GQF--|5 12|--RCKQG--|6 11|--SCKQH--|7 10|--/SCLRGND-|8 9|--QH'
74595的数据端:
QA--QH: 八位并行输出端,可以直接控制数码管的8个段。
QH': 级联输出端。我将它接下一个595的SI端。
SI: 串行数据输入端。
74595的控制端说明:
/SCLR(10脚): 低点平时将移位寄存器的数据清零。通常我将它接Vcc。
SCK(11脚):上升沿时数据寄存器的数据移位。QA-->QB-->QC-->...-->QH;下降沿移位寄存器数据不变。(脉冲宽度:5V时,大于几十纳秒就行了。我通常都选微秒级)
RCK(12脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。通常我将RCK置为低电平,当移位结束后,在RCK端产生一个正脉冲(5V时,大于几十纳秒就行了。我通常都选微秒级),更新显示数据。
/G(13脚): 高电平时禁止输出(高阻态)。如果单片机的引脚不紧张,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。比通过数据端移位控制要省时省力。
74595的主要优点是具有数据存储寄存器,在移位的过程中,输出端的数据可以保持不变。这在串行速度慢的场合很有用处,数码管没有闪烁感。
应用如下:
以下是用C语言编写的,采用动态扫描方式显示0123这四个数字,此程序是经过模拟仿真的。
//#################################################################
//程序名称:8位数码管显示程序
//程序功能:让8位数码管显示display_7leds[8]中的内容
//程序说明:使用时改变display_7leds[8]中的内容,调用wr7leds()函数即可
//#################################################################
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//#############管脚定义#######################
#define PORT_LED P0 //LED位选信号输入管脚
sbit sclk=P2^0; //595移位时钟信号输入端
sbit st=P2^1; //595锁存信号输入端
sbit da=P2^2; //595数据信号输入端
//#############################################
//共阴极数码管显示代码:7 6 5 4 3 2 1 0
// a b c d e f
uchar code LED_7SEG[16]={0xfc,0x60,0xda,0xf2,//0,1,2,3,
0x66,0xb6,0xbe,0xe0, //4,5,6,7,
0xfe,0xe6,0xee,0x3e, //8,9,A,b,
0x9c,0x7a,0x9e,0x8E};//C,d,E,F
//#####################################################
//名称:wr595()向595发送一个字节的数据
//功能:向595发送一个字节的数据(先发低位)
//#####################################################
void wr595(uchar wrdat)
{
uchar i;
sclk=0;
st=0;
for(i=8;i>0;i--)//循环八次,写一个字节
{
da=wrdat&0x01; //发送BIT0 位
wrdat>>=1; //要发送的数据右移,准备发送下一位
sclk=0; //移位时钟上升沿
_nop_();
_nop_();
sclk=1;
_nop_();
_nop_();
sclk=0;
}
st=0; //上升沿将数据送到输出锁存器
_nop_();
_nop_();
st=1;
_nop_();
_nop_();
st=0;
}
//##########################################################
// 延时函数
//##########################################################
void delay(uint del)
{
while(del--)
{ ;
}
}
//##########################################################
//名称:wr7leds()8个led显示数字函数
//功能:向595发送一个字节的数据,然后发送位选信号
//##########################################################
void wr7leds(void)
{
uchar i,wx;
wx=0x01; //位选信号初始化
for(i=0;i<4;i++) //循环4次写4个数据
{
wr595(LED_7SEG[i]); //传送显示数据
PORT_LED=~wx; //送位选信号
wx<<=1; //位选信号左移,准备显示下一个数字
delay(50); //延时,(决定亮度,和闪烁)
}
}
//##########################################################
//主函数
//##########################################################
main(void)
{
while(1)
{
wr7leds(); //向74HC595发送数据并显示
}
}