[此贴子已经被作者于2008-4-19 19:22:38编辑过]
[此贴子已经被作者于2008-4-19 19:24:19编辑过]
视乎做这个的人比较少~~~ 我被这个卡了一星期了 ~~~~~郁闷坏
[此贴子已经被作者于2008-4-19 19:26:40编辑过]
/*功能:使用SPI实现对74HC595的控制操作,实现L1-L8流水灯控制.
;系统晶振6MHz,SPI波特率为5KHz
*创建时间:2008-5-15,陈波扬
********************************************************/
#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#include"Delay.h" //Delay function
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
uchar disp_tab[28]={0xFF,0,0xFF,0,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x40,0x20,
0x10,0x08,0x04,0x02,0x01,0x00,0x18,0x24,0x42,0x81,0x42,0x24, 0x18,0x00};/*显示数据*/
void SpiInit(void); //SPI初始化
void SpiTx(uchar dat); //SPI发送数据函数
void main(void) {
uchar i;
/* put your own code here */
EnableInterrupts;
DDRB_BIT0=1; //PB0输出
DDRM|=0x38; //SCK0=1,MOSI=1,SS0=1
MODRR_MODRR4=1; //使用PM口
PTM|=0x08;
SpiInit(); //SPI初始化
PTM&=0xF7; //初始化小灯,全亮
SpiTx(0);
PTM|=0x08;
// Delay_6M_s(1);
for(;;)
{
for(i=0;i<28;i++)
{
Delay_6M_ms(400); //延时400ms
PTM&=0xF7;
SpiTx(disp_tab);
Delay_6M_us(100);
PTM|=0x08;
}
} /* wait forever */
/* please make sure that you never leave this function */
}
/**********************SPI初始化************************/
void SpiInit()
{
//设置波特率,波特率=BUSCLK/Diviser;Diviser=(SPPR+1)*2^(SPR+1)
SPI0BR|=0x00; //Diviser=5*2=10,6M晶振下速率为3K
//控制寄存器,配置数据传输格式以及主从机模式
//不使能中断,数据最高位先发送,在时钟上升沿时保持不变,下降沿更新
SPI0CR1|=0x5E; //SPE=1,MSTR=1,CPOL=1,CPHA=1,SSOE=1
// SPI0CR2|=0x10; //使能模式错误
}
/**********************发射端数据*************************/
void SpiTx(uchar dat)
{
uchar k;
uchar temp;
temp=SPI0SR; //清除状态标志位
while(!SPI0SR_SPTEF)
{
k++;
Delay1_6M(0);
if(k>=100)
{
PORTB_BIT0=1; //9S12开发板上小灯亮,报警
return;
}
}//等待输出为空
k=0;
SPI0DR=dat;
while(!SPI0SR_SPIF)
{
k++;
Delay1_6M(0);
if(k>=100)
{
PORTB_BIT0=1; //9S12开发板上小灯亮,报警
return;
}
};//等待发送结束
}
你看下我发的这个程序,IO口是否定义为输出。SPI功能口的输入和输出和DDRx共同定义的
[此贴子已经被作者于2008-5-15 21:51:41编辑过]
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |