www.pudn.com > LPD6803-light.rar > LPD6803 light.C, change:2008-12-15,size:8720b


#include "reg52.h" 
#include "intrins.h" 
//                       LPD6083程序 
//软件说明: 
//软件版本: V1.0 
//制作时间: 2008-2-26 
//作者:     
//使用AT89C54 
//实现各种图形变化 
//连接示意图 
//O┈O--O--O--O--O--O--O 
//                     │ 
//O--O--O--O--O--O--O--O 
//│ 
//O--O--O--O--0--O--O--O 
//                     │ 
//O--O--O--O--O--O--O--O 
//│ 
//O--O--O--O--O--O--O--O 
//                     │ 
//O--O--O--O--O--O--O--O 
//│ 
//O--O--O--O--O--O--O--O 
//                     │ 
//O--O--O--O--O--O--O--O 
typedef unsigned char BYTE; 
//引脚定义 
sbit SDO=P1^2; //数据引脚 
sbit SCLK=P1^3;//时钟引脚 
sbit DOG=P1^7;//看门狗(MAX691) 
//数据表,每样花样一个数据表——注:因为为S形连接,所以1、3、5、7行数据不变,2、4、6、8行数据镜像对调 
 
code BYTE taba[]={ 
4,0,0,8,0,0,12,0,0,16,0,0,      20,0,0,24,0,0,28,0,0,31,0,0, 
4,4,0,8,8,0,12,12,0,16,16,0,    20,20,0,24,24,0,28,28,0,31,31,0, 
0,4,0,0,8,0,0,12,0,0,16,0,      0,20,0,0,24,0,0,28,0,0,31,0, 
0,4,4,0,8,8,0,12,12,0,16,16,    0,20,20,0,24,24,0,28,28,0,31,31, 
0,0,4,0,0,8,0,0,12,0,0,16,      0,0,20,0,0,24,0,0,28,0,0,31, 
4,0,4,8,0,8,12,0,12,16,0,16,    20,0,20,24,0,24,28,0,28,31,0,31, 
4,4,4,8,8,8,12,12,12,16,16,16,  20,20,20,24,24,24,28,28,28,31,31,31, 
 
4,0,0,8,0,0,12,0,0,16,0,0,      20,0,0,24,0,0,28,0,0,31,0,0, 
4,4,0,8,8,0,12,12,0,16,16,0,    20,20,0,24,24,0,28,28,0,31,31,0, 
0,4,0,0,8,0,0,12,0,0,16,0,      0,20,0,0,24,0,0,28,0,0,31,0, 
0,4,4,0,8,8,0,12,12,0,16,16,    0,20,20,0,24,24,0,28,28,0,31,31, 
0,0,4,0,0,8,0,0,12,0,0,16,      0,0,20,0,0,24,0,0,28,0,0,31, 
4,0,4,8,0,8,12,0,12,16,0,16,    20,0,20,24,0,24,28,0,28,31,0,31, 
4,4,4,8,8,8,12,12,12,16,16,16,  20,20,20,24,24,24,28,28,28,31,31,31, 
 
4,0,0,8,0,0,12,0,0,16,0,0,      20,0,0,24,0,0,28,0,0,31,0,0, 
4,4,0,8,8,0,12,12,0,16,16,0,    20,20,0,24,24,0,28,28,0,31,31,0, 
0,4,0,0,8,0,0,12,0,0,16,0,      0,20,0,0,24,0,0,28,0,0,31,0, 
0,4,4,0,8,8,0,12,12,0,16,16,    0,20,20,0,24,24,0,28,28,0,31,31, 
0,0,4,0,0,8,0,0,12,0,0,16,      0,0,20,0,0,24,0,0,28,0,0,31, 
4,0,4,8,0,8,12,0,12,16,0,16,    20,0,20,24,0,24,28,0,28,31,0,31, 
4,4,4,8,8,8,12,12,12,16,16,16,  20,20,20,24,24,24,28,28,28,31,31,31 
				}; 
 
 
void watchdog() 
{ 
	_nop_(); 
	DOG=0; 
	_nop_(); 
	DOG=1; 
	_nop_(); 
	DOG=0; 
} 
 
void delay(unsigned int n) //延时程序 
{ 
	BYTE t,y; 
    for(;n>0;n--) 
        for(t=0;t<10;t++) 
		{ 
		   for(y=0;y<40;y++); 
		   watchdog(); 
		} 
} 
 
void Outone(BYTE dr,BYTE dg,BYTE db)//输出3个5位RGB颜色数据子程序,参数格式:红颜色数据、 
                                    //绿颜色数据、蓝颜色数据 
{   BYTE k,mask; 
      //首先输出1个'1'起始位 
    SDO=1;SCLK=1;SCLK=0; 
      //输出5位红色数据 
    mask=0x10; 
    for(k=0;k<5;k++) 
    {    if(mask & dr)    SDO=1; 
         else             SDO=0; 
         SCLK=1;SCLK=0; 
         mask>>=1;      } 
    //输出5位绿色数据 
    mask=0x10; 
    for(k=0;k<5;k++) 
    {   if(mask & dg)   SDO=1; 
        else            SDO=0; 
        SCLK=1;SCLK=0; 
        mask>>=1;       } 
    //输出5位兰色数据 
    mask=0x10; 
    for(k=0;k<5;k++) 
    {   if(mask & db)   SDO=1; 
        else            SDO=0; 
        SCLK=1;SCLK=0; 
        mask>>=1;       } 
} 
 
void BrushOut(BYTE nDots,BYTE dr,BYTE dg,BYTE db)//输出ndots点相同灰度颜色子程序,参数格式:点数、红颜色数据、 
                                                 //绿颜色数据、蓝颜色数据 
{ 
   BYTE i; 
// SDO,SCLK为数据和移位输出口,位变量,nDots为灯的个数 
// 本程序仅适用于GMODE=1,CMODE=1的情况 
// 首先输出32个'0'的起始帧 
    SCLK=0; 
    SDO=0; 
    for(i=0;i<32;i++) { SCLK=1;SCLK=0; } 
// 再输出nDots点的数据,这里假设各点的颜色都是(dr,dg,db) 
// dr,db,dg为红绿兰的灰度值0-31 
    for(i=0;i<nDots;i++) 
    {   Outone(dr,dg,db); 
    } 
    //输出完nDots的数据后,还要补nDots个脉冲 
    SDO=0; 
    for(i=0;i<nDots;i++) { SCLK=1;SCLK=0; } 
    //传输结束 
} 
 
//任意颜色灰度转化程序,参数形式:点数、间隔时间、红开始色灰度、绿开始色灰度、蓝开始色灰度、 
//红结束色灰度、绿结束色灰度、蓝结束色灰度 
void Jianbian(BYTE nDots,BYTE ntime,BYTE hr,BYTE hg,BYTE hb,BYTE br,BYTE bg,BYTE bb) 
{   BYTE f,dr=0,dg=0,db=0,fr=0,fg=0,fb=0; 
     for(f=0;f<31;f++) 
        { 
		if (fr!=1)   //红色渐变控制 
            { 
		      if(hr<br) 
			   { 
                  if(br=hr+f) fr=1; 
                  else dr=hr+f; 
               } 
			   else 
			   	 if(hr>br) 
			   		{ 
                  		if(br>=hr-f) fr=1; 
                  		else dr=hr-f; 
			    	} 
				 else dr=hr; 
			 } 
 
		if (fg!=1)   //绿色渐变控制 
            { 
		      if(hg<bg) 
			   { 
                  if(bg=hg+f) fg=1; 
                  else dg=hg+f; 
               } 
			   else 
			   	 if(hg>bg) 
			   		{ 
                  		if(bg>=hg-f) fg=1; 
                  		else dg=hg-f; 
			    	} 
				 else dg=hg; 
			 } 
 
		if (fb!=1)   //红色渐变控制 
            { 
		      if(hb<bb) 
			   { 
                  if(bb=hb+f) fb=1; 
                  else db=hb+f; 
               } 
			   else 
			   	 if(hb>bb) 
			   		{ 
                  		if(bb>=hb-f) fb=1; 
                  		else db=hb-f; 
			    	} 
				 else db=hb; 
			 } 
 
           if(fr==1 && fg==1 && fb==1) f=30; 
           BrushOut(nDots,dr,dg,db); 
           delay(ntime); 
        } 
} 
 
void zzjb(BYTE nDots,BYTE n) 
{ 
   BYTE i; 
// SDO,SCLK为数据和移位输出口,位变量,nDots为灯的个数 
// 本程序仅适用于GMODE=1,CMODE=1的情况 
// 首先输出32个'0'的起始帧 
    SCLK=0; 
    SDO=0; 
    for(i=0;i<32;i++) { SCLK=1;SCLK=0; } 
// 再输出nDots点的数据,这里假设各点的颜色都是(dr,dg,db) 
// dr,db,dg为红绿兰的灰度值0-31 
 
    for(i=n;i<nDots;i++) 
    { 
		Outone(taba[i*3],taba[i*3+1],taba[i*3+2]); 
    } 
	if(n>0) 
	{ 
		for(i=0;i<n;i++) 
	{ 
		Outone(taba[i*3],taba[i*3+1],taba[i*3+2]); 
	} 
	} 
    //输出完nDots的数据后,还要补nDots个脉冲 
    SDO=0; 
    for(i=0;i<nDots;i++) { SCLK=1;SCLK=0; } 
    //传输结束 
} 
 
//从上到下追逐,参数形式:点数、间隔时间、红前景色灰度、绿前景色灰度、蓝前景色灰度、 
//红背色灰度、绿背景色灰度、蓝背景色灰度 
void Runagaindown(BYTE nDots,BYTE ntime,BYTE hr,BYTE hg,BYTE hb,BYTE br,BYTE bg,BYTE bb) 
{   BYTE i,j,f,e; 
    for (i=1;i<nDots+1;i++) 
	{ // 首先输出32个'0'的起始帧 
	 SCLK=0; 
         SDO=0; 
    for(f=0;f<32;f++) { SCLK=1;SCLK=0; } 
	for(j=1;j<nDots+1;j++) 
	{ 
	  if(j=i) 
	  Outone(hr,hg,hb); 
	  else Outone(br,bg,bb); 
	 } 
	  //输出完nDots的数据后,还要补nDots个脉冲 
    SDO=0; 
    for(e=0;e<nDots;e++) { SCLK=1;SCLK=0; } 
    delay(ntime); 
	} 
} 
 
//向中间追逐,参数形式:点数、间隔时间、红前景色灰度、绿前景色灰度、蓝前景色灰度、 
//红背色灰度、绿背景色灰度、蓝背景色灰度 
void Runagainin(BYTE nDots,BYTE ntime,BYTE hr,BYTE hg,BYTE hb,BYTE br,BYTE bg,BYTE bb) 
{   BYTE i,j,f,e; 
    for (i=1;i=(nDots+1)/2;i++) 
	{ 
	 SCLK=0; 
         SDO=0; 
    for(f=0;f<32;f++) { SCLK=1;SCLK=0; } 
	for(j=1;j<nDots+1;j++) 
	{ 
	  if(j=i || j>=nDots+1-i) 
	  Outone(hr,hg,hb); 
	  else Outone(br,bg,bb); 
	 } 
	  //输出完nDots的数据后,还要补nDots个脉冲 
    SDO=0; 
    for(e=0;e<nDots;e++) { SCLK=1;SCLK=0; } 
    //传输结束 
    delay(ntime); 
	} 
} 
//从下到上追逐,参数形式:点数、间隔时间、红前景色灰度、绿前景色灰度、蓝前景色灰度、 
//红背色灰度、绿背景色灰度、蓝背景色灰度 
void Runagainup(BYTE nDots,BYTE ntime,BYTE hr,BYTE hg,BYTE hb,BYTE br,BYTE bg,BYTE bb) 
{   BYTE i,j,f,e; 
    for (i=nDots;i>0;i--)//从尾到头跑 
	{ 
	 SCLK=0; 
         SDO=0; 
    for(f=0;f<32;f++) { SCLK=1;SCLK=0; } 
	for(j=1;j<nDots+1;j++) 
	{ 
	  if(j=i) 
	  Outone(hr,hg,hb); 
	  else Outone(br,bg,bb); 
	 } 
	  //输出完nDots的数据后,还要补nDots个脉冲 
    SDO=0; 
    for(e=0;e<nDots;e++) { SCLK=1;SCLK=0; } 
    delay(ntime); 
	} 
} 
 
main() 
{   BYTE nDots,Dots,i,ntimea,ntimeb,ntimec; 
    BYTE n; 
    nDots=168; 
    Dots=145; 
    ntimea=20;ntimeb=50;ntimec=6;//调节每帧数据时间参数 
    while(1) 
    { 
    for(i=0;i<2;i++) 
	{ 
		for(n=nDots;n>0;n--) 
			{ 
			    zzjb(nDots,n); 
		            delay(ntimea); 
			} 
	} 
	Jianbian(nDots,ntimeb, 0, 0, 0,    31, 0, 0); 
    	Jianbian(nDots,ntimeb,31, 0, 0,    31,31, 0); 
    	Jianbian(nDots,ntimeb,31,31, 0,     0,31, 0); 
    	Jianbian(nDots,ntimeb, 0,31, 0,     0,31,31); 
    	Jianbian(nDots,ntimeb, 0,31,31,     0, 0,31); 
    	Jianbian(nDots,ntimeb, 0, 0,31,    31, 0,31); 
    	Jianbian(nDots,ntimeb,31, 0,31,    31,31,31); 
        //七彩追逐 
    	Runagaindown(Dots,ntimec,31,0,0,  0,0,0); 
	Runagainup  (Dots,ntimec,0,31,0,  0,0,0); 
	Runagainin  (Dots,ntimec,0,0,31,  0,0,0); 
	Runagaindown(Dots,ntimec,31,0,0,  0,0,31); 
	Runagainup  (Dots,ntimec,0,31,0,  31,0,0); 
	Runagainin  (Dots,ntimec,31,31,0, 0,31,0); 
	Runagaindown(Dots,ntimec,0,31,31, 31,31,0); 
	Runagainup  (Dots,ntimec,31,0,31, 0,31,31); 
        Runagainin  (Dots,ntimec,0,0,0,   31,0,31); 
   } 
}