新闻  |   论坛  |   博客  |   在线研讨会
AVR笔记11:SPI实验(数码管显示)(GCC)
mayer | 2009-09-01 19:10:04    阅读:2648   发布文章

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

 

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

一、程序结构
程序结构

下载 (8.5 KB)
2009-8-11 10:26



二、仿真效果
点击看大图

下载 (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.  
  24. /*数码管0,1,2,3,4,5,6,7,8,9显示*/
  25. uchar tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
  26.  
  27. /*-----------------------------------------------------------------
  28. 函数名称: void HC595out(uchar i)
  29. 函数功能: 74HC595数据输出显示
  30. 参 数:
  31. 返 回 值: 无
  32. -----------------------------------------------------------------*/
  33. void HC595out(uchar i)
  34. {
  35. PORTB&=~(1<<4); //等待数据传输,595存储寄存器数据不变
  36. SPIMasterTransmit(i); //传输数据
  37. PORTB|=(1<<4); //595移位寄存器的数据进入数据存储寄存器,并在数码管上显示
  38. }
  39.  
  40. int main(void)
  41. {
  42. uchar i="0";
  43. port_init();
  44. PORTD=0XFF;
  45.  
  46. SPImasterInit(); //SPI初始化
  47. while(1)
  48. {
  49. i++;
  50. if(i>9)
  51. {
  52. i=0;
  53. }
  54. HC595out(tab[i]);
  55. _delay_ms(500);
  56. }
  57. }

2、spi.c

  1. #include <avr/io.h>
  2. #define uchar unsigned char
  3.  
  4. /*-----------------------------------------------------------------
  5. 函数名称: void SPImasterInit(void)
  6. 函数功能: SPI初始化为主机
  7. 参 数:
  8. 返 回 值: 无
  9. SPI控制寄存器介绍
  10. SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0
  11. SPIE:中断使能
  12. SPE :SPI使能
  13. DORD:数据次序 1为LSB首先发送,0为MSB首先发送
  14. MSTR:主从选择 1为主,0为从MSTR置位时选择主机模式,否则为从机.如果MSTR为"1",
  15. SS配置为输入,且被拉低,则MSTR 被清零,寄存器SPSR 的SPIF 置位.用户必须重新
  16. 设置MSTR 进入主机模式。
  17. CPOL: 时钟极性见ATMEGA16L(中文)P130
  18. CPHA: 时钟相位
  19. SPR1, SPR0: SPI 时钟速率选择1 与0 SPR1 和SPR0 对从机没有影响。
  20. -----------------------------------------------------------------*/
  21. void SPImasterInit(void) //SPI初始化
  22. {
  23. DDRB|=(1<<7)|(1<<5); //设置SCK,MOSI为输出,其他为输入
  24. SPCR|=(1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0);//使能SPI,主模式,Fck/128
  25. }
  26. /*-----------------------------------------------------------------
  27. 函数名称: void SPIMasterTransmit(uchar TranData)
  28. 函数功能: SPI数据传输
  29. 参 数:
  30. 返 回 值: 无
  31. -----------------------------------------------------------------*/
  32. void SPIMasterTransmit(uchar TranData)
  33. {
  34. SPDR=TranData; //数据放入SPI寄存器中
  35. while(!(SPSR&(1<<SPIF))); //等待数据传输完毕
  36. }

3、port_init.c

  1. #include <avr/io.h>
  2.  
  3. void port_init(void)
  4. {
  5. DDRA =0X00; //上拉
  6. PORTA=0XFF;
  7. DDRB =0XFF; //低四位输出低电平,使四位数码管均作显示
  8. PORTB=0XF0; //MISO输出高电平,关闭595移位寄存器的数据清零功能
  9. DDRC =0X00; //上拉
  10. PORTC=0XFF;
  11. DDRD =0X00; //上拉
  12. }

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

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客