8位数码管使用的是两片74HC595级联驱动的,通过spi发送数据没有什么问题,但换到ssp,一直不能正确显示,查看了很多资料都是这么操作的,调试很久了一直不行。spi是低电平有效,下降沿采样。程序如下:
#include "config.h"
#include "LPC2103_lian.H"
uint8 const LedData[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//**********************函数定义************************
void MSpiIni(uint8 fdiv);
void ssp_Init(void);
void senddata(uint8 data);
uint8 ssp_sendbyte(uint8 data) ;
void display(uint8 day,uint8 n);
//**********************主程序**************************
int main(void)
{
p06_mosi0;
p07_gpio; //都是使用的p07作为片选
p04_sck0;
p014_gpio;
gpio_out(p07);
MSpiIni(0x40);
IO0SET=IO0SET|p07;
ssp_Init();
SPI_SPCR=(0<<2)|(0<<3)|(1<<4)|(1<<5)|(0<<6);
display(3,5);
while(1);
}
void ssp_Init()
{
p019_miso1;
p020_mosi1;
p014_sck1;
SSPCR0=(0x01<<8)|
(0x00<<7)| // 第一个时钟沿采样
(0x01<<6)| // 低电平有效
(0x00<<4)|
(0x07<<0);
SSPCR1=(0x00<<3)|
(0x00<<2)|
(0x01<<1)|
(0x00<<0);
SSPCPSR=0x52;
SSPIMSC=0x02;
SSPICR=0x03;
}
uint8 ssp_sendbyte(uint8 data) //ssp发送数据函数
{
IO0CLR=IO0CLR|p07;
SSPDR=data;
while((SSPSR&0x01)==0);
IO0SET=IO0SET|p07;
return(SSPDR);
}
void MSpiIni(uint8 fdiv)
{
if(fdiv<8)fdiv=8;
SPI_SPCCR=fdiv&0xFE;
}
void senddata(uint8 data) //spi发送数据函数
{
IO0CLR=IO0CLR|p07;
SPI_SPDR=data;
while((SPI_SPSR & 0x80) ==0);
IO0SET=IO0SET|p07;
}
void display(uint8 day,uint8 n)
{
ssp_sendbyte((1<<n)); //换做spi发送函数,就能正确显示,没问题。
ssp_sendbyte(LedData[day]);
}
现求助各位大侠,有谁使用过,帮解答下。 |