74HC595 8位移位寄存器的使用小結


上一篇文章已經講到,電燈電路比較復雜,以少控多的方式,只能使用串行的方式,因此移位寄存器就發揮功能了。
學生時代,很少實際用過,只是理論學習,但是在項目中,真正用上了,的確要復習一番。
參考文章:
https://blog.csdn.net/k1ang/article/details/80012686 此文有一個錯誤,數據搬運的地方,但值得參考。
http://www.51hei.com/bbs/dpj-152282-1.html 這個文章也不錯
https://www.cnblogs.com/lulipro/p/5067835.html 這個也好
但是最后還是要根據自己的使用情況來分析。我使用的是ti的芯片,也可以參考Nexperia的文檔,加深理解。
移位寄存器的基本原理是,串進並出,有鎖存功能。
具體以芯片手冊來分析。

左側是ti的芯片封裝,引腳排列;

右側是Nexperia芯片封裝,引腳排列的

 

下圖是ti的芯片管腳說明:

0、QA-QH等同於Q1-Q7,8位並行輸出端

1、SER數據輸入端

2、SRCLK是移位用的時鍾管腳,S代表shift,上升沿有效,和Nexperia的SHCP等同

3、RCLK是用的存儲寄存器用的時鍾管腳,上升沿有效,和Nexperia的STCP等同

4、Qh'(低9腳)用於串級,和下級的ser連接即可。和Nexperia的Q7S等同

5、OE輸出是能,低電平有效,

6、10腳可以不用。接地即可

Nexperia引腳功能說明

  還有一個比較好的功能圖:可以解釋SHCP,STCP, OE的作用。

時序圖:可以看出數據位是先進入QA的。

ti的時序圖:

  Nexperia時序圖:

   數據的搬運過程如下:參考自博客,原圖有錯誤,做了修改: 

  上面的圖中,先在DS引腳輸出1,在輸入0,以次類推,74hc595首先將數據位寫入Q0,之后陸續寫入Q1,以此類推,Q7寫完后,如果還有數據在ser輸出,就從Q7s端口輸出到下一級芯片,實現級聯。

一般情況是一次性輸入8個數據,使用for循環,上升沿寫入存儲寄存器。

最后使用stcp的上升沿,將輸出輸出端的數據並行輸出引腳端。

 參考代碼如下:

byte = WRITE_1_STEP_1;
        for (i = 0; i < 8; i++)
        {
            //步驟1:將數據傳到DS引腳
            if (byte & 0x80)    //先傳輸高位,通過與運算判斷第八是否為1
            {
                DS_OUT_HIGH;    //如果第八位是1,則與 595 DS連接的引腳輸出高電平
            }
            else
            {
                DS_OUT_LOW;     //否則輸出低電平
            }

            //步驟2:SHCP每產生一個上升沿,當前的bit就被送入移位寄存器
            SHCP_CLK_OUT_LOW;   //SHCP拉低
            delay_us(CLK_DELAY_US);
            SHCP_CLK_OUT_HIGH;   //SHCP拉高, SHCP產生上升沿
            delay_us(CLK_DELAY_US);
            byte <<= 1;     // 左移一位,將低位往高位移
        }

        //位移寄存器數據准備完畢,轉移到存儲寄存器
        //步驟3:STCP產生一個上升沿,移位寄存器的數據移入存儲寄存器
        STCP_CLK_OUT_LOW;   // 將STCP拉低
        delay_us(CLK_DELAY_US);           // 適當延時
        STCP_CLK_OUT_HIGH;  // 再將STCP拉高,STCP即可產生一個上升沿
        delay_us(CLK_DELAY_US);

  另外,數字電路的時鍾保持是有要求,數據手冊上面是ns級別,但是實際的電路可能比較復雜,通常10us的高、低電平是可以成功寫入的,延時太短是寫不成功。

實際電路設計如下:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM