一、原理介紹
595有兩個寄存器,都是8位的,如下所示:
595是串入並出帶有鎖存功能移位寄存器,它的使用方法簡單:
- - 在正常使用時 /SCLR接高電平,/G接低電平。
- - 從SER每輸入一位數據,串行輸入時鍾SCK上升沿有效一次,直到八位數據輸入完畢
- - 輸出時鍾上升沿有效一次,此時,輸入的數據就被送到了輸出端。
不同的595引腳名稱會不一樣,但是功能是一樣的。大家看引腳序號即可。以下是595引腳圖:
595具體使用的步驟:
第一步:目的:將要准備輸入的位數據移入74HC595數據輸入端上。(用到SER數據輸入引腳)
方法:送位數據到595。
第二步:目的:將位數據逐位移入74HC595,即數據串入(用到SCK引腳,移位寄存器)
方法:SCK 產生一上升沿,將595上的數據移入74HC595中的移位寄存器中,從低到高
第三步:目的:並行輸出數據。即數據並出(用到RCK引腳,鎖存器)
方法:RCK 產生一上升沿,將由SER上已移入數據寄存器中的數據送入到輸出鎖存器。
二、proteus 仿真畫圖
由於手頭上沒有595的硬件,用proteus進行仿真。
接線:
單片機的P1.4接按鍵;
單片機的P1.5接 LED;(起初用來測試按鍵,可忽略)
單片機的P2.0接595的DS(即SER)
單片機的P2.1接595的SH_CP(即SCK)
單片機的P2.2接595的ST_CP(即RCK)
595的8個輸出口,接8個LED燈的正極
功能:
按下按鍵,8個LED燈亮起;(長按、短按)
松開按鍵,8個LED燈熄滅;
三、單片機程序
1、定義io、標志位
sbit SER_595=P2^0; // DS 串行數據輸入端 sbit RCK_595=P2^2; // ST_CP 數據:移位寄存器--To--存儲寄存器 (上升沿) sbit SCK_595=P2^1; // SH_CP 數據移位:QA--QB--QC-- ... --QH (上升沿) sbit Button=P1^4; //按鍵 sbit LED=P1^5; uchar Btn_State=1; //按鍵狀態標志 uchar Count_Put=0xFF; //取反標志
2、發送數據函數:
//發送數據 void HC595_Send_Data(uchar send_data) { uchar i; for(i=0;i<8;i++) { if((send_data<<i)&0x80)//判斷最高位是否是1 SER_595=1; //是1,則使SER=1, else SER_595=0; //是0,則使SER=0 SCK_595=0;//上升沿(移入數據) _nop_(); _nop_(); SCK_595=1; } }
函數功能解釋:
(1)一次只能發送8位數據,循環8次以下工作:
- - 將這8位數據和先向左移 i 位,再和0x80做與運算,從而判斷數據的第一位是0還是1,進而使SER=0或者1
- - 接着給SCK_595一個上升沿脈沖,微妙級,將最高位數據0或者1送入595的移位寄存器
(2)i從0開始,也就是從數據的最高位開始,假如數據為01101100,則0先被送至移位寄存器,接着是1,以此類推。
3、輸出數據函數:
//輸出數據 void HC595_Put_Data() { RCK_595=0; _nop_(); _nop_(); RCK_595=1; }
4、主函數:
void main() { LED=1;//初始關閉 while(1){ //按鍵控制8個LED燈 if(Button!=Btn_State) //按下 Button=0 Btn_State=1 { HC595_Send_Data(0xFF&Count_Put); HC595_Put_Data(); Count_Put=~Count_Put; LED=~LED; Btn_State=Button; //Button=0 Btn_State=0 } } }
四、現象
另外:看到有篇文章寫的很好,大家可以去看看這個:
http://www.21ic.com/jichuzhishi/datasheet/74HC595/data/757249.html