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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > AVR學(xué)習(xí)心得(三)

          AVR學(xué)習(xí)心得(三)

          作者: 時(shí)間:2016-11-10 來(lái)源:網(wǎng)絡(luò) 收藏
          AVR mega128 SPI 控制HC595

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

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

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

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

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

          原理圖:

          說(shuō)明:

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

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

          DDRB|=(1<

          • SPI控制寄存器SPCR:

          SPCR=(1<

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

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

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

          while(!(SPSR & (1<

          而對(duì)于HC595來(lái)說(shuō),只要注意時(shí)序就可以了。對(duì)于用SPI接口方式,移位寄存器的時(shí)序有AVR自動(dòng)產(chǎn)生,不用去管它,只有存儲(chǔ)寄存器的時(shí)序有軟件控制。

          #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送入存儲(chǔ)寄存器

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

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

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

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

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

          //存儲(chǔ)寄存器時(shí)鐘輸入
          #define SS_H() PORTB|=(1<#define SS_L() PORTB&=~(1<//移位寄存器時(shí)鐘輸入
          #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送入存儲(chǔ)寄存器

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

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

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

          總結(jié):

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

          /*SPI接口初始化*/

          void SPI_MasterInit(void) {

          DDRB |= (1<

          PORTB=~((1<

          //配置拉電阻

          SPCR = (1<

          | (1<

          }



          關(guān)鍵詞: AVR學(xué)習(xí)心

          評(píng)論


          技術(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); })();