实验11:SPI实验(数码管显示)(GCC)
更多笔记:http://bbs.armavr.com/
一、程序结构
二、仿真效果
三、程序源码 1、main.c
1. 2. 3. /****************************************************************************** Platform: AVR mega16学习板(www.iccavr.com) Project : 实验十一:SPI实验(数码管显示) Author:linxiyiran E_mail:605987969@qq.com ※转载请注明出处
http://bbs.armavr.com/ ARM-AVR嵌入式开发论坛
4. 5. 6. 7. 8. 9.
Clock F : 3.6864M
Software: WinAVR-20090313+Proteus7.4 Author : 林夕依然 Version : 08.12.10 Updata : 09.02.26 模块化
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 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. } Author:linxiyiran E_mail:605987969@qq.com ※转载请注明出处 http://bbs.armavr.com/ ARM-AVR嵌入式开发论坛 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. 2. 3. 4. 5. 6. 7. 8. 9. #include #define uchar unsigned char /*----------------------------------------------------------------- 函数名称: void SPImasterInit(void) 函数功能: SPI初始化为主机 参 数: 返 回 值: 无 SPI控制寄存器介绍 10. SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0 11. SPIE:中断使能 12. SPE :SPI使能 13. DORD:数据次序 1为LSB首先发送,0为MSB首先发送 Author:linxiyiran E_mail:605987969@qq.com ※转载请注明出处 http://bbs.armavr.com/ ARM-AVR嵌入式开发论坛 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< 31. -----------------------------------------------------------------*/ 32. void SPIMasterTransmit(uchar TranData) 33. { 34. SPDR=TranData; //数据放入SPI寄存器中 35. while(!(SPSR&(1< 1. 2. 3. 4. 5. 6. 7. 8. 9. #include void port_init(void) { DDRA =0X00; //上拉 PORTA=0XFF; DDRB =0XFF; //低四位输出低电平,使四位数码管均作显示 PORTB=0XF0; //MISO输出高电平,关闭595移位寄存器的数据清零功能 DDRC =0X00; //上拉 Author:linxiyiran E_mail:605987969@qq.com ※转载请注明出处 http://bbs.armavr.com/ ARM-AVR嵌入式开发论坛 10. PORTC=0XFF; 11. DDRD =0X00; //上拉 12. } 4、spi.h 1. 2. 3. #define uchar unsigned char void SPImasterInit(void); void SPIMasterTransmit(uchar TranData); 5、port_init.h 1. void port_init(void); 四、完整项目文件下载 http://bbs.armavr.com/thread-913-1-1.html Author:linxiyiran E_mail:605987969@qq.com ※转载请注明出处 因篇幅问题不能全部显示,请点此查看更多更全内容