通過程序理解74HC595
74HC595:
74HC595是具有8位移位寄存器和一個存儲器,三態(tài)輸出功能。移位寄存器和存儲器是分別的時鐘。
數(shù)據(jù)在SHcp的上升沿輸入,在STcp的上升沿進(jìn)入的存儲寄存器中去。如果兩個時鐘連在一起,則移位寄存器總是比存儲寄存器早一個脈沖。移位寄存器有一個串行移位輸入(Ds),和一個串行輸出(Q),和一個異步的低電平復(fù)位,存儲寄存器有一個并行8位的,具備三態(tài)的總線輸出,當(dāng)使能OE時(為低電平),存儲寄存器的數(shù)據(jù)輸出到總線。
我的硬件連接:用級聯(lián)方式連接!
工作順序:單片機(jī)先送1個8位數(shù)據(jù)到第一個595的內(nèi)部移位寄存器->然后數(shù)據(jù)會送到內(nèi)部的輸出寄存器->輸出
當(dāng)MR(10引腳)為高電平,OE(13引腳)為低電平時,數(shù)據(jù)在SHCP上升沿進(jìn)入移位寄存器,在STCP上升沿輸出到并行端口。
可能這還不太好理解,沒關(guān)系,咱去程序應(yīng)用中理解!
請看一個簡單的程序:
sbit SDA1 = P0^0; //串行數(shù)據(jù)輸入,對應(yīng)595的14腳SER
sbit SCL1 = P0^1; //移位寄存器時鐘輸入,對應(yīng)595的11腳SCK
sbit SCL2 = P0^2; //存儲寄存器時鐘輸入,對應(yīng)595的12腳RCK
unsigned char code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//0 1 2 3 4 5 6 7 8 9
unsigned char code wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void delay2ms(void)
{
unsigned char i,j;
for(i=133;i>0;i--)
for(j=6;j>0;j--);
}
void 595_in(unsigned char Data)
{
unsigned char i;
for(i = 0; i < 8; i++) //循環(huán)8次,剛好移完8位
{
SCL1 = 0; //先將移位寄存器控制引腳置為低
_nop_();
if((Data & 0x80)== 0x80)
SDA1 =1;
else
SDA1 =0;
Data <<= 1; //將數(shù)據(jù)的次高位移到最高位
SCL1 = 1; //再置為高,產(chǎn)生移位時鐘上升沿,上升沿時數(shù)據(jù)寄存器的數(shù)據(jù)移位
_nop_();
}
}
void 595_out(void)
{
SCL2 = 0; //先將存儲寄存器引腳置為低
_nop_();
SCL2 = 1; //再置為高,產(chǎn)生移位時鐘上升沿,上升沿時移位寄存器的數(shù)據(jù)進(jìn)入數(shù)據(jù)存儲寄存器,更新顯示數(shù)據(jù)。
}
void main(void)
{
unsigned char i;
for(i=0;i<8;i++) //有八位數(shù)碼管,八位依次掃描
{
595_in(wei[i]); //先傳位碼
595_in(duan[i]); //再傳段碼
595_out();
delay2ms(); //延遲時間2ms以內(nèi)
}
}
注:74164和74595功能相仿,都是8位串行輸入轉(zhuǎn)并行輸出移位寄存器。74164驅(qū)動電流(25mA)比74595(35mA)的要小,14腳封裝,體積也小些。
74595的主要優(yōu)點是具有數(shù)據(jù)存儲寄存器,在移位過程中,輸出端的數(shù)據(jù)可以保持不變。這在串行速度慢的場合很有用,數(shù)碼管沒有閃爍感。
與164只有數(shù)據(jù)清零端相比,595還多有輸出端時能/禁止控制端,可以使輸出為高阻態(tài)。