TM1812的原控制程序

发布时间:
来源: 电子工程世界

///***************

VCC=9V,VDD

电阻=5.1K,VDD=5.5V,33M晶振,高速,“0码”高电平

120ns******************///

#include

#include

#define uchar unsigned char

#define uint

unsigned int

#define nop() _nop_()

#define Red 1

#define Green 2

#define Blue 3

#define Write 4

#define High 1

#define Low 0

sbit DIO=P1^0;

bdata uchar a;

sbit a7=a^7;

sbit LED=P2^2;

uchar show[12],color=1,temp=0xff;

void delay_ms(int z)

{

int x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

/*void write(uchar date) //低速,33M,高速时两倍

{

uchar i;

for(i=0;i<8;i++)

{

if(date&0x80)

{

DIO=1;

nop();

nop();

nop();

nop();

nop();

nop();

nop();

nop();

nop();

nop();

nop();

nop();

nop();

nop();

nop();

nop();

nop();

nop();

}

date<<=1;

}

}*/

void write(uchar date) //高速,0码500n,1码1000n (33M)

{

uchar i;

for(i=0;i<8;i++)

{

if(date&0x80)

{

DIO=1;

nop();

nop();

nop();

nop();

nop();

nop();

nop();

nop();

nop();

nop();

nop();

nop();


//最少14个nop,550NS可用,

nop();

nop();

nop();

nop();//多无限


nop();

nop();

nop();

nop();

nop();

nop();

nop();

nop();

nop();

nop();

nop();//27个nop可用.940NS

DIO=0;

}

else

{

DIO=1;//120NS

nop();

nop();

nop();

nop();


nop();

nop();

nop();

nop();

nop();

nop();//10个nop可用,420NS

//

nop();

//

nop(); //最少单单一个DIO=1;120nS,可用

//

nop(); //最多13个nop,520NS可用

//nop();//1812.0921D加这一个nop,不可用

DIO=0;

nop();

nop();

nop();

nop();

nop();

nop();

nop();

nop();

nop();

nop();

}

date<<=1;

}

}

void display()

{

uchar i,j;

for(j=0;j<3;j++)//芯片个数

for(i=0;i<12;i++)//1812就是3*4=12,1809就是3*3=9,1803、4就是3*1=3


write(show[i]);

}


void load()

{

uchar i;

for(i=0;i<4;i++)

//载入灯组数,1812则载入4组灯,1809则载入3组灯,1803、4则有1

{

if(color==Red)

{

show[i*3+0]=temp;

show[i*3+1]=0x00;

show[i*3+2]=0x00;

}

if(color==Green)

{

show[i*3+0]=0x00;

show[i*3+1]=temp;

show[i*3+2]=0x00;

}

if(color==Blue)


{

show[i*3+0]=0x00;

show[i*3+1]=0x00;

show[i*3+2]=temp;

}

if(color==Write)

{

show[i*3+0]=temp;

show[i*3+1]=temp;

show[i*3+2]=temp;

}

}

}

void show_3()

{

for(color=1;color<5;color++) //五种颜色;依次变化R、G、B、W

{

for(temp=0;temp<255;temp++)//256级灰度从'0x00'到0xff''

{

load();

//载入相应颜色和灰度

display();

delay_ms(50);

//灰度保持时间,可以控制颜色变化速度

}

for(temp=255;temp>0;temp--)//256级灰度从'0xff'到0x00''

{

load();

display();

delay_ms(50);

}

}

}

void show_1()//四组灯依次红绿蓝

{

uchar i;

for(i=0;i<2;i++)

{

write(0xff);

write(0x00);

write(0xaa);

write(0xff);

write(0x00);

write(0xaa);

write(0xff);

write(0x00);

write(0xaa);

write(0xff);

write(0xff);

write(0x00);

}

}

void main()

{

uchar i,j;

for(j=0;j<4;j++)

for(i=0;i<3;i++)

write(0xff);

delay_ms(50);

while(1)

{

show_3();

//show_1();

/*for(j=0;j<4;j++)

for(i=0;i<3;i++)

write(0xaa);*/

//delay_ms(50);

/*

nop(); nop();

nop();

nop();

nop(); nop(); nop();

nop();

nop();

nop();//300NS

nop(); nop();

nop();

nop();

nop(); nop(); nop();

nop();

nop();

nop();

//600

nop(); nop();

nop();

nop();

nop(); nop(); nop();

nop();

文章来源于: 电子工程世界 原文链接

本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。