/*功能:使用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; } };//等待发送结束 } |