74HC595

74HC595

74HC595是一個8位串列輸入、並行輸出的位移快取器:並行輸出為三態輸出。在SCK 的上升沿,串列數據由SDL輸入到內部的8位位移快取器,並由Q7'輸出,而並行輸出則是在LCK的上升沿將在8位位移快取器的數據存入到8位並行輸出快取器。當串列數據輸入端OE的控制信號為低使能時,並行輸出端的輸出值等於並行輸出快取器所存儲的值。而當OE為高電位,也就是輸出關閉時,並行輸出端會維持在高阻抗狀態。

基本介紹

  • 中文名:74HC595
  • 類別存儲器
  • 功能:數據存儲
  • 結構:矽結構的CMOS器件
特點,輸出能力,引腳說明,使用方法,真值表,相關注釋,程式樣例,

特點

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

輸出能力

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

引腳說明

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

使用方法

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產生一上升沿(輸出數據)是二個獨立過程,實際套用時互不干擾。即可輸出數據的 同時移入數據。

真值表

輸入
輸出
功能
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’
移位暫存器內容移入,先前的移位暫存器的內容到達保持暫存器並出

相關注釋

H=高電平狀態
L=低電平狀態
↑=上升沿
↓=下降沿
Z=高阻態
NC=無變化
×=無關係
當MR為高電平,數據在SHCP上升沿進入移位暫存器,在STCP上升沿輸出到並行連線埠,OE為使能端,低電平有效,當OE為低時,輸出使能,為高關閉使能,並不影響其他輸入端。
真值表真值表

程式樣例

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;}

相關詞條

熱門詞條

聯絡我們