我拿的是ZLG的LPC2138的板子,测试的时候基本是用它自带的程序,但是每次试验都不成功。我怀疑自带的程序有问题,因为我已经找出一个错误了。蜂鸣器本来是低电平驱动的,它变成了高电平驱动。郁闷~我现在把它的SPI通过74LS595驱动数码管的程序发上来:<br />它的原理图如下:<br /><br /><br />/********************************************************************************************************<br />** 函数名称:DelayNS()<br />** 函数功能:长软件延时<br />** 入口参数:dly 延时参数,值越大,延时越久<br />** 出口参数:无<br />********************************************************************************************************/<br />void DelayNS(uint32 dly)<br />{ <br /> uint32 i;<br /><br /> for(; dly>0; dly--) <br /> for(i=0; i<50000; i++);<br />}<br /><br />void disp(uint8 num)<br />{uint8 i,outdata;<br /> for(i=0;i<8;i++)<br /> {outdata=num&0x80;<br /> num=num<<1;<br /> if(outdata==0x80)<br /> {IOSET |= (1 << 29);//p0_1=1;<br /> IOSET |= (1 << 4);//p0_0=1;<br /> DelayNS(100);<br /> IOCLR |= (1 << 4);//p0_0=0;<br /> }<br /> else <br /> {IOCLR |= (1 << 29);//p0_1=0;<br /> IOSET |= (1 << 4);//p0_0=1;<br /> DelayNS(100);<br /> IOCLR |= (1 << 4);//p0_0=0;<br /> }<br /> }<br />}<br /><br /><br /><br /><br />/********************************************************************************************************<br />** 函数名称:MSPI_Init()<br />** 函数功能:初始化SPI接口,设置为主机。<br />** 入口参数:无<br />** 出口参数:无<br />*********************************************************************************************************/<br />/*void MSPI_Init(void)<br />{ <br /> //PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00005500; // 设置管脚连接SPI<br /> PINSEL0 = (PINSEL0 & (~(0xFF << 8))) | (0x55 << 8) ;<br /> SPCCR = 0x52; // 设置SPI时钟分频<br /> SPCR = (0 << 3) | // CPHA = 0, 数据在SCK 的第一个时钟沿采样<br /> (1 << 4) | // CPOL = 1, SCK 为低有效<br /> (1 << 5) | // MSTR = 1, SPI 处于主模式<br /> (0 << 6) | // LSBF = 0, SPI 数据传输MSB (位7)在先<br /> (0 << 7); // SPIE = 0, SPI 中断被禁止<br />}*/<br /><br />/********************************************************************************************************<br />** 函数名称:MSPI_SendData()<br />** 函数功能:向SPI总线发送数据。<br />** 入口参数:data 待发送的数据<br />** 出口参数:返回值为读取的数据<br />********************************************************************************************************/<br />/*uint8 MSPI_SendData(uint8 data)<br />{ int i;<br /> PINSEL0 |= (1 << 10);<br /> for (i=0;i<8;i++)<br /> {<br /> // IOCLR = HC595_CS; // 片选74HC595<br /> IOCLR = HC595_CS; // 片选74HC595<br /> SPDR = data;<br /> while( 0 == (SPSR & 0x80)); // 等待SPIF置位,即等待数据发送完毕<br /> <br /> // IOSET = HC595_CS;<br /> IOSET = HC595_CS;<br /> }<br /> PINSEL0 |= (1 << 10);<br /> return(SPDR);<br /> <br />}*/<br /><br /><br />/* 此表为LED0~F以及L、P的字模 */<br />uint8 const DISP_TAB[19] = {<br />// 0 1 2 3 4 5 6 7 8 9 <br /> 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,<br />// A b C d E F<br /> 0x88, 0x83, 0xC6, 0xA1,0x86, 0x8E,<br />// L P C<br /> 0xC7, 0x8C,0xC6 };<br /><br />/* 此表为LPC2131字模 */<br />// L P C 2 1 3 1<br />uint8 const LPC2131[7] = { 0xC7, 0x8C, 0xC6, 0xA4, 0xF9, 0xB0, 0xF9};<br />/********************************************************************************************************<br />** 函数名称:main()<br />** 函数功能:使用硬件SPI,74HC595驱动控制7段数码管显示。 <br />** 先显示0~F的字模,然后显示LPC2131字样。<br />********************************************************************************************************/<br /> uint8 rcv_data; <br />int main (void)<br />{ <br /> uint8 i; <br /> <br /> PINSEL0 = 0x00005500; // 设置SPI管脚连接<br /> PINSEL1 = 0x00000000;<br /> IODIR = HC595_CS;<br /> <br /> // MSPI_Init(); // 初始化SPI接口<br /> while(1) <br /> { <br /> /* 显示0~F字模 */<br /> for(i=0; i<16; i++)<br /> {<br /> disp( DISP_TAB); // 发送显示数据<br /> DelayNS(80); // 延时<br /> }<br /> /* 显示LPC2131字样 */<br /> for(i=0; i<16; i++)<br /> {<br /> disp( DISP_TAB); // 发送显示数据<br /> DelayNS(80); // 延时<br /> }<br /><br /> }<br /> <br /> return 0;<br />}<br /><br />不知道哪里有问题,我看原理图觉得它的管脚都接错了。呵呵。 |
|