<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > AVR學習心得(三)

          AVR學習心得(三)

          作者: 時間:2016-11-10 來源:網(wǎng)絡 收藏
          AVR mega128 SPI 控制HC595

          經(jīng)過多天的努力,終于對AVR控制HC595驅(qū)動數(shù)碼管,有了全面的認識和了解。下面我將把AVR控制HC595的設計經(jīng)驗寫在下面:

          本文引用地址:http://www.ex-cimer.com/article/201611/317325.htm

          AVR控制HC595控制有兩種方法:

          一種:利用AVR自帶的SPI接口控制;

          一種:利用AVR端口模擬SPI方式控制。

          原理圖:

          說明:

          1。用AVR自帶的SPI總線接口控制時,要注意幾個SPI寄存器的使用:

          • 設置SPI的管腳狀態(tài):

          DDRB|=(1<

          • SPI控制寄存器SPCR:

          SPCR=(1<

          • SPI數(shù)據(jù)寄存器SPDR:

          SPDR = Data; /* 啟動數(shù)據(jù)傳輸 */

          • SPI狀態(tài)寄存器SPSR:

          while(!(SPSR & (1<

          而對于HC595來說,只要注意時序就可以了。對于用SPI接口方式,移位寄存器的時序有AVR自動產(chǎn)生,不用去管它,只有存儲寄存器的時序有軟件控制。

          #define SS 0
          #define SCK 1
          #define MOSI 2
          #define MISO 3

          #define SS_H() PORTB|=(1<#define SS_L() PORTB&=~(1<

          把數(shù)據(jù)從HC595送入存儲寄存器

          void SPI_MasterTransmit(char Data)
          {
          /* 啟動數(shù)據(jù)傳輸 */
          SPDR = Data;
          /* 等待傳輸結(jié)束 */
          while(!(SPSR & (1< ;
          }

          數(shù)據(jù)從595的并行口輸出

          void HC_595_OUT(unsigned char data)
          {
          SS_L(); //拉低存儲寄存器時鐘
          SPI_MasterTransmit(data); //傳送數(shù)據(jù)到HC595
          SS_H(); //拉高存儲寄存器時鐘
          }

          2。AVR模擬SPI總線控制HC595:

          對于這種方法,要求對單片機的了解要少一些。把AVR與HC595相接的口都設置為輸出,然后按595的時序控制595 即可。

          //存儲寄存器時鐘輸入
          #define SS_H() PORTB|=(1<#define SS_L() PORTB&=~(1<//移位寄存器時鐘輸入
          #define SCK_H() PORTB|=(1<#define SCK_L() PORTB&=~(1<//串行數(shù)據(jù)輸入
          #define MOSI_H() PORTB|=(1<#define MOSI_L() PORTB&=~(1<

          把數(shù)據(jù)從HC595送入存儲寄存器

          void HC_595_input(unsigned char data)
          {
          unsigned char i;
          for(i=0;i<8;i++)
          {
          SCK_L();//移位寄存器時鐘拉低時鐘
          if(data&0x80) //最高位判斷
          {
          MOSI_H(); //最高位為1,則寫1到DS口
          }
          else
          {
          MOSI_L(); //最高位為0,則寫0到DS口
          }
          SCK_H();//移位寄存器時鐘拉高時鐘
          delay_1us();
          data<<=1;
          }
          }

          數(shù)據(jù)從595的并行口輸出

          void HC_595_output(unsigned char data)
          {
          SS_L();//存儲寄存器時鐘拉低時鐘
          HC_595_input(data);
          SS_H();//存儲寄存器時鐘拉高時鐘
          }

          總結(jié):

          由上面的函數(shù)可以看出,這兩種方法,僅僅該變的是《把數(shù)據(jù)從HC595送入存儲寄存器》函數(shù),下面的《數(shù)據(jù)從595的并行口輸出》函數(shù)完全是一樣的。而用第一種方法函數(shù)要簡單些,但是設置要復雜,要懂得AVR的寄存器的功能和設置方法。用第二種方法不需要太多的設置,可以在不了解單片機內(nèi)部寄存器的情況下進行控制,函數(shù)復雜些。但只需要了解595的時序就可以控制,并于移植。

          /*SPI接口初始化*/

          void SPI_MasterInit(void) {

          DDRB |= (1<

          PORTB=~((1<

          //配置拉電阻

          SPCR = (1<

          | (1<

          }



          關(guān)鍵詞: AVR學習心

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();