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
- /*******************************************************************************
- Platform: AVR mega16学习板(www.iccavr.com)
- Project : 实验十一:SPI实验(数码管显示)
- Clock F : 3.6864M
- Software: WinAVR-20090313+Proteus7.4
- Author : 林夕依然
- Version : 08.12.10
- Updata : 09.02.26 模块化
- 09.05.04 增加proteus仿真模型,仿真通过
- 09.07.22 WinAVR-20090313调试通过
- comments:
- 1、以学习板4位数码管为硬件电路
- 2、练习SPI的配置和使用
- 3、学习74HC595八位移位寄存器芯片的使用
- 4、进行此实验请插上JP1的所有8个短路块,JP6(SPI_EN)短路块
- 5、参考:...mcu\ICCAVR学习板\旧版例程\M16学习板实验程序\4-LED数码管程序
- *******************************************************************************/
- #include <avr/io.h>
- #include <util/delay.h>
- #include "spi.h"
- #include "port_init.h"
- #define uchar unsigned char
-
- /*数码管0,1,2,3,4,5,6,7,8,9显示*/
- uchar tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
-
- /*-----------------------------------------------------------------
- 函数名称: void HC595out(uchar i)
- 函数功能: 74HC595数据输出显示
- 参 数:
- 返 回 值: 无
- -----------------------------------------------------------------*/
- void HC595out(uchar i)
- {
- PORTB&=~(1<<4); //等待数据传输,595存储寄存器数据不变
- SPIMasterTransmit(i); //传输数据
- PORTB|=(1<<4); //595移位寄存器的数据进入数据存储寄存器,并在数码管上显示
- }
-
- int main(void)
- {
- uchar i="0";
- port_init();
- PORTD=0XFF;
-
- SPImasterInit(); //SPI初始化
- while(1)
- {
- i++;
- if(i>9)
- {
- i=0;
- }
- HC595out(tab[i]);
- _delay_ms(500);
- }
- }
2、spi.c
- #include <avr/io.h>
- #define uchar unsigned char
-
- /*-----------------------------------------------------------------
- 函数名称: void SPImasterInit(void)
- 函数功能: SPI初始化为主机
- 参 数:
- 返 回 值: 无
- SPI控制寄存器介绍
- SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0
- SPIE:中断使能
- SPE :SPI使能
- DORD:数据次序 1为LSB首先发送,0为MSB首先发送
- MSTR:主从选择 1为主,0为从MSTR置位时选择主机模式,否则为从机.如果MSTR为"1",
- SS配置为输入,且被拉低,则MSTR 被清零,寄存器SPSR 的SPIF 置位.用户必须重新
- 设置MSTR 进入主机模式。
- CPOL: 时钟极性见ATMEGA16L(中文)P130
- CPHA: 时钟相位
- SPR1, SPR0: SPI 时钟速率选择1 与0 SPR1 和SPR0 对从机没有影响。
- -----------------------------------------------------------------*/
- 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(uchar TranData)
- {
- SPDR=TranData; //数据放入SPI寄存器中
- while(!(SPSR&(1<<SPIF))); //等待数据传输完毕
- }
3、port_init.c
- #include <avr/io.h>
-
- void port_init(void)
- {
- DDRA =0X00; //上拉
- PORTA=0XFF;
- DDRB =0XFF; //低四位输出低电平,使四位数码管均作显示
- PORTB=0XF0; //MISO输出高电平,关闭595移位寄存器的数据清零功能
- DDRC =0X00; //上拉
- PORTC=0XFF;
- DDRD =0X00; //上拉
- }
4、spi.h
- #define uchar unsigned char
- void SPImasterInit(void);
- void SPIMasterTransmit(uchar TranData);
5、port_init.h
四、完整项目文件下载
http://bbs.armavr.com/thread-913-1-2.html
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。