新聞中心

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

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

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

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

本文引用地址:http://m.butianyuan.cn/article/201611/317325.htm

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

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

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

原理圖:

說明:

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來說,只要注意時(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)閉