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