複製鏈接
請複製以下鏈接發送給好友

74HC595

鎖定
74HC595是一個8位串行輸入、並行輸出的位移緩存器:並行輸出為三態輸出。在SCK 的上升沿,串行數據由SDL輸入到內部的8位位移緩存器,並由Q7'輸出,而並行輸出則是在LCK的上升沿將在8位位移緩存器的數據存入到8位並行輸出緩存器。當串行數據輸入端OE的控制信號為低使能時,並行輸出端的輸出值等於並行輸出緩存器所存儲的值。
中文名
74HC595
類    別
存儲器
功    能
數據存儲
結    構
硅結構的CMOS器件
原    理
8位串行輸入、並行輸出
狀態分類
高電平、低電平和高阻抗

74HC595程序特點

8位串行輸入 /8位串行或並行輸出 存儲狀態寄存器,三種狀態
74HC595是具有三態輸出功能(即具有高電平低電平和高阻抗三種輸出狀態)的門電路。輸出寄存器可以直接清除。具有100MHz的移位頻率。

74HC595輸出能力

並行輸出,總線驅動; 串行輸入;標準中等規模集成電路
595移位寄存器有一個串行移位輸入(Ds),和一個串行輸出(Q7’),和一個異步的低電平復位,存儲寄存器有一個並行8位的,具備三態的總線輸出,當使能OE時(為低電平),存儲寄存器的數據輸出到總線。
Cpd決定動態的能耗,
Pd=Cpd×VCC×f1+∑(CL×VCC^2×f0)
F1=輸入頻率,CL=輸出電容 f0=輸出頻率MHz) Vcc=電源電壓

74HC595引腳説明

74HC595 74HC595
符號
引腳
描述
Q0--Q7
第15腳,第1-7腳
8位並行數據輸出
GND
第8腳
Q7’
第9腳
串行數據輸出
/MR
第10腳
主復位(低電平有效)
SH_CP
第11腳
數據輸入時鐘線
ST_CP
第12腳
輸出存儲器鎖存時鐘線
/OE
第13腳
輸出有效(低電平有效)
DS
第14腳
串行數據輸入
VCC
第16腳
電源

74HC595使用方法

74595的數據端:
Q0--Q7: 八位並行輸出端,可以直接控制數碼管的8個段。
Q7': 級聯輸出端。將它接下一個595的DS端。
DS: 串行數據輸入端,級聯的話接上一級的Q7'。
74595的控制端説明:
/MR(10腳): 低電平時將移位寄存器的數據清零。通常接到VCC防止數據清零。
SH_CP(11腳):上升沿數據寄存器的數據移位。Q0->Q1->Q2-->Q3-->...-->Q7;下降沿移位寄存器數據不變。(脈衝寬度:5V時,大於幾十納秒就行了。我通常都選微秒級)
ST_CP(12腳):上升沿時移位寄存器的數據進入數據存儲寄存器,下降沿時存儲寄存器數據不變。通常我將ST_CP置為低電平,當移位結束後,在ST_CP端產生一個正脈衝(5V時,大於幾十納秒就行了。我通常都選微秒級),更新顯示數據
/OE(13腳): 高電平時禁止輸出(高阻態)。如果單片機的引腳不緊張,用一個引腳控制它,可以方便地產生閃爍和熄滅效果。比通過數據端移位控制要省時省力。
注1)74164和74595功能相仿,都是8位串行輸入轉並行輸出移位寄存器。74164的驅動電流(25mA)比74595(35mA)的要小,14腳封裝,體積也小一些。
2)74595的主要優點是具有數據存儲寄存器,在移位的過程中,輸出端的數據可以保持不變。這在串行速度慢的場合很有用處,數碼管沒有閃爍感。
3)595是串入並出帶有鎖存功能移位寄存器,它的使用方法很簡單,如下面的真值表,在正常使用時ST_CP為低電平, /OE為低電平。從DS每輸入一位數據,串行輸入時鐘SH_CP上升沿有效一次,直到八位數據輸入完畢,輸出時鐘ST_CP上升沿有效一次,此時,輸入的數據就被送到了輸出端。
595具體使用的步驟:
第一步:目的:將要準備輸入的位數據移入74HC595數據輸入端上。
方法:送位數據到_595。
第二步:目的:將位數據逐位移入74HC595,即數據串入
方法:SH_CP產生一上升沿,將DS上的數據移入74HC595移位寄存器中,應該是先送高位
第三步:目的:並行輸出數據。即數據並出
方法:ST_CP產生一上升沿,將由DS上已移入數據寄存器中的數據
送入到輸出鎖存器
説明: 從上可分析:從SH_CP產生一上升沿(移入數據)和ST_CP產生一上升沿(輸出數據)是二個獨立過程,實際應用時互不干擾。即可輸出數據的 同時移入數據。 [1] 

74HC595真值表

輸入
輸出
功能
SHCP
STCP
OE
MR
DS
Q7’
Qn
×
×
L
L
×
L
NC
MR為低電平時僅僅影響移位寄存器
×
L
L
×
L
L
清空移位寄存器到輸出寄存器
×
×
H
L
×
L
Z
清空移位寄存器,並行輸出為高阻狀態
×
L
H
H
Q6’
NC
邏輯高電平移入移位寄存器狀態0,包含所有的移位寄存器狀態 移入
×
L
H
×
NC
Qn’
移位寄存器的內容到達保持寄存器並從並口輸出
L
H
×
Q6’
Qn’
移位寄存器內容移入,先前的移位寄存器的內容到達保持寄存器並出

74HC595相關注釋

H=高電平狀態
L=低電平狀態
↑=上升沿
×=無關係
當MR為高電平,數據在SHCP上升沿進入移位寄存器,在STCP上升沿輸出到並行端口,OE為使能端低電平有效,當OE為低時,輸出使能,為高關閉使能,並不影響其他輸入端。
真值表 真值表

74HC595程序樣例

DS接MOSI,OE/GND接GND,SH_CP接SCLK,ST_CP接使能信號BIT0@P1,MR/VCC接POWER,如果不需要16位,改US16B,不使用H寄存器即可,還有SPI工作期間可以進入低功耗,也可以執行指令.
#include <msp430.h>
void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;
    P1DIR |= BIT0 + BIT1;
    P1OUT &= ~BIT0;
    USICTL0 |= USIPE6 + USIPE5 + USIMST + USIOE;
    USICTL1 |= USIIE;
    USICKCTL = USIDIV_7 + USISSEL_2;
    USICTL0 &= ~USISWRST;
    while(1)
    {
        P1OUT |= BIT0;
        USISRH = 0xAA;
        USISRL = 0xAA;
        USICNT = 0x10 + USI16B; // 16位數,級聯可用.
        while((USICTL1 & USIIFG) != 0x01){ //此處可以幹別的
        //這裏寫入與SPI無關的代碼,共8*16=128條單週期指令.
        }
        USICTL1 &= ~USIIFG;
        P1OUT &= ~BIT0;
    }
}
單片機74HC595模塊驅動程序
//74HC595 LED控制
#include <reg51.h>
#include <intrins.h>
#define NOP() _nop_()
sbit MOSIO=P3^4;
sbit R_CLK=P3^5;
sbit S_CLK=P3^6;
void delay(unsigned int i);
void HC595SendData(unsigned char SendVal);
main( )
{
    unsigned char Led=0xfe;
    HC595SendData(0xff);
    while(1)
    {
        HC595SendData(Led);
        Led<<=1;
        Led =Led|0x01;
        if(Led==0xff)Led=0xfe;
        delay(200);
    }
}
void delay(unsigned int i)
{ 
    unsigned int j;
    for(i;i>0;i--)
        for(j=300;j>0;j--);
}
void HC595SendData(unsigned char SendVal)
{
    unsigned char i;
    for(i=0;i<8;i++)
    {
        if((SendVal<<i)&0x80)MOSIO=1;
        else MOSIO=0;
        S_CLK=0;
        NOP();
        NOP();
        S_CLK=1;
    }
    R_CLK=0;
    NOP();
    NOP();
    R_CLK=1;
}
74HC595驅動靜態數碼管程序
#include<reg51.h>
#include<intrins.h>
#define NOP()_nop_()
sbit MOSIO=P3^4;
sbit R_CLK=P3^5;
sbit S_CLK=P3^6;
void delay(unsigned int i);
void HC595SendData(unsigned char SendVal);
unsigned char code LED7Code[]=
{~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,
~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};
main()
{
    unsigned char HC595SendVal;
    static unsigned char LedNumVal=0;
       
    while(1)
    { 
        LedNumVal++;
        HC595SendVal=LED7Code[LedNumVal%16]; 
        HC595SendData(HC595SendVal);
        delay(200);
    }
}
void delay(unsigned int i)
{
    unsigned int j;
    for(i;i>0;i--)
        for(j=300;j>0;j--);
}
void HC595SendData(unsigned char SendVal)
{
    unsigned char i;
    for(i=0;i<8;i++)
    {
        if((SendVal<<i)&0x80)MOSIO=1;
        else MOSIO=0;
        S_CLK=0;
        NOP();
        NOP();
        S_CLK=1;
    }
    R_CLK=0;
    NOP();
    NOP();
    R_CLK=1;
}

雙595驅動點陣程序
#include<reg51.h>
#include<intrins.h>
#define NOP() _nop_()
sbit MOSIO=P3^7;
sbit R_CLK=P3^5;
sbit S_CLK=P3^6;
sbit en573=P1^3;
sbit ends=P1^2;
void HC595SendData(unsigned int SendVal);
unsigned int Val;
unsigned char code tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char code digittab[18][8]={
{0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00},//0
{0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00},//1
{0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00},//2
{0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00},//3
{0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00},//4
{0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00},//5
{0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00},//6
{0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00},//7
{0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00},//8
{0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00},//9
{0x00,0x00,0x7F,0x48,0x48,0x30,0x00,0x00},//P
{0x00,0x00,0x7F,0x48,0x4C,0x73,0x00,0x00},//R
{0x00,0x00,0x7F,0x49,0x49,0x49,0x00,0x00},//E
{0x00,0x00,0x3E,0x41,0x41,0x62,0x00,0x00},//C
{0x00,0x00,0x7F,0x08,0x08,0x7F,0x00,0x00},//H
{0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00},//I
{0x00,0x7F,0x10,0x08,0x04,0x7F,0x00,0x00},//N
{0x7C,0x48,0x48,0xFF,0x48,0x48,0x7C,0x00}
};
unsigned int timecount;
unsigned char cnta;
unsigned char cntb;
void main(void)
{
    TMOD=0x01;
    TH0=(65536-3000)/256;
    TL0=(65536-3000)%256;
    TR0=1;
    ET0=1;
    EA=1;
    cntb=0;
    ends=0;
    en573=0;
    while(1)
    { }
}
void t0(void)interrupt 1 using 0
{
    TH0=(65536-3000)/256;
    TL0=(65536-3000)%256;
    if(cntb<18)
    {
        //P1=0xFF;
        //P2=tab[cnta];
        P0=~digittab[cntb][cnta];
        Val=tab[cnta]&0x00ff;
        Val<<=8;
        Val=Val+0x00ff;
        HC595SendData(Val);
    }
    else
    {
        //P2=0xFF;
        //P1=tab[cnta];
        P0=~digittab[cntb-18][cnta];
        Val=tab[cnta];
        Val=Val+0xFF00;
        HC595SendData(Val);
    }
    if(++cnta>=8)cnta=0;
    if(++timecount>=333)
    {
        timecount=0;
        if(++cntb>=36)cntb=0;
    }
}
void HC595SendData(unsigned int SendVal)
{
    unsigned char i;
    for(i=0;i<16;i++)
    { 
        if((SendVal<<i)&0x8000)MOSIO=1;//setdatalinehigh0X8000
        else MOSIO=0; //MOSIO=1
        S_CLK=0;
        NOP();
        NOP();
        S_CLK=1;
    }
    R_CLK=0;//setdatalinelow
    NOP();
    NOP();
    R_CLK=1;
}

參考資料