各位大俠,請幫我
想用s7-200驅(qū)動數(shù)碼管,數(shù)碼管使用74595驅(qū)動,74595是一個(gè)移位寄存鎖存IC。
我是新手,水平太差,在網(wǎng)上找了幾個(gè)程序,都用不了,估計(jì)是時(shí)序配合不好。
請各位大俠指點(diǎn),如能直接給出程序,就太好了。只要將“123456”顯示出來就行(我買的板子是成品的,6位顯示)。
關(guān)鍵是移位輸出和時(shí)序配合上,搞不明白。
謝謝!
以下74595資料來自網(wǎng)上:
74LS595,74HC595中文資料
74595的數(shù)據(jù)端:
QA--QH: 八位并行輸出端,可以直接控制數(shù)碼管的8個(gè)段。
QH': 級聯(lián)輸出端。我將它接下一個(gè)595的SI端。
SI: 串行數(shù)據(jù)輸入端。
74595的控制端說明:
/SCLR(10腳): 低點(diǎn)平時(shí)將移位寄存器的數(shù)據(jù)清零。通常我將它接Vcc。
SCK(11腳):上升沿時(shí)數(shù)據(jù)寄存器的數(shù)據(jù)移位。Q1-->Q2-->Q3-->...-->Q7;下降沿移位寄存器數(shù)據(jù)不變。(脈沖寬度:5V時(shí),大于幾十納秒就行了。我通常都選微秒級)
RCK(12腳):上升沿時(shí)移位寄存器的數(shù)據(jù)進(jìn)入數(shù)據(jù)存儲寄存器,下降沿時(shí)存儲寄存器數(shù)據(jù)不變。通常我將RCK置為低電平,當(dāng)移位結(jié)束后,在RCK端產(chǎn)生一個(gè)正脈沖(5V時(shí),大于幾十納秒就行了。我通常都選微秒級),更新顯示數(shù)據(jù)。
/G(13腳): 高電平時(shí)禁止輸出(高阻態(tài))。如果單片機(jī)的引腳不緊張,用一個(gè)引腳控制它,可以方便地產(chǎn)生閃爍和熄滅效果。比通過數(shù)據(jù)端移位控制要省時(shí)省力。
注:74164和74595功能相仿,都是8位串行輸入轉(zhuǎn)并行輸出移位寄存器。74164的驅(qū)動電流(25mA)比74595(35mA)的要小,14腳封裝,體積也小一些。
74595的主要優(yōu)點(diǎn)是具有數(shù)據(jù)存儲寄存器,在移位的過程中,輸出端的數(shù)據(jù)可以保持不變。這在串行速度慢的場合很有用處,數(shù)碼管沒有閃爍感。
與164只有數(shù)據(jù)清零端相比,595還多有輸出端時(shí)能/禁止控制端,可以使輸出為高阻態(tài)。
74HC595是具有8位移位寄存器和一個(gè)存儲器,三態(tài)輸出功能。 移位寄存器和存儲器是分別的時(shí)鐘。數(shù)據(jù)在SCHcp的上升沿輸入,在STcp的上升沿進(jìn)入的存儲寄存器中去。如果兩個(gè)時(shí)鐘連在一起,則移位
寄存器總是比存儲寄存器早一個(gè)脈沖。移位寄存器有一個(gè)串行移位輸入(Ds),和一個(gè)串行輸出(Q7’),和一個(gè)異步的低電平復(fù)位,存儲寄存器有一個(gè)并行8位的,具備三態(tài)的總線輸出,當(dāng)使能OE時(shí)(為低電平),存儲寄存器的數(shù)據(jù)輸出到總線。
74HC595各個(gè)引腳的功能:
Q1~7 是并行數(shù)據(jù)輸出口,即儲寄存器的數(shù)據(jù)輸出口
Q7' 串行輸出口,其應(yīng)該接SPI總線的MISO接口
STcp 存儲寄存器的時(shí)鐘脈沖輸入口
SHcp 移位寄存器的時(shí)鐘脈沖輸入口
OE的非 輸出使能端
MR的非 芯片復(fù)位端
Ds 串行數(shù)據(jù)輸入端
程序說明:
每當(dāng)spi_shcp上升沿到來時(shí),spi_ds引腳當(dāng)前電平值在移位寄存器中左移一位,在下一個(gè)上升沿到來時(shí)移位寄存器中的所有位都會向左移一位,
同時(shí)Q7'也會串行輸出移位寄存器中高位的值,
這樣連續(xù)進(jìn)行8次,就可以把數(shù)組中每一個(gè)數(shù)(8位的數(shù))送到移位寄存器;
然后當(dāng)spi_stcp上升沿到來時(shí),移位寄存器的值將會被鎖存到鎖存器里,并從Q1~7引腳輸出
void hc595send_data(uint8 data)//要傳輸?shù)臄?shù)據(jù),建議用數(shù)組的方法來查詢
{
uint8 i;
IO0CLR = spi_stcp;
for(i=0;i<8;i++)
{
IO0CLR = spi_shcp;
if((data&0x80)!=0)IO0SET = spi_ds;
else IO0CLR = spi_ds;
data <<= 1;
IO0SET = spi_shcp;
}
IO0SET = spi_stcp;
}