-
74HC595
鎖定
- 中文名
- 74HC595
- 類 別
- 存儲器
- 功 能
- 數據存儲
- 結 構
- 硅結構的CMOS器件
- 原 理
- 8位串行輸入、並行輸出
- 狀態分類
- 高電平、低電平和高阻抗
74HC595程序特點
8位串行輸入 /8位串行或並行輸出 存儲狀態寄存器,三種狀態
74HC595輸出能力
並行輸出,總線驅動; 串行輸入;標準中等規模集成電路
Cpd決定動態的能耗,
Pd=Cpd×VCC×f1+∑(CL×VCC^2×f0)
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的控制端説明:
ST_CP(12腳):上升沿時移位寄存器的數據進入數據存儲寄存器,下降沿時存儲寄存器數據不變。通常我將ST_CP置為低電平,當移位結束後,在ST_CP端產生一個正脈衝(5V時,大於幾十納秒就行了。我通常都選微秒級),更新顯示數據。
注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上已移入數據寄存器中的數據
送入到輸出鎖存器。
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=低電平狀態
↑=上升沿
↓=下降沿
Z=高阻態
NC=無變化
×=無關係
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; }
- 參考資料
-
- 1. 74hc595芯片使用方法 .21IC中國電子網[引用日期2015-02-13]