原创 AVR笔记11:SPI实验(数码管显示)(GCC)

2009-9-1 16:35 3194 5 5 分类: MCU/ 嵌入式

》》点此进入    http://bbs.armavr.com/   ARM-AVR嵌入式开发论坛


一、程序结构
attachimg.gif 程序结构


下载 (8.5 KB)

2009-8-11 10:26



二、仿真效果
attachimg.gif 点击看大图


下载 (197.14 KB)

2009-8-11 10:26



三、程序源码
1、main.c





  1. /*******************************************************************************

  2. Platform: AVR mega16学习板(www.iccavr.com)

  3. Project : 实验十一:SPI实验(数码管显示)

  4. Clock F : 3.6864M

  5. Software: WinAVR-20090313+Proteus7.4

  6. Author : 林夕依然

  7. Version : 08.12.10

  8. Updata : 09.02.26 模块化

  9. 09.05.04 增加proteus仿真模型,仿真通过

  10. 09.07.22 WinAVR-20090313调试通过

  11. comments:

  12. 1、以学习板4位数码管为硬件电路

  13. 2、练习SPI的配置和使用

  14. 3、学习74HC595八位移位寄存器芯片的使用

  15. 4、进行此实验请插上JP1的所有8个短路块,JP6(SPI_EN)短路块

  16. 5、参考:...mcu\ICCAVR学习板\旧版例程\M16学习板实验程序\4-LED数码管程序

  17. *******************************************************************************/

  18. #include <avr/io.h>

  19. #include <util/delay.h>

  20. #include "spi.h"

  21. #include "port_init.h"

  22. #define uchar unsigned char



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

  24. uchar tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};



  25. /*-----------------------------------------------------------------

  26. 函数名称: void HC595out(uchar i)

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

  28. 参 数:

  29. 返 回 值: 无

  30. -----------------------------------------------------------------*/

  31. void HC595out(uchar i)

  32. {

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

  34. SPIMasterTransmit(i); //传输数据

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

  36. }



  37. int main(void)

  38. {

  39. uchar i="0";

  40. port_init();

  41. PORTD=0XFF;



  42. SPImasterInit(); //SPI初始化

  43. while(1)

  44. {

  45. i++;

  46. if(i>9)

  47. {

  48. i=0;

  49. }

  50. HC595out(tab);

  51. _delay_ms(500);

  52. }

  53. }

2、spi.c





  1. #include <avr/io.h>

  2. #define uchar unsigned char



  3. /*-----------------------------------------------------------------

  4. 函数名称: void SPImasterInit(void)

  5. 函数功能: SPI初始化为主机

  6. 参 数:

  7. 返 回 值: 无

  8. SPI控制寄存器介绍

  9. SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0

  10. SPIE:中断使能

  11. SPE :SPI使能

  12. DORD:数据次序 1为LSB首先发送,0为MSB首先发送

  13. MSTR:主从选择 1为主,0为从MSTR置位时选择主机模式,否则为从机.如果MSTR为"1",

  14. SS配置为输入,且被拉低,则MSTR 被清零,寄存器SPSR 的SPIF 置位.用户必须重新

  15. 设置MSTR 进入主机模式。

  16. CPOL: 时钟极性见ATMEGA16L(中文)P130

  17. CPHA: 时钟相位

  18. SPR1, SPR0: SPI 时钟速率选择1 与0 SPR1 和SPR0 对从机没有影响。

  19. -----------------------------------------------------------------*/

  20. void SPImasterInit(void) //SPI初始化

  21. {

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

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

  24. }

  25. /*-----------------------------------------------------------------

  26. 函数名称: void SPIMasterTransmit(uchar TranData)

  27. 函数功能: SPI数据传输

  28. 参 数:

  29. 返 回 值: 无

  30. -----------------------------------------------------------------*/

  31. void SPIMasterTransmit(uchar TranData)

  32. {

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

  34. while(!(SPSR&(1<<SPIF))); //等待数据传输完毕

  35. }

3、port_init.c





  1. #include <avr/io.h>



  2. void port_init(void)

  3. {

  4. DDRA =0X00; //上拉

  5. PORTA=0XFF;

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

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

  8. DDRC =0X00; //上拉

  9. PORTC=0XFF;

  10. DDRD =0X00; //上拉

  11. }

4、spi.h





  1. #define uchar unsigned char

  2. void SPImasterInit(void);

  3. void SPIMasterTransmit(uchar TranData);

5、port_init.h





  1. void port_init(void);

四、完整项目文件下载


http://bbs.armavr.com/thread-913-1-2.html

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /3 下一条