[资料整理]TLC2543驱动
//TLC2543驱动程序
#define P_IOA_Data (volatile unsigned int *)0x7000
#define P_IOA_Buffer (volatile unsigned int *)0x7001
#define P_IOA_Dir (volatile unsigned int *)0x7002
#define P_IOA_Attrib (volatile unsigned int *)0x7003
#define P_IOA_Latch (volatile unsigned int *)0x7004
//............................................
#define P_IOB_Data (volatile unsigned int *)0x7005
#define P_IOB_Buffer (volatile unsigned int *)0x7006
#define P_IOB_Dir (volatile unsigned int *)0x7007
#define P_IOB_Attrib (volatile unsigned int *)0x7008
#define P_IO_Dir *P_IOB_Dir
#define P_IO_Att *P_IOB_Attrib
#define P_IO_Buf *P_IOB_Buffer
#define Data_Out 0x8000
#define Data_In 0x4000
#define CS 0x2001
#define IO_CLK 0x1000
#define EOC 0x0800 //没用
void delay(unsigned int N)
{
int i;
for(i=0;i<N;i++);
}
//////////////////////////////////////////////////////////////////////////////////
void TLC2543_init()
{
P_IO_Dir|=(Data_In+CS+IO_CLK);
P_IO_Dir&=(~Data_Out);
P_IO_Att|=(Data_In+CS+IO_CLK);
P_IO_Att&=(~Data_Out);
}
unsigned int read2543(unsigned char CON_WORD)//Timing for 12-Clock Transfer Not Using CS With MSB First
{
unsigned int ad=0,i;
CON_WORD<<=4; //0000 0000 1001 0000
P_IO_Buf&=(~IO_CLK); //I/O CLOCK=0
P_IO_Buf&=(~CS); //CS=0
for(i=0;i<12;i++)
{
if(P_IO_Buf&Data_Out) ad|=0x01; //读输出值,dataout的值,如果为高则为1,否则ad左移补零.共选择十二位.
if((CON_WORD&0x80)!=0) P_IO_Buf|=Data_In;//daatainput=1;
else P_IO_Buf&=(~Data_In);//datainput =0;
P_IO_Buf|=IO_CLK; //I/O CLOCK=1//送数
delay(7);
P_IO_Buf&=(~IO_CLK); //I/O CLOCK=0
delay(7);
CON_WORD<<=1;
ad<<=1;
}
P_IO_Buf|=CS; //CS=1
ad>>=1;
return(ad);
}
注:非原创,只是自己修改的,增强其可读性和可移植性