//STC8G1K08A 22.1184MHz
#include <reg52.h>
#include <intrins.h>
#define LCH 3
#define RCH 2
#define LedNum 144


sfr AUXR = 0x8E;
sfr P5 =0xc8;
sfr P0M0 = 0x94;
sfr P0M1 = 0x93;
sfr P1M0 = 0x92;
sfr P1M1 = 0x91;
sfr P2M0 = 0x96;
sfr P2M1 = 0x95;
sfr P3M0 = 0xB2;
sfr P3M1 = 0xB1;
sfr P4M0 = 0xB4;
sfr P4M1 = 0xB3;
sfr P5M0 = 0xCA;
sfr P5M1 = 0xC9;

sfr ADC_CTRL = 0xBC;
sfr ADC_RESH = 0xBD;
sfr ADC_RESL = 0xBE;
sfr ADC_CFG = 0xDE;
sfr P_SW2 = 0xBA;

sfr IAP_DATA  = 0xc2;
sfr IAP_CMD   = 0xc5;
sfr IAP_CONTR = 0xc7;
sfr IAP_TRIG  = 0xc6;
sfr IAP_ADDRH = 0xc3;
sfr IAP_ADDRL = 0xc4;
sfr IAP_TPS   = 0xf5;

sbit EADC=IE^5;
sbit ModeSwitch = P3^0;
#define ADCTIM (*(unsigned char volatile xdata *)0xFEA8)
#define P5PU   (*(unsigned char volatile xdata *)0xFE15)
#define P5SR   (*(unsigned char volatile xdata *)0xFE25)
#define P5DR   (*(unsigned char volatile xdata *)0xFE2D)

sbit LCHLED=P5^4;
sbit RCHLED=P5^5;
code unsigned char RedArry[240]={0x89,0x93,0x9D,0xA7,0xB1,0xBA,0xC3,0xCB,0xD3,0xDA,0xE1,0xE7,0xED,0xF2,0xF6,0xF9,0xFC,0xFD,0xFE,0xFE,0xFE,0xFC,0xFA,0xF7,0xF3,0xEE,0xE9,0xE3,0xDC,0xD5,0xCD,0xC5,0xBC,0xB3,0xAA,0xA0,0x96,0x8C,0x82,0x78,0x6D,0x63,0x5A,0x50,0x47,0x3E,0x35,0x2D,0x25,0x1F,0x18,0x12,0x0D,0x09,0x06,0x03,0x01,0x00,0x00,0x00,0x01,0x03,0x06,0x0A,0x0E,0x13,0x19,0x20,0x27,0x2F,0x37,0x3F,0x48,0x52,0x5B,0x65,0x6F,0x79,0x84,0x8E,0x98,0xA2,0xAC,0xB5,0xBE,0xC7,0xCF,0xD7,0xDE,0xE4,0xEA,0xEF,0xF4,0xF7,0xFA,0xFD,0xFE,0xFE,0xFE,0xFD,0xFB,0xF9,0xF5,0xF1,0xEC,0xE6,0xE0,0xD9,0xD2,0xCA,0xC1,0xB8,0xAF,0xA5,0x9B,0x91,0x87,0x7D,0x73,0x69,0x5F,0x55,0x4C,0x42,0x3A,0x31,0x29,0x22,0x1C,0x15,0x10,0x0B,0x07,0x04,0x02,0x00,0x00,0x00,0x00,0x02,0x05,0x08,0x0C,0x11,0x16,0x1C,0x23,0x2A,0x32,0x3B,0x43,0x4D,0x56,0x60,0x6A,0x74,0x7E,0x88,0x93,0x9D,0xA6,0xB0,0xB9,0xC2,0xCA,0xD2,0xDA,0xE1,0xE7,0xED,0xF1,0xF6,0xF9,0xFC,0xFD,0xFE,0xFE,0xFE,0xFC,0xFA,0xF7,0xF3,0xEF,0xE9,0xE4,0xDD,0xD6,0xCE,0xC6,0xBD,0xB4,0xAA,0xA1,0x97,0x8D,0x83,0x78,0x6E,0x64,0x5A,0x51,0x47,0x3E,0x36,0x2E,0x26,0x1F,0x19,0x13,0x0E,0x0A,0x06,0x03,0x01,0x00,0x00,0x00,0x01,0x03,0x06,0x0A,0x0E,0x13,0x19,0x1F,0x26,0x2E,0x36,0x3F,0x48,0x51,0x5B,0x64,0x6F,0x79,0x83,0x8D,0x97,0xA1,0xAB};
code unsigned char GreenArry[240]={0xEE,0xE9,0xE3,0xDC,0xD5,0xCD,0xC5,0xBC,0xB3,0xAA,0xA0,0x96,0x8C,0x82,0x78,0x6D,0x63,0x5A,0x50,0x47,0x3E,0x35,0x2D,0x25,0x1F,0x18,0x12,0x0D,0x09,0x06,0x03,0x01,0x00,0x00,0x00,0x01,0x03,0x06,0x0A,0x0E,0x13,0x19,0x20,0x27,0x2F,0x37,0x3F,0x48,0x52,0x5B,0x65,0x6F,0x79,0x84,0x8E,0x98,0xA2,0xAC,0xB5,0xBE,0xC7,0xCF,0xD7,0xDE,0xE4,0xEA,0xEF,0xF4,0xF7,0xFA,0xFD,0xFE,0xFE,0xFE,0xFD,0xFB,0xF9,0xF5,0xF1,0xEC,0xE6,0xE0,0xD9,0xD2,0xCA,0xC1,0xB8,0xAF,0xA5,0x9B,0x91,0x87,0x7D,0x73,0x69,0x5F,0x55,0x4C,0x42,0x3A,0x31,0x29,0x22,0x1C,0x15,0x10,0x0B,0x07,0x04,0x02,0x00,0x00,0x00,0x00,0x02,0x05,0x08,0x0C,0x11,0x16,0x1C,0x23,0x2A,0x32,0x3B,0x43,0x4D,0x56,0x60,0x6A,0x74,0x7E,0x88,0x93,0x9D,0xA6,0xB0,0xB9,0xC2,0xCA,0xD2,0xDA,0xE1,0xE7,0xED,0xF1,0xF6,0xF9,0xFC,0xFD,0xFE,0xFE,0xFE,0xFC,0xFA,0xF7,0xF3,0xEF,0xE9,0xE4,0xDD,0xD6,0xCE,0xC6,0xBD,0xB4,0xAA,0xA1,0x97,0x8D,0x83,0x78,0x6E,0x64,0x5A,0x51,0x47,0x3E,0x36,0x2E,0x26,0x1F,0x19,0x13,0x0E,0x0A,0x06,0x03,0x01,0x00,0x00,0x00,0x01,0x03,0x06,0x0A,0x0E,0x13,0x19,0x1F,0x26,0x2E,0x36,0x3F,0x48,0x51,0x5B,0x64,0x6F,0x79,0x83,0x8D,0x97,0xA1,0xAB,0xB4,0xBD,0xC6,0xCE,0xD6,0xDD,0xE4,0xEA,0xEF,0xF3,0xF7,0xFA,0xFC,0xFE,0xFE,0xFE,0xFD,0xFB,0xF9,0xF5,0xF1,0xEC,0xE7,0xE1,0xDA};
code unsigned char BlueArry[240]={0x18,0x12,0x0D,0x09,0x06,0x03,0x01,0x00,0x00,0x00,0x01,0x03,0x06,0x0A,0x0E,0x13,0x19,0x20,0x27,0x2F,0x37,0x3F,0x48,0x52,0x5B,0x65,0x6F,0x79,0x84,0x8E,0x98,0xA2,0xAC,0xB5,0xBE,0xC7,0xCF,0xD7,0xDE,0xE4,0xEA,0xEF,0xF4,0xF7,0xFA,0xFD,0xFE,0xFE,0xFE,0xFD,0xFB,0xF9,0xF5,0xF1,0xEC,0xE6,0xE0,0xD9,0xD2,0xCA,0xC1,0xB8,0xAF,0xA5,0x9B,0x91,0x87,0x7D,0x73,0x69,0x5F,0x55,0x4C,0x42,0x3A,0x31,0x29,0x22,0x1C,0x15,0x10,0x0B,0x07,0x04,0x02,0x00,0x00,0x00,0x00,0x02,0x05,0x08,0x0C,0x11,0x16,0x1C,0x23,0x2A,0x32,0x3B,0x43,0x4D,0x56,0x60,0x6A,0x74,0x7E,0x88,0x93,0x9D,0xA6,0xB0,0xB9,0xC2,0xCA,0xD2,0xDA,0xE1,0xE7,0xED,0xF1,0xF6,0xF9,0xFC,0xFD,0xFE,0xFE,0xFE,0xFC,0xFA,0xF7,0xF3,0xEF,0xE9,0xE4,0xDD,0xD6,0xCE,0xC6,0xBD,0xB4,0xAA,0xA1,0x97,0x8D,0x83,0x78,0x6E,0x64,0x5A,0x51,0x47,0x3E,0x36,0x2E,0x26,0x1F,0x19,0x13,0x0E,0x0A,0x06,0x03,0x01,0x00,0x00,0x00,0x01,0x03,0x06,0x0A,0x0E,0x13,0x19,0x1F,0x26,0x2E,0x36,0x3F,0x48,0x51,0x5B,0x64,0x6F,0x79,0x83,0x8D,0x97,0xA1,0xAB,0xB4,0xBD,0xC6,0xCE,0xD6,0xDD,0xE4,0xEA,0xEF,0xF3,0xF7,0xFA,0xFC,0xFE,0xFE,0xFE,0xFD,0xFB,0xF9,0xF5,0xF1,0xEC,0xE7,0xE1,0xDA,0xD2,0xCA,0xC2,0xB9,0xB0,0xA6,0x9C,0x92,0x88,0x7E,0x74,0x6A,0x60,0x56,0x4C,0x43,0x3A,0x32,0x2A,0x23,0x1C,0x16,0x10,0x0C,0x08};
bit LRTOGL,TimeTick;
bit LedSetFlag,ModeNeedSave;
unsigned char Ldb,Rdb,Peakcnt,Mincnt;
unsigned char Ldisp,Rdisp,Ldbon,Rdbon;
unsigned char ColorShift,mode,ModeSet;
unsigned char LdbPeak,RdbPeak,Ldbmin,Rdbmin;
unsigned int ADCVAL,Lmax,Rmax,Lmin,Rmin,Lamp,Ramp;
unsigned int cnt;
void IapIdle()
{
IAP_CONTR=0;
IAP_CMD=0;
IAP_TRIG=0;
IAP_ADDRH=0X80;
IAP_ADDRL=0;
}

unsigned char IapRead(unsigned int addr)
{
unsigned char dat;
IAP_CONTR=0X80;
IAP_TPS=24;
IAP_CMD=1;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_TRIG=0X5A;
IAP_TRIG=0XA5;
_nop_();
dat=IAP_DATA;
IapIdle();
return dat;
}

void IapProgram(unsigned int addr,unsigned char dat)
{
IAP_CONTR=0X80;
IAP_TPS=24;
IAP_CMD=2;
IAP_ADDRL=addr;
IAP_ADDRH=addr>>8;
IAP_DATA=dat;
IAP_TRIG=0X5A;
IAP_TRIG=0XA5;
_nop_();
IapIdle();
}
void IapErase(unsigned int addr)
{
	IAP_CONTR=0X80;
	IAP_TPS=24;
	IAP_CMD=3;
	IAP_ADDRL=addr;
	IAP_ADDRH=addr>>8;
	IAP_TRIG=0X5A;
	IAP_TRIG=0XA5;
	_nop_();
	IapIdle();
}

void ADC_init()
{
	P_SW2 |= 0X80;
//	ADCTIM=0X80+0X60+0X1F;//ADCTIM B7 CSSETUP B6B5 CSHOLD B4-B0 SMPDUTY
	ADCTIM=0X2A;//ADCTIM B7 CSSETUP B6B5 CSHOLD B4-B0 SMPDUTY
	P5PU=0XFF;
	P5SR=0X00;
	P5DR=0X00;
	P_SW2 &=0X7F;
//	ADC_CFG=0X2F;//ADCCFG  B5 RESFMT  B3-B0 SPEED
	ADC_CFG=0X21;//ADCCFG  B5 RESFMT  B3-B0 SPEED
	ADC_CTRL=0XC0;
	EADC=1;
//	PADC=1;
}
void IO_init()
{
//XX XX P5.5 P5.4 XX XX XX XX
//      强推 强推
//0  0  1    1    0    0    0    0 P5M0=0X30
//0  0  0    0    0    0    0    0 P5M1=0X00

//XX XX XX XX 33   32   31   30
//            高阻 高阻 标准 标准
//0  0  0  0  0    0    0    0 P3M0=0X00
//0  0  0  0  1    1    0    0 P3M1=0X0c
	P5M0=0Xff;
	P5M1=0X00;
	P3M0=0X00;
	P3M1=0X0C;
}
//void Timer1Init(void)		//10毫秒@22.1184MHz
//{
//	AUXR &= 0xBF;		//定时器时钟12T模式
//	TMOD &= 0x0F;		//设置定时器模式
//	TL1 = 0x00;		//设置定时初始值
//	TH1 = 0xB8;		//设置定时初始值
//	TF1 = 0;		//清除TF1标志
//	TR1 = 1;		//定时器1开始计时
//	ET1=1;
//}
//void Timer1Init(void)		//5毫秒@22.1184MHz
//{
//	AUXR &= 0xBF;		//定时器时钟12T模式
//	TMOD &= 0x0F;		//设置定时器模式
//	TL1 = 0x00;		//设置定时初始值
//	TH1 = 0xDC;		//设置定时初始值
//	TF1 = 0;		//清除TF1标志
//	TR1 = 1;		//定时器1开始计时
//	ET1=1;
//}
void Timer1Init(void)		//7500微秒@22.1184MHz
{
	AUXR &= 0xBF;		//定时器时钟12T模式
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0x00;		//设置定时初始值
	TH1 = 0xCA;		//设置定时初始值
	TF1 = 0;		//清除TF1标志
	TR1 = 1;		//定时器1开始计时
	ET1=1;
}
	
void nop(void)
{
}
void sendLbyte(unsigned char byte)
{
	unsigned char i;
	i=8;
	EA=0;
		do
		{
			LCHLED=1;nop();
			LCHLED=byte&0x80;nop();
			LCHLED=0;nop();
			byte=(byte<<1);		 //左移位
		}while(--i);
	EA=1;
}
void sendRbyte(unsigned char byte)
{
	unsigned char i;
	i=8;
	EA=0;
		do
		{
			RCHLED=1;nop();
			RCHLED=byte&0x80;nop();
			RCHLED=0;nop();
			byte=(byte<<1);		 //左移位
		}while(--i);
	EA=1;
}
void SetRchLed(unsigned char i)
{
	sendRbyte(GreenArry[i+ColorShift]/16);
	sendRbyte(RedArry[i+ColorShift]/16);
	sendRbyte(BlueArry[i+ColorShift]/16);
}
void SetLchLed(unsigned char i)
{
	sendLbyte(GreenArry[i+ColorShift]/16);
	sendLbyte(RedArry[i+ColorShift]/16);
	sendLbyte(BlueArry[i+ColorShift]/16);
}
void ClrRchLed(void)
{
	sendRbyte(0);
	sendRbyte(0);
	sendRbyte(0);
}
void ClrLchLed(void)
{
	sendLbyte(0);
	sendLbyte(0);
	sendLbyte(0);
}
unsigned char samp2Lednum(unsigned int amp)
{
	return amp/(1023/LedNum);
}
void SetLedR(unsigned char RchLednum)
{
	unsigned char i;
	for(i=0;i<RchLednum;i++)
			{
				SetRchLed(i);
			}
			for(;i<LedNum;i++)
			{
				if(i==RdbPeak)
				{
				SetRchLed(i);
				}
				else
				{
				ClrRchLed();
				}
			}
}
void SetLedL(unsigned char LchLednum)
{
	unsigned char i;
			for(i=0;i<LchLednum;i++)
			{
				SetLchLed(i);
			}
			for(;i<LedNum;i++)
			{
				if(i==LdbPeak)
				{
				SetLchLed(i);
				}
				else
				{
				ClrLchLed();
				}
			}
}
void SetLedR1(unsigned char RchLednum)
{
	unsigned char i;
			for(i=0;i<LedNum;i++)
			{
				if((i>(LedNum-RchLednum)) || (i == LedNum-RdbPeak))
				{
					SetRchLed(i);
				}
				else
				{
					ClrRchLed();
				}
			}
}
void SetLedL1(unsigned char LchLednum)
{
	unsigned char i;
			for(i=0;i<LedNum;i++)
			{
				if((i>(LedNum-LchLednum)) || (i == LedNum-LdbPeak))
				{
					SetLchLed(i);
				}
				else
				{
					ClrLchLed();
				}
			}
}
void Delay200us()		//@24.000MHz
{
	unsigned char i, j;

	i = 7;
	j = 57;
	do
	{
		while (--j);
	} while (--i);
}
void LeftMode(void)
{
	if(Ldbon!=Ldisp)
		{
			SetLedL(Ldisp);
			LedSetFlag=1;
		}
		Ldbon=Ldisp;
		
		if(Rdbon!=Rdisp)
		{
			SetLedR(Rdisp);
			LedSetFlag=1;
		}
		Rdbon=Rdisp;
}
void RightMode(void)
{
	if(Ldbon!=Ldisp)
		{
			SetLedL1(Ldisp);
			LedSetFlag=1;
		}
		Ldbon=Ldisp;
		
		if(Rdbon!=Rdisp)
		{
			SetLedR1(Rdisp);
			LedSetFlag=1;
		}
		Rdbon=Rdisp;
}
void MidMode(void)
{
	unsigned char i;
	unsigned char Lmd2Start,Lmd2Stop,Lmd2PekStart,Lmd2PekStop;
	unsigned char Rmd2Start,Rmd2Stop,Rmd2PekStart,Rmd2PekStop;
	if(Ldbon!=Ldisp)
	{
		Lmd2Start=(LedNum/2-1)-(Ldisp>>1);
		Lmd2Stop=(LedNum/2-1)+(Ldisp>>1);
		Lmd2PekStart=(LedNum/2-1)-(LdbPeak>>1);
		Lmd2PekStop=(LedNum/2-1)+(LdbPeak>>1);
		
		for(i=0;i<LedNum;i++)
		{
			if((i>=Lmd2Start && i<=Lmd2Stop) || i==Lmd2PekStart || i==Lmd2PekStop)
			{
				SetLchLed(i);
			}
			else
			{
				ClrLchLed();
			}
		}
		LedSetFlag=1;
	}
	Ldbon=Ldisp;

	if(Rdbon!=Rdisp)
	{
		Rmd2Start=(LedNum/2-1)-(Rdisp>>1);
		Rmd2Stop=(LedNum/2-1)+(Rdisp>>1);
		Rmd2PekStart=(LedNum/2-1)-(RdbPeak>>1);
		Rmd2PekStop=(LedNum/2-1)+(RdbPeak>>1);
		
		for(i=0;i<LedNum;i++)
		{
			if((i>=Rmd2Start && i<=Rmd2Stop) || i==Rmd2PekStart || i==Rmd2PekStop)
			{
				SetRchLed(i);
			}
			else
			{
				ClrRchLed();
			}
		}
		LedSetFlag=1;
	}
	Rdbon=Rdisp;
}

void IdleMode(void)
{
	unsigned char i;
	if(TimeTick)
	{
		TimeTick=0;
		for(i=0;i<LedNum;i++)
		{
			SetRchLed(i);			
			SetLchLed(i);
		}
		Delay200us();
		Delay200us();
		Delay200us();
	}
}
void SideMode(void)
{
	unsigned char i;
	unsigned char Lmd2Start,Lmd2PekStart;
	unsigned char Rmd2Start,Rmd2PekStart;
	if(Ldbon!=Ldisp)
	{
		Lmd2Start=Ldisp>>1;
		Lmd2PekStart=LdbPeak>>1;
		
		for(i=0;i<LedNum;i++)
		{
			if((i<=Lmd2Start) || (i>=LedNum-Lmd2Start) || i==Lmd2PekStart || i==LedNum-Lmd2PekStart)
			{
				SetLchLed(i);
			}
			else
			{
				ClrLchLed();
			}
		}
		LedSetFlag=1;
	}
	Ldbon=Ldisp;

	if(Rdbon!=Rdisp)
	{
		Rmd2Start=Rdisp>>1;
		Rmd2PekStart=RdbPeak>>1;
		
		for(i=0;i<LedNum;i++)
		{
			if((i<=Rmd2Start) || (i>=LedNum-Rmd2Start) || i==Rmd2PekStart || i==LedNum-Rmd2PekStart)
			{
				SetRchLed(i);
			}
			else
			{
				ClrRchLed();
			}
		}
		LedSetFlag=1;
	}
	Rdbon=Rdisp;
}
void Delay500ms()		//@22.1184MHz
{
	unsigned char i, j, k;

	i = 57;
	j = 27;
	k = 112;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
void main()
{
	ADC_init();
	IO_init();
	Timer1Init();
	EA=1;
	mode=IapRead(0);
	mode=mode%5;
	ModeSet=mode%5;
	while(1)
	{
		if(ModeNeedSave)
		{
			EA=0;
			IapErase(0);
			IapProgram(0,mode);
			ModeNeedSave=0;
			Delay500ms();
			EA=1;
		}
		EA=0;
		Lamp=Lmax-Lmin;
		Ramp=Rmax-Rmin;
		EA=1;
		Ldb=samp2Lednum(Lamp);
		Rdb=samp2Lednum(Ramp);
		if(Ldb>LdbPeak){LdbPeak=Ldb;Peakcnt=0;}
		if(Rdb>RdbPeak){RdbPeak=Rdb;Peakcnt=0;}
		if(Ldb>Ldisp){Ldisp=Ldb;}
		if(Rdb>Rdisp){Rdisp=Rdb;}
		if(Ldisp<Ldbmin){Ldbmin=Ldisp;Mincnt=0;}
		if(Rdisp<Rdbmin){Rdbmin=Rdisp;Mincnt=0;}
		switch(mode)
		{
			case 0:
				LeftMode();
			break;
			case 1:
				MidMode();
			break;
			case 2:
				SideMode();
			break;
			case 3:
				RightMode();
			break;
			case 4:
				IdleMode();
			break;
		}

		if(LedSetFlag){Delay200us();LedSetFlag=0;}
		
		
		if(cnt>=2)
		{
			cnt=0;
			if(Ldisp){Ldisp--;}
			if(Rdisp){Rdisp--;}
			EA=0;
			Lmax=1;
			Rmax=1;
			Lmin=1023;
			Rmin=1023;
			EA=1;
			Peakcnt++;
			if(Peakcnt>=40)
			{
				if(mode==0)
				{
				SetLedL(Ldisp);
				SetLedR(Rdisp);
				}
				if(mode==1)
				{
					Rdbon=255;
					Ldbon=255;
				}
				if(mode==3)
				{
				SetLedL1(Ldisp);
				SetLedR1(Rdisp);
				}
				Peakcnt=0;
				LdbPeak=0;
				RdbPeak=0;
			}
			Mincnt++;
			if(Mincnt>=60)
			{
				Mincnt=0;
				Ldbmin=65;
				Rdbmin=65;
			}
			while(Lmax<Lmin);
			while(Rmax<Rmin);
			Delay200us();
		}
	}
}

void adc() interrupt 5
{
	ADC_CTRL=0X80;
	((unsigned char *)&ADCVAL)[0]=ADC_RESH;
	((unsigned char *)&ADCVAL)[1]=ADC_RESL;
	if(LRTOGL)
	{
		if(ADCVAL>Lmax){Lmax=ADCVAL;}
		if(ADCVAL<Lmin){Lmin=ADCVAL;}
		ADC_CTRL=0xC0+RCH;
	}
	else
	{
		if(ADCVAL>Rmax){Rmax=ADCVAL;}
		if(ADCVAL<Rmin){Rmin=ADCVAL;}
		ADC_CTRL=0xC0+LCH;
	}
	LRTOGL=!LRTOGL;
}
void Timer1(void) interrupt 3
{
	static unsigned char ShiftSpeed,Mute,MuteDelay;
	static bit ModeSwitchPrev;
	ShiftSpeed++;
	if(ShiftSpeed>3)
	{
		TimeTick=1;
		ShiftSpeed=0;
		ColorShift--;
		if(ColorShift>80){ColorShift=80;}
	}
	if(ModeSwitch==0 && ModeSwitchPrev==1)
	{
		mode++;
		mode=mode%5;
		ModeSet=mode;
		ModeNeedSave=1;
	}
	ModeSwitchPrev=ModeSwitch;
	cnt++;
	if((Ldisp|Rdisp)==0)
	{
		Mute++;
		if(Mute>250)
		{
			mode=4;
			MuteDelay=20;
		}
	}
	if((Ldisp|Rdisp)>0)
	{
		Mute=0;
		if(--MuteDelay==0){mode=ModeSet;}
	}
}