void RGB_Buffer_Allot()
{
static u8 xdata Blue_PWM,Red_PWM,Green_PWM,CHANGE_Mode=0,Status_Mode_old;
static u16 i=0,count=0;
if(Status_Mode!=Status_Mode_old) //如果模式改变,i=1;
{
Status_Mode_old=Status_Mode; //刷新记忆
i=0;
CHANGE_Mode=0;
}
switch(Status_Mode)
{
case POINT://数点模式,每次进来只修改1个字节,i++最多修改Pixel_Num次
i++;
i=i%Pixel_Num; //限制最大,防止数组指针溢出
if(i!=Rotary_Read_Data_Rotary) //如果不是数点位置
{
DMX512_Write_Buffer[i]=0; //写0灯不亮
}
else //否则,数点位置亮灯
{
DMX512_Write_Buffer[Rotary_Read_Data_Rotary]=255;
}
break;
case RED://全红模式,每次进来只修改3个字节,i+=3最多修改Pixel_Num/3次
i=i%Pixel_Num;
DMX512_Write_Buffer[i+1]=255; //红灯亮
DMX512_Write_Buffer[i+2]=0;
DMX512_Write_Buffer[i+3]=0;
i+=3;
break;
case GREEN://全绿模式,每次进来只修改3个字节,i+=3最多修改Pixel_Num/3次
i=i%Pixel_Num;
DMX512_Write_Buffer[i+1]=0;
DMX512_Write_Buffer[i+2]=255; //绿灯亮
DMX512_Write_Buffer[i+3]=0;
i+=3;
break;
case BLUE://全蓝模式,每次进来只修改3个字节,i+=3最多修改Pixel_Num/3次
i=i%Pixel_Num;
DMX512_Write_Buffer[i+1]=0;
DMX512_Write_Buffer[i+2]=0;
DMX512_Write_Buffer[i+3]=255; //蓝灯亮
i+=3;
break;
case ALL://全亮模式,每次进来只修改3个字节,i+=3最多修改Pixel_Num/3次
i=i%Pixel_Num;
DMX512_Write_Buffer[i+1]=255; //红灯亮
DMX512_Write_Buffer[i+2]=255; //绿灯亮
DMX512_Write_Buffer[i+3]=255; //蓝灯亮
i+=3;
break;
case CHANGE://自动变色模式,i同上,每次进来只修改3个字节
if(count>200) //count是速度控制。
{
count=0;
switch(CHANGE_Mode)
{
case 0: Red_PWM++; //红灯渐渐亮起
Green_PWM=0;
Blue_PWM=0;
if(Red_PWM==255)
{
CHANGE_Mode=1; //红灯最亮了,进入1
}
break;
case 1: Red_PWM--; //红灯渐渐灭掉
Green_PWM=0;
Blue_PWM=0;
if(Red_PWM==0)
{
CHANGE_Mode=2; //红灯黑了,进入2
}
break;
case 2: Red_PWM=0;
Green_PWM++; //绿灯渐渐亮起
Blue_PWM=0;
if(Green_PWM==255)
{
CHANGE_Mode=3; //绿灯最亮了,进入3
}
break;
case 3: Red_PWM=0;
Green_PWM--; //绿灯渐渐灭掉
Blue_PWM=0;
if(Green_PWM==0)
{
CHANGE_Mode=4; //绿灯黑了,进入4
}
break;
case 4: Red_PWM=0;
Green_PWM=0;
Blue_PWM++; //蓝灯渐渐亮起
if(Blue_PWM==255)
{
CHANGE_Mode=5; //蓝灯最亮了,进入5
}
break;
case 5: Red_PWM=0;
Green_PWM=0;
Blue_PWM--; //蓝灯渐渐灭掉
if(Blue_PWM==0)
{
CHANGE_Mode=0; //蓝灯黑了,返回到0
}
break;
}
}
count++;
i=i%Pixel_Num;
DMX512_Write_Buffer[i+1]=Red_PWM;
DMX512_Write_Buffer[i+2]=Green_PWM;
DMX512_Write_Buffer[i+3]=Blue_PWM;
i+=3;
break;
case Status_Mode_MAX://状态机的最大值,返回红灯全亮模式
Status_Mode=RED;
break;
}
} |