电子大神的日记本,供应链专家的功夫茶盘,在这里记录、分享与共鸣。

登录以开始

ATmega16之SPI接口分析及SPI接口来控制595实现数码管

第四章    SPI接口

       上面这幅图就是主机和从机的接口连接图。

       上面这幅图就是关于SPI接口的主从机得管脚连接图。左边是主机的接口,右边是从机的接口。

void SPI_MasterInit(void)//这个就是主机SPI接口的初始化的函数了

{

/* Set MOSI and SCK output, all others input */

DDR_SPI = (1<

#include <macros.h>

#include "delay.h"

#include "spi.h"

 

/*数码管0,1,2,3,4,5,6,7,8,9显示*/

unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};

 

void port_init(void)

 {

  DDRA =0X00;                  //上拉

  PORTA=0XFF;

  DDRB =0XFF;                  //低四位输出低电平,使四位数码管均作显示

  PORTB=0XF0;                  //MISO输出高电平,关闭595移位寄存器的数据清零功能

  DDRC =0X00;                  //上拉

  PORTC=0XFF;

  DDRD =0X00;                  //上拉

 }

 

/*-----------------------------------------------------------------

函数名称: void HC595out(uchar i)

函数功能: 74HC595数据输出显示

参    数:

返 回 值: 无

-----------------------------------------------------------------*/

void HC595out(unsigned char i)

{

   PORTB&=~(1<<4);             //等待数据传输,595存储寄存器数据不变

   SPIMasterTransmit(i);       //传输数据

   PORTB|=(1<<4);              //595移位寄存器的数据进入数据存储寄存器,并在数码管上显示

}

 

void main(void)

{

  unsigned char i=0;

  port_init();//端口初始化操作

  PORTD=0XFF;

 

  SPImasterInit();             //SPI初始化

  while(1)

  {

    i++;

    if(i>9)

       {

         i=0;

       }

    HC595out(tab[i]);//传送数据到595

       DelayMs(1000);//延时一段时间是数码管显示数字之间的时间差

  }

}

接下来看看SPI的初始化函数和SPI传送数据的函数

void SPImasterInit(void)     //SPI初始化

{

  DDRB|=(1<<7)|(1<<5);       //设置SCK,MOSI为输出,其他为输入

  SPCR|=(1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0);//使能SPI,主模式,Fck/128

}

/*-----------------------------------------------------------------

函数名称: void SPIMasterTransmit(uchar TranData)

函数功能: SPI数据传输

参    数:

返 回 值: 无

-----------------------------------------------------------------*/

void SPIMasterTransmit(unsigned char TranData)   

{

  SPDR=TranData;                          //数据放入SPI寄存器中

  while(!(SPSR&(1<<SPIF)));               //查询发送完毕的标志位等待数据传输完毕

}

还有一个延时函数

void Delay(void)                       

    {

    unsigned char a, b, c;

    for (a = 1; a; a++)

        for (b = 1; b; b++)

            for (c = 0; c<10; c++)  //循环次数=255*255*10

                    ;

}

但是我现在还没看懂这个语法是怎么玩的,    for (a = 1; a; a++)就是这个FOR循环,但是意思还是知道的,就是那个中间的a就是a小于等于255的意思。错了,看来我的猜测是错了,刚才查了下,是这个意思,只有当表达式2中的值为真是继续执行循环体内语句,否则为假时则退出。那么就是这样的了,首先我们定义的a是0—255的,然后当加到255时下个就是0了为假,网上是这样说的,我刚刚查了下,比如if(数字) 其实隐藏了原始是if(数字!=0)这样就很容易理解了。^_^

博主
578645627@qq.com
惊涛骇浪's Blog
QQ群:电子爱好者194554761欢迎您的加入!
点击跳转