1. 74hc595的工作過程
PDF不一樣,是另一 份,大家可以下載來看看!
內部結構
結合引腳說明就能很快理解 595的工作情況
74LS595,74HC595引腳圖,管腳圖
________
QB--|1 16|--Vcc
QC--|2 15|--QA
QD--|3 14|--SI
QE--|4 13|--/G
QF--|5 12|--RCK
QG--|6 11|--SRCK
QH--|7 10|--/SRCLR
GND- |8 9|--QH`
|________|
74595的數據端:
QA--QH: 八位並行輸出端,可以直接控制數碼管的8個段。
QH`: 級聯輸出端。我將它接下一個595的SI端。
SI: 串列數據輸入端。
74595的控制端說明:
/SRCLR(10腳): 低點平時將移位寄存器的數據清零。通常我將它接Vcc。
SRCK(11腳):上升沿時數據寄存器的數據移位。QA-->QB-->QC-->...-->QH;下降沿移位寄存器 數據不變。(脈沖寬度:5V時,大於幾十納秒就行了。我通常都選微秒級)
RCK(12腳):上升沿時移位寄存器的數據進入數據存儲寄存器,下降沿時存儲寄存器數據不變。(通常我將RCK置為低電平,) 當移位結束後,在RCK端產生一個正脈沖(5V時,大於幾十納秒就行了。我通常都選微秒級),更新顯示數據。
/G(13腳): 高電平時禁止輸出(高阻態)。如果單片機的引腳不緊張,用一個引腳控制它,可以方便地產生閃爍和熄滅效果。比通過數據端移位控制要省時省力。
註:74164和74595功能相仿,都是8位串列輸入轉並行輸出移位寄存器。74164的驅動電流(25mA)比74595(35mA)的要 小14腳封裝,體積也小一些。
74595的主要優點是具有數據存儲寄存器,在移位的過程中,輸出端的數據可以保持不變。這在串列速度慢的場合很有用處,數碼管沒有閃爍感。
與164隻有數據清零端相比,595還多有輸出端時能/禁止控制端,可以使輸出為高阻態。
注:
1)74164和74595功能相仿,都是8位串列輸入轉並行輸出移位寄存器。74164的驅動電流(25mA)比74595(35mA)的要小14腳 封裝,體積也小一些。
2)74595的主要優點是具有數據存儲寄存器,在移位的過程中,輸出端的數據可以保持不變。這在串列速度慢的場合很有用處,數碼管沒有閃爍感。
3)595是串入並出帶有鎖存功能移位寄存器,它的使用方法很簡單,在正常使用時SCLR為高電平, G為低電平。從SER每輸入一位數據,串列輸595是串入並出帶有鎖存功能移位寄存器,它的使用方法很簡單,如下面的真值表,在正常使用時SCLR為高電 平, G為低電平。從SER每輸入一位數據,串列輸入時鍾SCK上升沿有效一次,直到八位數據輸入完畢,輸出時鍾上升沿有效一次,此時,輸入的數據就被送到了輸 出端。入時鍾SCK上升沿有效一次,直到八位數據輸入完畢,輸出時鍾上升沿有效一次,此時,輸入的數據就被送到了輸出端。
其實看了這么多595的資料覺得沒什麼難的關鍵是看懂其時序圖說到底就是下面三步(引用):
第一步:目的:將要准備輸入的位數據移入74HC595數據輸入端上。
方法:送位數據到 P1.0。
第二步:目的:將位數據逐位移入74HC595,即數據串入
方法:P1.2產生一上升沿,將P1.0上的數據移入74HC595中.從低到高。
第三步:目的:並行輸出數據。即數據並出
方法:P1.1產生一上升沿,將由P1.0上已移入數據寄存器中的數據
送入到輸出鎖存器。
說明: 從上可分析:從P1.2產生一上升沿(移入數據)和P1.1產生一上升沿
(輸出數據)是二個獨立過程,實際應用時互不幹擾。即可輸出數據的
同時移入數據。
而具體編程方法為
如:R0中存放3FHLED數碼管顯示「0」
;*****介面定義:
DS_595 EQU P1.0 ;串列數據輸入(595-14)
CH_595 EQU P1.2 ;移位時鍾脈沖(595-11)
CT_595 EQU P1.1 ;輸出鎖存器控制脈沖(595-12)
;*****將移位寄存器內的數據鎖存到輸出寄存器並顯示
OUT_595:
CALL WR_595 ;調用移位寄存器接收一個位元組數據子程序
CLR CT_595 ;拉低鎖存器控制脈沖
NOP
NOP
SETB CT_595 ;上升沿將數據送到輸出鎖存器,LED數碼管顯示「0」
NOP
NOP
CLR CT_595
RET
;*****移位寄存器接收一個位元組(如3FH)數據子程序
WR_595:
MOV R4#08H ;一個位元組數據(8位)
MOV AR0 ;R0中存放要送入的數據3FH
LOOP:
;第一步:准備移入74HC595數據
RLC A ;數據移位
MOV DS_595C ;送數據到串列數據輸入端上(P1.0)
;第二步:產生一上升沿將數據移入74HC595
CLR CH_595 ;拉低移位時鍾
NOP
NOP
setb CH_595 ;上升沿發生移位(移入一數據)
DJNZ R4LOOP ;一個位元組數據沒移完繼續
RET
而其級聯的應用
74HC595主要應用於點陣屏,以16*16點陣為例:傳送一行共二個位元組(16位)
如:發送的是06H和3FH。其方法是:
1.先送數據3FH,後送06H。
2.通過級聯串列輸入後,3FH在IC2內,06H在IC1內。應用如圖二
3.接著送鎖存時鍾,數據被鎖存並出現在IC1和IC2的並行輸出口上顯 示。
編程方法:
數據在30H和31H中
;MOV 30H#3FH
;MOV 31H#06H
;*****介面定義:
DS_595 EQU P1.0 ;串列數據輸入(595-14)
CH_595 EQU P1.2 ;移位時鍾脈沖(595-11)
CT_595 EQU P1.1 ;輸出鎖存器控制脈沖(595-12)
;*****串列輸入16位數據
MOV R030H
CALL WR_595 ;串列輸入3FH
nop
NOP
MOV R031H
CALL WR_595 ;串列輸入06H
NOP
NOP
SETB CT_595 ;上升沿將數據送到輸出鎖存器,顯示
NOP
NOP
CLR CT_595
RET
特點
8位串列輸入
8位串列或並行輸出
存儲狀態寄存器,三種狀態
輸出寄存器可以直接清除
100MHz的移位頻率
輸出能力
並行輸出,匯流排驅動
串列輸出;標准
中等規模集成電路
應用
串列到並行的數據轉換
Remote control holding register.
描述
595是告訴的硅結構的CMOS器件,
兼容低電壓TTL電路,遵守JEDEC標准。
595是具有8位移位寄存器和一個存儲器,三態輸出功能。
移位寄存器和存儲器是分別的時鍾。
數據在SCHcp的上升沿輸入,在STcp的上升沿進入的存儲寄存器中去。如果兩個時鍾連在一起,則移位寄存器總是比存儲寄存器早一個脈沖。
移位寄存器有一個串列移位輸入(Ds),和一個串列輸出(Q7』)和一個非同步的低電平復位,存儲寄存器有一個並行8位的,具備三態的匯流排輸出,當使能OE時(為低電平),存儲寄存器的數據輸出到匯流排。
參考數據
符號 參數 條件 TYP 單位
HC HCt
tPHL/tPLH 傳輸延時
SHcp到Q7』
STcp到Qn
MR到Q7』 CL=15pF
Vcc=5V 16
17
14 21
20
19 Ns
Ns
Ns
fmax STcp到SHcp
最大時鍾速度 100
57 MHz
CL 輸入電容 Notes 1 3.5 3.5 pF
CPD Power dissipation capacitance per package. Notes2 115 130 pF
CPD決定動態的能耗,
PD=CPD×VCC×f1+∑(CL×VCC2×f0)
F1=輸入頻率,CL=輸出電容 f0=輸出頻率(MHz) Vcc=電源電壓
引腳說明
符號 引腳 描述
Q0…Q7 15, 1, 7 並行數據輸出
GND 8 地
Q7』 9 串列數據輸出
MR 10 主復位(低電平)
SHCP 11 移位寄存器時鍾輸入
STCP 12 存儲寄存器時鍾輸入
OE 13 輸出有效(低電平)
DS 14 串列數據輸入
VCC 16 電源
功能表
輸入 輸出 功能
SHCP STCP OE MR DS Q7』 Qn
× × L ↓ × L NC MR為低電平時緊緊影響移位寄存器
× ↑ L L × L L 空移位寄存器到輸出寄存器
× × H L × L Z 清空移位寄存器,並行輸出為高阻狀態
↑ × L H H Q6』 NC 邏輯高電平移入移位寄存器狀態0,包含所有的移位寄存器狀態移入,例如,以前的狀態6(內部Q6」)出現在串列輸出位。
× ↑ L H × NC Qn』 移位寄存器的內容到達保持寄存器並從並口輸出
↑ ↑ L H × Q6』 Qn』 移位寄存器內容移入,先前的移位寄存器的內容到達保持寄存器並輸出。
H=高電平狀態
L=低電平狀態
↑=上升沿
↓=下降沿
Z=高阻
NC=無變化
×=無效
當MR為高電平,OE為低電平時,數據在SHCP上升沿進入移位寄存器,在STCP上升沿輸出到並行埠。
PDF不一樣,是另一份,大家可以下載來看看!
2. 74HC595的程序樣例
DS接MOSI,OE/GND接GND,SH_CP接SCLK,ST_CP接使能信號BIT0@P1,MR/VCC接POWER,如果不需要16位,改US16B,不使用H寄存器即可,還有SPI工作期間可以進入低功耗,也可以執行指令. #include<msp430.h>voidmain(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模塊驅動程序 //74HC595LED控制#include<reg51.h>#include<intrins.h>#defineNOP()_nop_()sbitMOSIO=P3^4;sbitR_CLK=P3^5;sbitS_CLK=P3^6;voiddelay(unsignedinti);voidHC595SendData(unsignedcharSendVal);main(){unsignedcharLed=0xfe;HC595SendData(0xff);while(1){HC595SendData(Led);Led<<=1;Led=Led|0x01;if(Led==0xff)Led=0xfe;delay(200);}}voiddelay(unsignedinti){unsignedintj;for(i;i>0;i--)for(j=300;j>0;j--);}voidHC595SendData(unsignedcharSendVal){unsignedchari;for(i=0;i<8;i++){if((SendVal<<i)&0x80)MOSIO=1;elseMOSIO=0;S_CLK=0;NOP();NOP();S_CLK=1;}R_CLK=0;NOP();NOP();R_CLK=1;}74HC595驅動靜態數碼管程序 #include<reg51.h>#include<intrins.h>#defineNOP()_nop_()sbitMOSIO=P3^4;sbitR_CLK=P3^5;sbitS_CLK=P3^6;voiddelay(unsignedinti);voidHC595SendData(unsignedcharSendVal);unsignedcharcodeLED7Code[]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};main(){unsignedcharHC595SendVal;unsignedintLedNumVal;while(1){LedNumVal++;HC595SendVal=LED7Code[LedNumVal%16];HC595SendData(HC595SendVal);delay(200);}}voiddelay(unsignedinti){unsignedintj;for(i;i>0;i--)for(j=300;j>0;j--);}voidHC595SendData(unsignedcharSendVal){unsignedchari;for(i=0;i<8;i++){if((SendVal<<i)&0x80)MOSIO=1;elseMOSIO=0;S_CLK=0;NOP();NOP();S_CLK=1;}R_CLK=0;NOP();NOP();R_CLK=1;}雙595驅動點陣程序 #include<reg51.h>#include<intrins.h>#defineNOP()_nop_()sbitMOSIO=P3^7;sbitR_CLK=P3^5;sbitS_CLK=P3^6;sbiten573=P1^3;sbitends=P1^2;voidHC595SendData(unsignedintSendVal);unsignedintVal;unsignedcharcodetab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsignedcharcodedigittab[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}};unsignedinttimecount;unsignedcharcnta;unsignedcharcntb;voidmain(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){}}voidt0(void)interrupt1using0{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;}}voidHC595SendData(unsignedintSendVal){unsignedchari;for(i=0;i<16;i++){if((SendVal<<i)&0x8000)MOSIO=1;//=0;//MOSIO=1S_CLK=0;NOP();NOP();S_CLK=1;}R_CLK=0;//setdatalinelowNOP();NOP();R_CLK=1;}