先看下时序图。初始状态CLK,SDI,LE状态为L。OE状态为H。可以知道先是CLK和SDI动作将16位数据发送出去。然后将LE引脚H->L。最后OE信号拉低(OE信号为输出使能信号。我这里已经将OE信号短接接入GND了,所以输出是一直使能的,代码里就无需控制OE信号了),对应的OUT引脚就有输出了。
详细代码
/*往5020里面写人一个bit数据*/
void TC5020_bit(u8 dat)
{
if(dat == 0)
{
SDI = 0;
}
else
{
SDI = 1;
}
LSCL = 0;
_nop_();_nop_();
LSCL = 1;
_nop_();_nop_();
LSCL = 0;
}
/*写入芯片中16 output 的管脚的数据(适用于只有一颗TC5020的情况)*/
void TC5020_Write(u16 num)
{
u8 i;
u16 dat=0;
LSCL = 0; /*SCL信号复位*/
LE = 0; /*LE信号复位*/
for(i=0; i<16; i++)
{
dat = num&0x8000; /*高位优先传输*/
if(dat == 0)
{
TC5020_bit(0);
}
else
{
TC5020_bit(1);
}
num = num<<1;
}
_nop_();_nop_();
LE = 1;
_nop_();_nop_();
LE = 0;
}
至此就可以驱动一个TC5020了。
如果你是有多颗TC5020级联的情况。比如下面这种:
并且观察SDI的时序波形可以看到,优先传输的是D0控制。
/*num:需要显示的数组,比如你100个灯,数组长度就是100*/
/*len:需要显示的长度*/
void TC5020_OUT(u8* num,u8 len)
{
u8 i;
u16 dat=0;
LSCL = 0;
LE = 0;
_nop_();_nop_();
for(i=len - 1; i >= 0; i--) /*这个地方根据自己实际显示情况,选择递增或是递减。*/
{
if(num[i] == 0)
{
TC5020_bit(0);
}
else
{
TC5020_bit(1);
}
}
_nop_();_nop_();
LE = 1;
_nop_();_nop_();
LE = 0;
}