您的位置 首页 方案

AVR学习心得(三)

AVRmega128SPI控制HC595经过多天的努力,终于对AVR控制HC595驱动数码管,有了全面的认识和了解。下面我将把AVR控制HC595的设计经验…

AVR mega128 SPI 操控HC595

通过多天的尽力,总算对AVR操控HC595驱动数码管,有了全面的知道和了解。下面我将把AVR操控HC595的规划经历写在下面:

AVR操控HC595操控有两种办法:

一种:运用AVR自带的SPI接口操控;

一种:运用AVR端口模仿SPI办法操控。

原理图:

阐明:

1。用AVR自带的SPI总线接口操控时,要留意几个SPI寄存器的运用:

  • 设置SPI的管脚状况:

DDRB|=(1<

  • SPI操控寄存器SPCR:

SPCR=(1<

  • SPI数据寄存器SPDR:

SPDR = Data; /* 发动数据传输 */

  • SPI状况寄存器SPSR:

while(!(SPSR & (1<

而关于HC595来说,只需留意时序就能够了。关于用SPI接口办法,移位寄存器的时序有AVR主动发生,不必去管它,只要存储寄存器的时序有软件操控。

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

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

把数据从HC595送入存储寄存器

void SPI_MasterTransmit(char Data)
{
/* 发动数据传输 */
SPDR = Data;
/* 等候传输完毕 */
while(!(SPSR & (1< ;
}

数据从595的并行口输出

void HC_595_OUT(unsigned char data)
{
SS_L(); //拉低存储寄存器时钟
SPI_MasterTransmit(data); //传送数据到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<//串行数据输入
#define MOSI_H() PORTB|=(1<#define MOSI_L() PORTB&=~(1<

把数据从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;
}
}

数据从595的并行口输出

void HC_595_output(unsigned char data)
{
SS_L();//存储寄存器时钟拉低时钟
HC_595_input(data);
SS_H();//存储寄存器时钟拉高时钟
}

总结:

由上面的函数能够看出,这两种办法,只是该变的是《把数据从HC595送入存储寄存器》函数,下面的《数据从595的并行口输出》函数完全是相同的。而用榜首种办法函数要简略些,可是设置要杂乱,要懂得AVR的寄存器的功用和设置办法。用第二种办法不需要太多的设置,能够在不了解单片机内部寄存器的情况下进行操控,函数杂乱些。但只需要了解595的时序就能够操控,并于移植。

/*SPI接口初始化*/

void SPI_MasterInit(void) {

DDRB |= (1<

PORTB=~((1<

//装备拉电阻

SPCR = (1<

| (1<

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/275855.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部