搜索
bottom↓
回复: 192

代码共享:AVR单片机SPI实例

[复制链接]

出0入0汤圆

发表于 2005-1-5 16:13:55 | 显示全部楼层 |阅读模式
本人的一个SPI的实例,通过SPI实现两机通讯,

采用中断方式实现双全工通讯。

本例用两MEGA8515实现,连接为:

MISO----MISO

MOSI----MOSI

SCK ----SCK

/SS ----/SS

将要发送的数据加载到发送缓冲区的函数fill_tx_buffer

和从接收缓冲区读出数据的函数read_rx_buffer未给出,

根据各自需求请自己完成。



#define SPI_RX_BUFFER_SIZE 10

#define SPI_RX_BUFFER_MASK ( SPI_RX_BUFFER_SIZE - 1 )

#define SPI_TX_BUFFER_SIZE 10

#define SPI_TX_BUFFER_MASK ( SPI_TX_BUFFER_SIZE - 1 )

#define SET_SPI_MODE PORTB.4

#define SPI_MODE PINB.4



static unsigned char SPI_RxBuf[SPI_RX_BUFFER_SIZE];

static volatile unsigned char SPI_RxHead;

static unsigned char SPI_TxBuf[SPI_TX_BUFFER_SIZE];

static volatile unsigned char SPI_TxHead;

//******************************************

// SPI 中断服务程序

//******************************************

interrupt [SPI_STC] void spi_isr(void)

{

unsigned char data;

if(spi_m==0)                                     //如果spi_m为0,表明是接收状态

  {

   data = SPDR;                                  //读入接受到的数据

      SPI_RxBuf[SPI_RxHead-1] = data;            //将接收到的数据存入接收缓存区

      if ( SPI_RxHead  == SPI_RX_BUFFER_MASK )   //如果是接收帧的最后一个数据  

        {

         SPI_RxHead = 0;                         //已接收数据还原

         MSTR=1;                                 //接收完成,将SPI设回主方式

         spi_trans_com=1;                        //置接收完成标志

        }

      else

        {   

         SPI_RxHead++;                           //已接收数据计数器加1

        }

   

  }

else                                             //如果spi_m为1,表明是发送状态

   {

                                       

       if ( SPI_TxHead <= SPI_TX_BUFFER_MASK)    //如果要发送的数据还未全部发完

        {   

         SPDR = SPI_TxBuf[SPI_TxHead];           //从发送缓存区取数发送

         SPI_TxHead++;                           //已发送数据计数器加1

        }

       else                                      //如果要发送的数据已全部发完

         {

           SPI_TxHead=0;                         //已发送数据计数器还原

           DDRB.4=0;

           SET_SPI_MODE=1;                       //释放总线,以便接收方进入主发送。

           spi_m=0;                              

           spi_sending=0;                        //清空发送中标记

         }

   

   }



}



//******************************************

// SPI 初始化

//******************************************

void InitSPI(void)

{



SPCR=0x52;

SPI_RxHead = 0;

SPI_TxHead = 0;



}



//******************************************

//发送数据

//******************************************

void spi_send(void)

{

if(spi_sending==0)      //发送中标记为0,表明spi发送空闲

   {

   

    fill_tx_buffer();   //调用fill_tx_buffer函数,将要发送的数据加载到发送缓冲区

    while(PINB.4==0)    //如果PINB.4为低,表明总线被接受方占用,等待直至接受方发送完成。

     {;}

   

    InitSPI();          //初始化spi为主方式

    DDRB.4=1;

    SET_SPI_MODE=0;     //将PORTB.4拉低,强迫接收方进入从接收方式

    spi_m=1;            //置spi_m标志表明为发送状态

    delay_us(10);

    spi_sending=1;      //置spi_sending标志表明发送进行中

    SPDR=0xFF;          //开始发送,接收方接收到的第一个数据为0xFF应忽略

    SPIE=1;             //开SPI中断,

    SPI_TxHead = 0;     //已发送数据计数器清0

   }

}



void main(void)

{



...

while(1)

  {

   ...

   

   if(spi_trans_com==1) //如果接收完成标志为1,表明有所数据已接收

     {

      read_rx_buffer(); //调用read_rx_buffer函数,将接收到的数据从接收缓冲区读出

      spi_trans_com=0;  //读完清除接收完成标志

     }

   ...



  }



}

出0入0汤圆

发表于 2005-1-5 16:35:18 | 显示全部楼层
好贴,顶!

出0入0汤圆

发表于 2005-1-5 21:09:37 | 显示全部楼层
好贴,实用性很强,谢谢Paul

出0入0汤圆

发表于 2005-1-13 21:28:01 | 显示全部楼层
好帖...学习之中...

出0入0汤圆

 楼主| 发表于 2005-1-13 22:38:08 | 显示全部楼层
此代码为本人原创,如有改进请不吝指正。

出0入0汤圆

发表于 2005-4-14 17:21:36 | 显示全部楼层


好贴

偶最近开始学C编程

学习中....

出0入0汤圆

发表于 2005-4-27 11:12:06 | 显示全部楼层
楼主



有一个问题

我发数据是上升沿采样

收数据是下降沿采样

有没有什么好的方法啊

我发了一个字节后马上要接收



现在的问题是我用

while(!(SPSR&(1<<SPIF)))

;

return SPDR;

来收的话

时钟都看不到
-----此内容被wowo于2005-04-27,15:12:15编辑过

出0入0汤圆

发表于 2005-5-5 11:22:36 | 显示全部楼层
好!

出0入0汤圆

发表于 2005-5-10 16:27:01 | 显示全部楼层
求教:是不是要包含什么头文件呀

出0入0汤圆

发表于 2005-5-28 22:08:05 | 显示全部楼层
这个程序能用于X5045P这个器件吗

出0入0汤圆

发表于 2005-6-3 10:29:21 | 显示全部楼层
他头文件没贴上来,

出0入0汤圆

发表于 2005-7-15 09:57:42 | 显示全部楼层
搂主,有一个不是很理解:SPI为全双工,一边发一边收,在你的中断服务程序中

为什么有个spi_m标志,看到你的中断程序,好像是半双工的,在发的同时不能接受的,

不知我的理解对么?

出0入0汤圆

发表于 2005-8-26 16:26:02 | 显示全部楼层
???

本例用两MEGA8515实现,连接为:

MISO----MISO

MOSI----MOSI

SCK ----SCK

/SS ----/SS

???

应该是这样吧

MISO----MOSI

MOSI----MISO

出0入0汤圆

发表于 2005-8-26 16:46:56 | 显示全部楼层
to lchsh:

MISO----MISO  

MOSI----MOSI  

SCK ----SCK

是正确的,一个做了主机,另一个一定只能做从机了----模式变换.

出0入0汤圆

发表于 2005-10-24 10:17:27 | 显示全部楼层
不错不错

出0入0汤圆

发表于 2005-10-28 17:04:17 | 显示全部楼层
谢谢!

出0入0汤圆

发表于 2005-10-28 17:05:45 | 显示全部楼层
顶,正合我意

出0入0汤圆

发表于 2005-10-28 17:16:54 | 显示全部楼层
不错,顶下

出0入0汤圆

发表于 2005-11-7 23:22:36 | 显示全部楼层
你的这段代码是否对主从机都适合,我的意思是主从机都可以用同的这段代码进行工作呢

出0入0汤圆

发表于 2005-11-15 11:29:48 | 显示全部楼层
应该是都合适的. 应该是所有 IC~ 都用这个程序吧

这个方法不错,不过有些地方还不太懂.

就是IC初始化时,SPI怎么设置?

我的理解是

/SS 为输入  且上拉使能

SPCR=(1<<spie)|(1<<SPE)|(1<<MASTRE)

其他口通过程序设置和SPI自动配置吧?

那这一段//-------

void spi_send(void)

{

if(spi_sending==0)      //发送中标记为0,表明spi发送空闲

   {

     

    fill_tx_buffer();   //调用fill_tx_buffer函数,将要发送的数据加载到发送缓冲区

    while(PINB.4==0)    //如果PINB.4为低,表明总线被接受方占用,等待直至接受方发送完成。

     {;}

     

    InitSPI();          //初始化spi为主方式

    DDRB.4=1;  

//---------------------

//这里要不要将MOSI,SCK设置为输出?按我的理解应该要...

//----------------------

    SET_SPI_MODE=0;     //将PORTB.4拉低,强迫接收方进入从接收方式

//----------------------

//这样的话,从机的SPIF会置位吧,(MEGA8的...) 那假如从机初始化是开着SPI中断的,就进入中断执

//程序,但和主机一个程序的话,那进入中断后,接收到错误数据(主机都未发送),应舍弃吧.

//----------------------

    spi_m=1;            //置spi_m标志表明为发送状态

    delay_us(10);

    spi_sending=1;      //置spi_sending标志表明发送进行中

    SPDR=0xFF;          //开始发送,接收方接收到的第一个数据为0xFF应忽略



                        //(从机判断的正确数据从FF开始?)



    SPIE=1;             //开SPI中断,

    SPI_TxHead = 0;     //已发送数据计数器清0

   }

}



目前只考虑了主对从,从不动作. 的情况,发生冲突还没细想...

那应该就是 主机发送2字节数据(FF+数据),从机中断能收到3字节(错误数据+FF+数据)

不知道这样理解正确否?








-----此内容被989898于2005-11-15,16:05:19编辑过

出0入0汤圆

发表于 2005-11-15 16:06:35 | 显示全部楼层
删贴再顶...

闲的人帮忙看下~

出0入0汤圆

 楼主| 发表于 2005-11-15 19:21:47 | 显示全部楼层
“//这里要不要将MOSI,SCK设置为输出?按我的理解应该要...”

   不用设置,SPI初始化为主方式后MOSI,SCK自动变为输出。



“//这样的话,从机的SPIF会置位吧,(MEGA8的...) 那假如从机初始化是开着SPI中断的,就进入中断执

//程序,但和主机一个程序的话,那进入中断后,接收到错误数据(主机都未发送),应舍弃吧. ”

   mega8没使过不清楚,但mega8515,mega16上用过没有这样的问题。

出0入0汤圆

发表于 2005-11-16 14:59:14 | 显示全部楼层
哦,可能. 器件不同,MEGA8主方式不自动配置为输出,由用户定义. 那个SPIF置位是有的,可能8515不会吧.

可能还有两个问题, 如下

void spi_send(void)  

{  

if(spi_sending==0)      //发送中标记为0,表明spi发送空闲  

   {  

      

    fill_tx_buffer();   //调用fill_tx_buffer函数,将要发送的数据加载到发送缓冲区  

    while(PINB.4==0)    //如果PINB.4为低,表明总线被接受方占用,等待直至接受方发送完成。  

     {;}  



//-------------------------------------------

//假如两台机器同时使用这个发送子程序,且能同时到达这里,

//那么两台机器照接下来的程序运行,SS脚都会变成输出,无法触发中断

//且一直有SPI_SENDING标志,无法进行下一次发送来初始化~

//我想是不是要在置SPI_SENDING 标志后,判断100ms内连续为1

//则清零并初始化SS引脚为输入

//-------------------------------------------  

    InitSPI();          //初始化spi为主方式  

    DDRB.4=1;   



    SET_SPI_MODE=0;     //将PORTB.4拉低,强迫接收方进入从接收方式  



    spi_m=1;            //置spi_m标志表明为发送状态

    delay_us(10);  

//----------------------------------------

//这里的延迟是干嘛用的?本来以为是跳过 因拉低SS引脚强迫接收方进入从机方式

//而引起的中断 ,  但看楼主这样说,又不是了,仅仅是延迟?

//----------------------------------------

    spi_sending=1;      //置spi_sending标志表明发送进行中  

    SPDR=0xFF;          //开始发送,接收方接收到的第一个数据为0xFF应忽略  



                        //(从机判断的正确数据从FF开始?)



    SPIE=1;             //开SPI中断,  

    SPI_TxHead = 0;     //已发送数据计数器清0  

   }  

}

出0入0汤圆

发表于 2005-11-16 15:08:56 | 显示全部楼层
还有:

interrupt [SPI_STC] void spi_isr(void)

{

unsigned char data;

if(spi_m==0)                                     //如果spi_m为0,表明是接收状态

  {

      

  }

else                                             //如果spi_m为1,表明是发送状态

   {



//SPI_M,就是用来判是处于什么方式的吧,有没可能出现 SPI_M为1,

//但MSTR被拉低变成0的情况,那被拉低的从机没有清SPI_M标志的话,就进入了发送中断

//被拉低是为了接收中断的,与本意冲突~

出0入0汤圆

 楼主| 发表于 2005-11-16 18:49:20 | 显示全部楼层
“//-------------------------------------------

//假如两台机器同时使用这个发送子程序,且能同时到达这里,

//那么两台机器照接下来的程序运行,SS脚都会变成输出,无法触发中断

//且一直有SPI_SENDING标志,无法进行下一次发送来初始化~

//我想是不是要在置SPI_SENDING 标志后,判断100ms内连续为1

//则清零并初始化SS引脚为输入

//------------------------------------------- ”  

完全有可能,但几率很小,至少到现在还未见影响(代码已用于产品上2年多了)。修正一下还是有必要。



“//----------------------------------------

//这里的延迟是干嘛用的?本来以为是跳过 因拉低SS引脚强迫接收方进入从机方式

//而引起的中断 ,  但看楼主这样说,又不是了,仅仅是延迟?  

//---------------------------------------- ”

延迟的作用是等待从机完成主到从地变换,毕竟要执行完这个过程是要点时间的。



“//SPI_M,就是用来判是处于什么方式的吧,有没可能出现 SPI_M为1,

//但MSTR被拉低变成0的情况,那被拉低的从机没有清SPI_M标志的话,就进入了发送中断

//被拉低是为了接收中断的,与本意冲突~ ”

这个不会,在进入主发送时有总线占用的判断,而在释放总线时SPI_M会被清除。

出0入0汤圆

发表于 2005-11-20 17:27:55 | 显示全部楼层
照楼主的思路基本上实现了,不过我两块板用了  3根数据线和 2根电源线连着的。。。

这个电源线是不是可以省的,具体不会弄。。。 弄个电容+二极管什么的就可以了么。。。

出0入0汤圆

发表于 2005-11-27 21:22:07 | 显示全部楼层
很不错,谢谢你的实例!!!

我也正准备用这个

感觉IIC得太麻烦~~~中断里的一大串case吓人

出0入0汤圆

发表于 2005-11-28 17:27:17 | 显示全部楼层
问一个初级的问题~~

从机发送数据的时候,如果有别的中断占用了时间

假设用了10us,错过了向SPDR发送数据,这样是不是会造成通信故障?

出0入0汤圆

发表于 2005-11-29 12:47:55 | 显示全部楼层
中断是CPU的事.本次传送是SPI硬件的事情.

出0入0汤圆

发表于 2005-12-1 00:34:31 | 显示全部楼层
有无SPI/USI的例程???



TestCode-->看21ic里给你的鸡毛信...

出0入0汤圆

发表于 2005-12-6 21:28:53 | 显示全部楼层
我用SPI 与ZLG 7289 试了几天都没成功,呜呜........

出0入0汤圆

发表于 2005-12-6 22:26:14 | 显示全部楼层
看了一些回复,感觉很无奈

我觉得楼主主要是想把自己的程序贴出来和大家共同研究

但是感觉好多人总是想怎么可以直接把这个东西拿来就用,=  =

出0入0汤圆

发表于 2005-12-7 10:10:15 | 显示全部楼层
我以前也用SPI的接口对另外的片子进行过程序烧写.比如用mega162来烧写和配置Tiny2313,mega48等.

接口的连线是跟楼主一样的. 不需要交叉,一一对应就好了!



大家在用别人的代码的时候多思考下,不要企图拿来就用,要分析下的嘛!



别人只是给你参考,不是给你答案!



同意  bengol  的看法!

出0入0汤圆

发表于 2006-3-10 16:08:37 | 显示全部楼层
楼主太厚道了,我正在为这个发愁呢,谢谢楼主,顶!!!!

出0入0汤圆

发表于 2006-3-10 16:39:13 | 显示全部楼层
这几天在搞SPI双机通讯(两片mega88),中断方式发送、中断方式接收通讯正常,查询方式发送,中断方式接收,通讯不正常,只收到一个数据

出0入0汤圆

发表于 2006-4-10 17:07:51 | 显示全部楼层

出0入0汤圆

发表于 2006-4-10 23:47:33 | 显示全部楼层
测试的速度有多快?

出0入0汤圆

发表于 2006-5-21 15:45:10 | 显示全部楼层
先收藏了,慢慢看。

出0入0汤圆

发表于 2006-6-30 16:01:49 | 显示全部楼层
多谢

出0入0汤圆

发表于 2006-7-4 10:14:46 | 显示全部楼层
真好,多谢!

出0入0汤圆

发表于 2006-7-12 15:40:56 | 显示全部楼层
先收藏了~问个菜菜的问题,

DataSheet上的振荡器的时钟频率fosc指的是什么意思?

出0入0汤圆

发表于 2006-8-4 17:26:37 | 显示全部楼层
参考楼主的方法,做了个SPI多机通讯的试验,一个M128需要与一个M162通讯,同时还要能操作一块SD卡,连接上都没问题。

出0入0汤圆

发表于 2006-8-4 17:47:26 | 显示全部楼层
楼上成功了吗

出0入0汤圆

发表于 2006-8-4 19:10:22 | 显示全部楼层
没问题!成功了啊!

出0入0汤圆

发表于 2006-8-27 23:27:01 | 显示全部楼层
我正在用两个mega8做spi试验,两个单片机必须要设置成一个输入一个输出吗?sck,miso,mosi的输入输出需要人为设定I/O  还是只需设置成spi格式就行了?新手,还请高人指导!

出0入0汤圆

发表于 2006-9-6 14:45:04 | 显示全部楼层
我用两个mega8通信仿真时,怎么两个芯片的频率一样的时候不行。但我调低了主机的频率又可以了。但从机发回数据时主机又不行了,我想是不是频率问题呢?还是仿真的时候不行,实物可以啊?请高手指教!!!!!!!

出0入0汤圆

发表于 2006-9-6 15:04:50 | 显示全部楼层
楼上的你好,我也在弄SPI M16与M8通信 有QQ吗 我的52115953,交流一下:)

出0入0汤圆

发表于 2006-10-29 13:34:06 | 显示全部楼层
好贴!顶

出0入0汤圆

发表于 2006-10-29 13:36:27 | 显示全部楼层
再顶

出0入0汤圆

发表于 2006-11-7 13:58:33 | 显示全部楼层
学习一下,我的下载都是通过串口实现的,有机会改用SPI试试。谢谢楼主共享,回去好好学习一下

出0入0汤圆

发表于 2006-11-7 13:59:05 | 显示全部楼层
学习一下,我的下载都是通过串口实现的,有机会改用SPI试试。谢谢楼主共享,回去好好学习一下

出0入0汤圆

发表于 2006-12-13 10:09:23 | 显示全部楼层
看一下,谢谢了

出0入0汤圆

发表于 2007-1-24 14:13:26 | 显示全部楼层
楼主这个程序,省得太多,为什么不把库和其他函数的定义写出来,

比如PINB.4这是什么?

DDRB.4

fill_tx_buffer();   

spi_m是状态,具体怎么做的?

这些函数都没列出来,想研究研究都没有办法。

我没有意冒犯楼主,只是觉得这样判断不出这个程序到底怎么样。

出0入0汤圆

发表于 2007-1-24 14:15:36 | 显示全部楼层
楼主这个程序,省得太多,为什么不把库和其他函数的定义写出来,

比如PINB.4这是什么?

DDRB.4

fill_tx_buffer();   

spi_m是状态,具体怎么做的?

这些函数都没列出来,想研究研究都没有办法。

我没有意冒犯楼主,只是觉得这样判断不出这个程序到底怎么样。

出0入0汤圆

发表于 2007-4-7 19:50:38 | 显示全部楼层
楼上的说的好呀,我顶!

出0入0汤圆

发表于 2007-4-22 22:23:48 | 显示全部楼层
严重支持

出0入0汤圆

发表于 2007-4-29 08:17:52 | 显示全部楼层
MISO上总是没有数据,这根线就可以不连了。

出0入0汤圆

发表于 2007-6-29 11:52:00 | 显示全部楼层
顶LZ个肺了,不错!!!

出0入0汤圆

发表于 2007-6-30 19:09:07 | 显示全部楼层
谢谢楼主分享!!

出0入0汤圆

发表于 2007-7-3 09:33:17 | 显示全部楼层
不错

出0入0汤圆

 楼主| 发表于 2007-7-3 15:09:47 | 显示全部楼层
这么老的东西还能翻出,佩服。



这个程序有一个问题:通讯中如有一方复位将导致以后一直出错,请使用时注意自行修改。怎么改应该很容易的,我就不说了。

出0入0汤圆

发表于 2007-8-7 13:26:35 | 显示全部楼层
SPI多机通信可以仿真调吗

出0入0汤圆

发表于 2007-8-8 21:10:41 | 显示全部楼层
如果一带几个机器呢?这样实现起来好像就不太容易!!

出0入0汤圆

发表于 2007-8-10 08:49:20 | 显示全部楼层
//这样的话,从机的SPIF会置位吧,(MEGA8的...) 那假如从机初始化是开着SPI中断的,就进入中断执

//程序,但和主机一个程序的话,那进入中断后,接收到错误数据(主机都未发送),应舍弃吧.



【21楼】的这个问题还没有解决

出0入0汤圆

发表于 2007-8-12 22:52:05 | 显示全部楼层
随便请问一下,我做了一个双工程序,主机发送0x55,0x00 0x00,0x55,从机发送0xaa,0x00,0x00,0xaa;主机只能接收到0x00,0x00,0xaa;从机收到0x00,0x55,0x00,0x00,0x55,这可能是什么原因引起的呀???

出0入0汤圆

发表于 2008-2-2 14:43:25 | 显示全部楼层
不错,好好学习~

出0入0汤圆

发表于 2008-2-2 16:24:31 | 显示全部楼层
SPI能做到全双工么? 只能是半双工啊

出0入0汤圆

发表于 2008-2-8 21:00:53 | 显示全部楼层
好!谢谢 学习中

出0入0汤圆

发表于 2008-3-3 19:50:34 | 显示全部楼层
很好,谢谢楼主!

出0入0汤圆

发表于 2008-3-4 13:00:05 | 显示全部楼层
收藏

出0入0汤圆

发表于 2008-4-1 15:02:27 | 显示全部楼层
好东西
谢谢分享

出0入0汤圆

发表于 2008-4-6 02:51:15 | 显示全部楼层
酷帖!

出0入0汤圆

发表于 2008-4-28 10:28:53 | 显示全部楼层
正要用SPI呢,没想到这么巧啊!^_^

出0入0汤圆

发表于 2008-4-28 10:28:54 | 显示全部楼层
正要用SPI呢,没想到这么巧啊!^_^

出0入0汤圆

发表于 2008-4-29 11:25:43 | 显示全部楼层
嘿嘿,来看看

出0入46汤圆

发表于 2008-4-29 20:07:36 | 显示全部楼层
学习!

出0入0汤圆

发表于 2008-6-7 21:53:07 | 显示全部楼层
学习中,正在学C

出0入0汤圆

发表于 2008-6-8 02:58:25 | 显示全部楼层
收藏,谢谢 ^_^

出0入0汤圆

发表于 2008-6-26 06:01:35 | 显示全部楼层
谢谢,学习了

出0入0汤圆

发表于 2008-6-28 15:58:20 | 显示全部楼层
请教SPI怎么和93C66通讯?

出0入0汤圆

发表于 2008-6-28 20:03:54 | 显示全部楼层
初来论坛,支持下!

出0入0汤圆

发表于 2008-7-4 15:23:39 | 显示全部楼层
jihao

出0入0汤圆

发表于 2008-7-6 08:11:34 | 显示全部楼层
看看也好!

出0入90汤圆

发表于 2008-7-6 08:27:19 | 显示全部楼层
做个记号!

出0入0汤圆

发表于 2008-8-3 15:11:01 | 显示全部楼层
先收藏了  嘿嘿

出0入0汤圆

发表于 2008-11-13 10:08:36 | 显示全部楼层
看到此贴,很是欣喜,先收藏了,支持一下。

AVR新手上路,正在学习AVR单片机,我是边学习边搞仿真,学到SPI,自己编了一段程序,用Protus仿真,可它就是不干活,想请楼主指教一下?

你这段程序能在mega8上跑吧(我学的是mega8)?&nbsp;

自编程序:&nbsp;



主机程序:&nbsp;

/***************************************/

/*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置为从机方式&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/

/***************************************/

void&nbsp;SPI_SlaveInit(void)

{DDRD=0XFF;

&nbsp;DDRB=0XD3;

&nbsp;PORTB=0X2C;

&nbsp;SPCR=0X40;

}



char&nbsp;SPI_SlaveReceive(void)

{

&nbsp;while(!(SPSR&nbsp;&&nbsp;(1&lt;&lt;SPIF)))&nbsp;{;}/*Wait&nbsp;for&nbsp;reception&nbsp;complete*/

&nbsp;return&nbsp;SPDR;&nbsp;/*Return&nbsp;data&nbsp;register*/

}

/***************************************/

/*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;主程序&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/

/***************************************/

int&nbsp;main&nbsp;(void)

{char&nbsp;i;

&nbsp;SPI_SlaveInit();

&nbsp;while(1)

&nbsp;{i=SPI_SlaveReceive();

&nbsp;&nbsp;PORTD=i;

&nbsp;}&nbsp;

}

从机程序:

/***************************************/

/*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置为从机方式&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/

/***************************************/

void&nbsp;SPI_SlaveInit(void)

{DDRD=0XFF;

&nbsp;DDRB=0XD3

&nbsp;PORTB=0X2C;

&nbsp;SPCR=0X40;

}



char&nbsp;SPI_SlaveReceive(void)

{

&nbsp;while(!(SPSR&nbsp;&&nbsp;(1&lt;&lt;SPIF)))&nbsp;{;}/*Wait&nbsp;for&nbsp;reception&nbsp;complete*/

&nbsp;return&nbsp;SPDR;&nbsp;/*Return&nbsp;data&nbsp;register*/

}





/***************************************/

/*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;主程序&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/

/***************************************/

int&nbsp;main&nbsp;(void)

{char&nbsp;i;

&nbsp;SPI_SlaveInit();

&nbsp;while(1)

&nbsp;{PORTD=SPI_SlaveReceive();}&nbsp;

}

电路图ourdev_496194.pdf(文件大小:20K)&nbsp;(原文件名:spi.pdf)&nbsp;

出0入0汤圆

 楼主| 发表于 2008-11-21 11:05:03 | 显示全部楼层
mega8不知道,我没有用过.

干脆给个完整的程序,自己研究吧。







/*****************************************************

This&nbsp;program&nbsp;was&nbsp;produced&nbsp;by&nbsp;the

CodeWizardAVR&nbsp;V1.25.3&nbsp;Professional

Automatic&nbsp;Program&nbsp;Generator

?Copyright&nbsp;1998-2007&nbsp;Pavel&nbsp;Haiduc,&nbsp;HP&nbsp;InfoTech&nbsp;s.r.l.

http://www.hpinfotech.com



Project&nbsp;:&nbsp;

Version&nbsp;:&nbsp;

Date&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;2007-2-15

Author&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

Company&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

Comments:&nbsp;





Chip&nbsp;type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;ATmega48V

Clock&nbsp;frequency&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;8.000000&nbsp;MHz

Memory&nbsp;model&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Small

External&nbsp;SRAM&nbsp;size&nbsp;&nbsp;:&nbsp;0

Data&nbsp;Stack&nbsp;size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;128

*****************************************************/



#include&nbsp;&lt;mega48.h>

#include&nbsp;&lt;delay.h>

#define&nbsp;SPI_RX_BUFFER_SIZE&nbsp;6&nbsp;

#define&nbsp;SPI_RX_BUFFER_MASK&nbsp;(&nbsp;SPI_RX_BUFFER_SIZE&nbsp;-&nbsp;1&nbsp;)&nbsp;

#define&nbsp;SPI_TX_BUFFER_SIZE&nbsp;3&nbsp;

#define&nbsp;SPI_TX_BUFFER_MASK&nbsp;(&nbsp;SPI_TX_BUFFER_SIZE&nbsp;-&nbsp;1&nbsp;)&nbsp;

#define&nbsp;SPI_SET_MASTER&nbsp;SPCR|=(1&lt;&lt;4)

#define&nbsp;SPI_INT_EANBLE&nbsp;SPCR|=(1&lt;&lt;7)

#define&nbsp;SET_SPI_BUS_MODE&nbsp;PORTB.2&nbsp;

#define&nbsp;GET_SPI_BUS_MODE&nbsp;PINB.2&nbsp;



flash&nbsp;unsigned&nbsp;char&nbsp;Tab[]={

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x3F,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//0

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x06,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//1

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x5B,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//2

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x4F,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//3

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x66,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//4

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x6D,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//5

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x7D,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//6

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x07,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//7

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x7F,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//8

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x6F,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//9

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x77,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//A

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x7C,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//B

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x39,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//C

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x5E,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//D

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x79,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//E

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x71&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//F

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};



bit&nbsp;spi_m;

bit&nbsp;spi_trans_com;&nbsp;

bit&nbsp;spi_sending;&nbsp;

bit&nbsp;blank_state;

bit&nbsp;send_failure;

bit&nbsp;disp_blanking;

&nbsp;unsigned&nbsp;char&nbsp;SPI_RxBuf[SPI_RX_BUFFER_SIZE];&nbsp;

&nbsp;volatile&nbsp;unsigned&nbsp;char&nbsp;SPI_RxHead;&nbsp;

&nbsp;unsigned&nbsp;char&nbsp;SPI_TxBuf[SPI_TX_BUFFER_SIZE];&nbsp;

&nbsp;volatile&nbsp;unsigned&nbsp;char&nbsp;SPI_TxHead;&nbsp;

volatile&nbsp;unsigned&nbsp;char&nbsp;disp_buffer[8];

volatile&nbsp;unsigned&nbsp;char&nbsp;disp_buffer2[4][2];

volatile&nbsp;unsigned&nbsp;char&nbsp;disp_digit;



//TIMER0&nbsp;initialize&nbsp;-&nbsp;prescale:1024

//&nbsp;WGM:&nbsp;CTC

//&nbsp;desired&nbsp;value:&nbsp;10mSec

//&nbsp;actual&nbsp;value:&nbsp;10.112mSec&nbsp;(-1.1%)

void&nbsp;timer0_init(void)

{

&nbsp;TCCR0B&nbsp;=&nbsp;0x00;&nbsp;//stop

&nbsp;TCNT0&nbsp;=&nbsp;0x00;&nbsp;//set&nbsp;count

&nbsp;OCR0A=0x16;

&nbsp;TCCR0A&nbsp;=&nbsp;0x02;&nbsp;

&nbsp;TCCR0B&nbsp;=&nbsp;0x05;&nbsp;//start&nbsp;timer

}





//&nbsp;Timer&nbsp;0&nbsp;output&nbsp;compare&nbsp;A&nbsp;interrupt&nbsp;service&nbsp;routine

interrupt&nbsp;[TIM0_COMPA]&nbsp;void&nbsp;timer0_compa_isr(void)

{

&nbsp;&nbsp;PORTD=0x00;

&nbsp;&nbsp;PORTB|=0x03;

&nbsp;&nbsp;PORTC.4=1;

&nbsp;&nbsp;PORTC.5=1;

&nbsp;&nbsp;PORTC&=0xF0;

&nbsp;&nbsp;

&nbsp;&nbsp;switch(disp_digit)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;7:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PORTB.1=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}break;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;6:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PORTB.0=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}break;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;5:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PORTC.5=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}break;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;4:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PORTC.4=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}break;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;3:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(disp_blanking==0||blank_state==0)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PORTC.3=1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}break;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;2:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(disp_blanking==0||blank_state==0)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PORTC.2=1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}break;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;1:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(disp_blanking==0||blank_state==0)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PORTC.1=1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}break;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(disp_blanking==0||blank_state==0)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PORTC.0=1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}break;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;PORTD=disp_buffer[disp_digit];&nbsp;&nbsp;

&nbsp;&nbsp;if(disp_digit&lt;7)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_digit++;

&nbsp;&nbsp;else

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_digit=0;&nbsp;&nbsp;&nbsp;

}



//TIMER1&nbsp;initialize&nbsp;-&nbsp;prescale:1024

//&nbsp;WGM:&nbsp;4)&nbsp;CTC,&nbsp;TOP=OCRnA

//&nbsp;desired&nbsp;value:&nbsp;500mSec

//&nbsp;actual&nbsp;value:&nbsp;499.968mSec&nbsp;(0.0%)

void&nbsp;timer1_init(void)

{

&nbsp;TCCR1B&nbsp;=&nbsp;0x00;&nbsp;//stop

&nbsp;OCR1AH&nbsp;=&nbsp;0x0A;

&nbsp;OCR1AL&nbsp;=&nbsp;0x41;

&nbsp;TCCR1A&nbsp;=&nbsp;0x00;

&nbsp;TCCR1B&nbsp;=&nbsp;0x0D;&nbsp;//start&nbsp;Timer

}





//&nbsp;Timer&nbsp;1&nbsp;output&nbsp;compare&nbsp;A&nbsp;interrupt&nbsp;service&nbsp;routine

interrupt&nbsp;[TIM1_COMPA]&nbsp;void&nbsp;timer1_compa_isr(void)

{

&nbsp;TCCR0B=0x00;

&nbsp;

&nbsp;if(blank_state==1)

&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;blank_state=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer[4]=disp_buffer2[0][0];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer[5]=disp_buffer2[1][0];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer[6]=disp_buffer2[2][0];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer[7]=disp_buffer2[3][0];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;else

&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;blank_state=1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer[4]=disp_buffer2[0][1];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer[5]=disp_buffer2[1][1];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer[6]=disp_buffer2[2][1];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer[7]=disp_buffer2[3][1];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;

TCCR0B=0x05;&nbsp;//start&nbsp;timer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

}



//&nbsp;Timer&nbsp;2&nbsp;output&nbsp;compare&nbsp;interrupt&nbsp;service&nbsp;routine

interrupt&nbsp;[TIM2_COMPA]&nbsp;void&nbsp;timer2_compa_isr(void)

{

//&nbsp;Place&nbsp;your&nbsp;code&nbsp;here



}



//******************************************&nbsp;

//&nbsp;SPI&nbsp;中断服务程序&nbsp;

//******************************************&nbsp;

interrupt&nbsp;[SPI_STC]&nbsp;void&nbsp;spi_isr(void)&nbsp;

{&nbsp;

unsigned&nbsp;char&nbsp;data;&nbsp;

if(spi_m==0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果spi_m为0,表明是接收状态&nbsp;

&nbsp;&nbsp;{&nbsp;

&nbsp;&nbsp;&nbsp;data&nbsp;=&nbsp;SPDR;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读入接受到的数据&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_RxBuf[SPI_RxHead-2]&nbsp;=&nbsp;data;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//将接收到的数据存入接收缓存区&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;SPI_RxHead&nbsp;&nbsp;==(&nbsp;SPI_RX_BUFFER_MASK+2))&nbsp;&nbsp;&nbsp;//如果是接收帧的最后一个数据&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(GET_SPI_BUS_MODE==1)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_RxHead&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//已接收数据还原&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_SET_MASTER;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//接收完成,将SPI设回主方式&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spi_trans_com=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//置接收完成标志&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*DDRB.2=1;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SET_SPI_BUS_MODE=0;&nbsp;*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//处理数据中,禁止发送方发送

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_RxHead++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//已接收数据计数器加1&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;}&nbsp;

else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果spi_m为1,表明是发送状态&nbsp;

&nbsp;&nbsp;&nbsp;{&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;SPI_TxHead&nbsp;&lt;=&nbsp;SPI_TX_BUFFER_MASK)&nbsp;&nbsp;&nbsp;&nbsp;//如果要发送的数据还未全部发完&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPDR&nbsp;=&nbsp;SPI_TxBuf[SPI_TxHead];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//从发送缓存区取数发送&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_TxHead++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//已发送数据计数器加1&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果要发送的数据已全部发完&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_TxHead=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//已发送数据计数器还原&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DDRB.2=0;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SET_SPI_BUS_MODE=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//释放总线,以便接收方进入主发送。&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spi_m=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spi_sending=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//清空发送中标记&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;}&nbsp;



}&nbsp;



//******************************************&nbsp;

//&nbsp;SPI&nbsp;初始化&nbsp;

//******************************************&nbsp;

void&nbsp;InitSPI(void)&nbsp;

{&nbsp;

SPI_RxHead&nbsp;=&nbsp;0;&nbsp;

SPI_TxHead&nbsp;=&nbsp;0;&nbsp;

SPCR=0xD2;&nbsp;

//&nbsp;Clear&nbsp;the&nbsp;SPI&nbsp;interrupt&nbsp;flag

#asm

&nbsp;&nbsp;&nbsp;&nbsp;nop

&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;&nbsp;r30,spsr

&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;&nbsp;r30,spdr

#endasm



}&nbsp;











//******************************************&nbsp;

//发送数据&nbsp;

//******************************************&nbsp;

void&nbsp;spi_send(void)&nbsp;

{&nbsp;

unsigned&nbsp;char&nbsp;temp;

delay_us(50);

if(spi_sending==0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发送中标记为0,表明spi发送空闲&nbsp;

&nbsp;&nbsp;&nbsp;{&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;spi_sending=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//置spi_sending标志表明发送进行中&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;SPI_TxBuf[SPI_TX_BUFFER_MASK]=0;

&nbsp;&nbsp;&nbsp;&nbsp;for(temp=0;temp&lt;SPI_TX_BUFFER_MASK;temp++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//计算校验和

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_TxBuf[SPI_TX_BUFFER_MASK]+=SPI_TxBuf[temp];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;//fill_tx_buffer();&nbsp;&nbsp;&nbsp;//调用fill_tx_buffer函数,将要发送的数据加载到发送缓冲区&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;if(GET_SPI_BUS_MODE==0)&nbsp;&nbsp;&nbsp;&nbsp;//如果PINB.2为低,表明总线被接受方占用,等待直至接受方发送完成。&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(temp=0;temp&lt;200;temp++)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay_us(100);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(GET_SPI_BUS_MODE==1)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;if(temp&lt;100)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitSPI();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//初始化spi为主方式&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DDRB.2=1;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SET_SPI_BUS_MODE=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//将PORTB.2拉低,强迫接收方进入从接收方式&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spi_m=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//置spi_m标志表明为发送状态&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay_us(10);&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPDR=0xFF;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//开始发送

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_INT_EANBLE;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//开SPI中断,&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_TxHead&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//已发送数据计数器清0&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_failure=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_failure=1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spi_sending=0;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;

&nbsp;&nbsp;&nbsp;}&nbsp;

}&nbsp;





//*********************************************************

//设定显示数值

//*********************************************************

void&nbsp;set_disp_vol(void)

{

&nbsp;int&nbsp;data;

&nbsp;unsigned&nbsp;char&nbsp;i;

&nbsp;data=(int)SPI_RxBuf[4]*0x100+SPI_RxBuf[3];

&nbsp;if((data>9999&&SPI_RxBuf[1]==0x00)||(data>999&&SPI_RxBuf[1]==0x01))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果超出显示范围,显示“----“

&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt;4;i++)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer=0x40;

&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;else

&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt;4;i++)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer=Tab[data%10];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//查字形表

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data/=10;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch(SPI_RxBuf[2])&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//消零

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=3;i>0;i--)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(disp_buffer==0x3F)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;break;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;1:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=3;i>1;i--)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(disp_buffer==0x3F)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;break;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;2:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(disp_buffer[3]==0x3F)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer[3]=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;break;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(SPI_RxBuf[2]>0&&SPI_RxBuf[2]&lt;4)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer[SPI_RxBuf[2]]|=0x80;&nbsp;&nbsp;&nbsp;//显示小数点&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;

&nbsp;if(SPI_RxBuf[1]==0x01)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//显示负号

&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer[3]=0x40;

&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;

}



/*inline&nbsp;send_rx_ok(void)

{

&nbsp;&nbsp;while(spi_sending==1);

&nbsp;SPI_RxBuf[0]=0x00;

&nbsp;SPI_RxBuf[0]=0x00;

&nbsp;spi_send();

}&nbsp;*/

void&nbsp;spi_bus_waiting(void)

{

&nbsp;&nbsp;unsigned&nbsp;char&nbsp;temp=0;

&nbsp;&nbsp;while(spi_sending==1)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay_us(10);&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp++;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(temp>100||spi_sending==0)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spi_sending=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

}



void&nbsp;read_rx_buffer(void)



{

&nbsp;unsigned&nbsp;char&nbsp;check_sum,temp;

&nbsp;DDRB.2=1;&nbsp;&nbsp;

&nbsp;SET_SPI_BUS_MODE=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//处理数据中,禁止发送方发送

&nbsp;check_sum=0;

&nbsp;for(temp=0;temp&lt;SPI_RX_BUFFER_MASK;temp++)&nbsp;//计算校验和

&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;check_sum+=SPI_RxBuf[temp];

&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;if(SPI_RxBuf[SPI_RX_BUFFER_MASK]==check_sum)//校验正确

&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(SPI_RxBuf[0])

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x00://总线传输状态代码

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;SPI_RxBuf[1]==0x01)&nbsp;//受到出错代码,重发

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spi_send();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}break;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x10://功能错误代码

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCCR0B=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer[3]=0x79;&nbsp;&nbsp;&nbsp;//E

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer[2]=0x40;&nbsp;&nbsp;&nbsp;//-

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer[0]=Tab[SPI_RxBuf[1]%10];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//查字形表

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_RxBuf[1]/=10;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer[1]=Tab[SPI_RxBuf[1]%10];&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCCR0B=0x05;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//send_rx_ok();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}break;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x20://显示数据

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCCR0B=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set_disp_vol();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCCR0B=0x05;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//send_rx_ok();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}break;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x30://led灯数据

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//TCCR0B=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer2[0][0]=SPI_RxBuf[4];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer2[1][0]=SPI_RxBuf[3];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer2[2][0]=SPI_RxBuf[2];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer2[3][0]=SPI_RxBuf[1];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//TCCR0B=0x05;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//send_rx_ok();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}break;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x31://led灯数据

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//TCCR0B=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer2[0][1]=SPI_RxBuf[4];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer2[1][1]=SPI_RxBuf[3];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer2[2][1]=SPI_RxBuf[2];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer2[3][1]=SPI_RxBuf[1];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//TCCR0B=0x05;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//send_rx_ok();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}break;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x40://显示命令

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(SPI_RxBuf[1]==0x00)&nbsp;&nbsp;//关闪烁

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_blanking=0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(SPI_RxBuf[1]==0x01)&nbsp;&nbsp;//闪烁&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_blanking=1;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//send_rx_ok();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}break;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x50://显示程序号

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCCR0B=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer[3]=0x73;&nbsp;&nbsp;&nbsp;&nbsp;//P

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer[2]=0x40;&nbsp;&nbsp;&nbsp;&nbsp;//-

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer[0]=Tab[SPI_RxBuf[1]%10];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//查字形表

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_RxBuf[1]/=10;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer[1]=Tab[SPI_RxBuf[1]%10];&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCCR0B=0x05;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//send_rx_ok();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}break;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x60://显示文字

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCCR0B=0x00;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer[3]=SPI_RxBuf[4];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer[2]=SPI_RxBuf[3];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer[1]=SPI_RxBuf[2];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp_buffer[0]=SPI_RxBuf[1];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCCR0B=0x05;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//send_rx_ok();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}break;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:break;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;else&nbsp;&nbsp;&nbsp;//校验失败,发送出错代码

&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spi_bus_waiting();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_TxBuf[0]=0x00;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPI_TxBuf[1]=0x01;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spi_send();

&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;

&nbsp;spi_trans_com=0;

&nbsp;DDRB.2=0;&nbsp;&nbsp;

&nbsp;SET_SPI_BUS_MODE=1;&nbsp;&nbsp;//处理完,允许发送方发送

}





void&nbsp;main(void)

{

//&nbsp;Declare&nbsp;your&nbsp;local&nbsp;variables&nbsp;here



//&nbsp;Crystal&nbsp;Oscillator&nbsp;division&nbsp;factor:&nbsp;1

#pragma&nbsp;optsize-

CLKPR=0x80;

CLKPR=0x00;

#ifdef&nbsp;_OPTIMIZE_SIZE_

#pragma&nbsp;optsize+

#endif



//&nbsp;Input/Output&nbsp;Ports&nbsp;initialization

//&nbsp;Port&nbsp;B&nbsp;initialization

//&nbsp;Func7=In&nbsp;Func6=In&nbsp;Func5=Out&nbsp;Func4=In&nbsp;Func3=Out&nbsp;Func2=In&nbsp;Func1=Out&nbsp;Func0=Out&nbsp;

//&nbsp;State7=T&nbsp;State6=T&nbsp;State5=0&nbsp;State4=P&nbsp;State3=0&nbsp;State2=P&nbsp;State1=0&nbsp;State0=0&nbsp;

PORTB=0x14;

DDRB=0x2B;



//&nbsp;Port&nbsp;C&nbsp;initialization

//&nbsp;Func6=In&nbsp;Func5=Out&nbsp;Func4=Out&nbsp;Func3=Out&nbsp;Func2=Out&nbsp;Func1=Out&nbsp;Func0=Out&nbsp;

//&nbsp;State6=T&nbsp;State5=0&nbsp;State4=0&nbsp;State3=0&nbsp;State2=0&nbsp;State1=0&nbsp;State0=0&nbsp;

PORTC=0x00;

DDRC=0x3F;



//&nbsp;Port&nbsp;D&nbsp;initialization

//&nbsp;Func7=Out&nbsp;Func6=Out&nbsp;Func5=Out&nbsp;Func4=Out&nbsp;Func3=Out&nbsp;Func2=Out&nbsp;Func1=Out&nbsp;Func0=Out&nbsp;

//&nbsp;State7=0&nbsp;State6=0&nbsp;State5=0&nbsp;State4=0&nbsp;State3=0&nbsp;State2=0&nbsp;State1=0&nbsp;State0=0&nbsp;

PORTD=0x00;

DDRD=0xFF;



timer0_init();

timer1_init();



//&nbsp;Timer/Counter&nbsp;2&nbsp;initialization

//&nbsp;Clock&nbsp;source:&nbsp;System&nbsp;Clock

//&nbsp;Clock&nbsp;value:&nbsp;125.000&nbsp;kHz

//&nbsp;Mode:&nbsp;Normal&nbsp;top=FFh

//&nbsp;OC2A&nbsp;output:&nbsp;Disconnected

//&nbsp;OC2B&nbsp;output:&nbsp;Disconnected

ASSR=0x00;

TCCR2A=0x00;

TCCR2B=0x00;



//&nbsp;External&nbsp;Interrupt(s)&nbsp;initialization

//&nbsp;INT0:&nbsp;Off

//&nbsp;INT1:&nbsp;Off

//&nbsp;Interrupt&nbsp;on&nbsp;any&nbsp;change&nbsp;on&nbsp;pins&nbsp;PCINT0-7:&nbsp;Off

//&nbsp;Interrupt&nbsp;on&nbsp;any&nbsp;change&nbsp;on&nbsp;pins&nbsp;PCINT8-14:&nbsp;Off

//&nbsp;Interrupt&nbsp;on&nbsp;any&nbsp;change&nbsp;on&nbsp;pins&nbsp;PCINT16-23:&nbsp;Off

EICRA=0x00;

EIMSK=0x00;

PCICR=0x00;



TIMSK0=0x02;

TIMSK1=0x02;

TIMSK2=0x00;



//&nbsp;Analog&nbsp;Comparator&nbsp;initialization

//&nbsp;Analog&nbsp;Comparator:&nbsp;Off

//&nbsp;Analog&nbsp;Comparator&nbsp;Input&nbsp;Capture&nbsp;by&nbsp;Timer/Counter&nbsp;1:&nbsp;Off

ACSR=0x80;

ADCSRB=0x00;

InitSPI();



//&nbsp;Global&nbsp;enable&nbsp;interrupts

#asm("sei")

disp_buffer[0]=0xFF;

disp_buffer[1]=0xFF;

disp_buffer[2]=0xFF;

disp_buffer[3]=0xFF;

disp_buffer[4]=0xFF;

disp_buffer[5]=0xFF;

disp_buffer[6]=0xFF;

disp_buffer[7]=0xFF;

disp_buffer2[0][0]=0xFF;

disp_buffer2[1][0]=0xFF;

disp_buffer2[2][0]=0xFF;

disp_buffer2[3][0]=0xFF;

disp_buffer2[0][1]=0x00;

disp_buffer2[1][1]=0x00;

disp_buffer2[2][1]=0x00;

disp_buffer2[3][1]=0x00;

//disp_blanking=1;

while&nbsp;(1)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(spi_trans_com==1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read_rx_buffer();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(send_failure==1)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spi_send();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};

}

出0入0汤圆

发表于 2008-11-29 19:41:29 | 显示全部楼层
好帖!!!!

出0入0汤圆

发表于 2008-12-17 16:54:08 | 显示全部楼层
正在学,记号

出0入0汤圆

发表于 2008-12-18 11:35:15 | 显示全部楼层
楼主给的程序,要好好研究研究

出0入0汤圆

发表于 2008-12-18 14:13:25 | 显示全部楼层
刚学,看看

出0入0汤圆

发表于 2009-2-3 20:53:29 | 显示全部楼层
我用M16写的SPI请大家看一下,功能是:用74HC595实现串转并,数码管显示0——9



#include&lt;avr/io.h>

#include&nbsp;&lt;util/delay.h>

unsigned&nbsp;char&nbsp;date[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};

#define&nbsp;&nbsp;SS&nbsp;&nbsp;PB4

#define&nbsp;&nbsp;MOSI&nbsp;&nbsp;PB5

#define&nbsp;&nbsp;MISO&nbsp;&nbsp;PB6

#define&nbsp;&nbsp;SCK&nbsp;&nbsp;&nbsp;PB7&nbsp;

//-------------------------------------------

int&nbsp;main()

{

unsigned&nbsp;char&nbsp;i;

&nbsp;DDRB=0Xb0;

&nbsp;PORTB=0XFF;

&nbsp;SPCR=0X50;//允许SPI工作,高位在前,主机模式,工作方式0,频率选择fosc/4

&nbsp;//SPCR=0X00;//状态寄存器,中断标志和写冲突标志。

&nbsp;while(1)

&nbsp;{

&nbsp;&nbsp;for(i=0;i++;i&lt;9)

&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;PORTB|=~(_BV(SS));//开始传送

&nbsp;&nbsp;&nbsp;SPDR=date;

&nbsp;&nbsp;&nbsp;while(!(SPSR&(1&lt;&lt;SPIF)));

&nbsp;&nbsp;&nbsp;_delay_ms(1000);

&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;PORTB|=_BV(SS);//禁止传送。

&nbsp;&nbsp;}

}

嘿嘿,学习AVR时间不长,请教了。GCC编译,还在调试中,本程序。希望高手们指教。

出0入0汤圆

发表于 2009-2-6 16:20:00 | 显示全部楼层
学习了&nbsp;你们这通信都不要协议的啊

出0入0汤圆

发表于 2009-2-7 14:22:34 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-2-7 17:11:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-3-7 15:47:54 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-3-8 18:47:17 | 显示全部楼层
mark!

出0入0汤圆

发表于 2009-3-8 21:40:21 | 显示全部楼层
mark!

出0入0汤圆

发表于 2009-6-7 09:03:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-6-7 09:49:43 | 显示全部楼层
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 03:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表