
/*********************************************************/

#define MAIN_Fosc	11059200L	//定义主时钟

#include	"STC8Gxxx.h"

/*************	功能说明	*************
P37作为PWM2输出，控制灯的亮度，
P36作为输入，int2下降沿中断，编码器的A端， 
P10作为输入，无中断，编码器的B端。

******************************************/


/*************	本地常量声明	**************/

#define IAP_ADDR 0x0400

/*************	本地变量声明	**************/
char duty_rate = 5;
char time_save = 0;
char save_status = 0;


/*************	本地函数声明	**************/



/****************  外部函数声明和外部变量声明 *****************/

/**********************************************/

void Delay100ms(void)	//@11.0592MHz
{
	unsigned char data i, j, k;

	_nop_();
	_nop_();
	i = 5;
	j = 52;
	k = 195;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

//中断 int2
void INT2_Isr() interrupt 10
{
    if(P10 == 1){
        if(duty_rate > 0) {
			duty_rate --;
		}
	}
	else {
		if(duty_rate < 63) {
			duty_rate ++;
	    }
	}

	//如果duty_rate， 则关闭cr，打开P37
	if(duty_rate == 0)
	{
	    CR = 0;
		CL = 0x63; //计数器最大
	    CH = 0x63; //计数器最大
	    P37 = 1;
	}
	else if(duty_rate == 63)
	{
	    CR = 0;
		CL = 0x00; //计数器清零
	    CH = 0x00; //计数器清零
		P37 = 0;
	}
	else
	{
	    CR = 1;
		CCAP2H = duty_rate;
	}

	time_save = 10;
	save_status = 1;
}

void IapIdle()
{
    IAP_CONTR = 0; //关闭IAP功能
	IAP_CMD = 0;  //清除命令寄存器
	IAP_TRIG = 0;  //清除触发寄存器
	IAP_ADDRH = 0x80; //将地址设置到非IAP区域
	IAP_ADDRL = 0; //将地址设置到非IAP区域
}

char IapRead(int addr)
{
    char dat;

	IAP_CONTR = 0x80; //使能IAP功能
	IAP_TPS = 6;  //设置等待参数12MHz
	IAP_CMD = 1;  //设置IAP读命令
	IAP_ADDRL = addr; //设置IAP低地址
	IAP_ADDRH = addr >> 8; //设置IAP高地址
	IAP_TRIG = 0x5a; //写触发命令
	IAP_TRIG = 0xa5;
	_nop_();
	dat = IAP_DATA;  //读IAP数据
	IapIdle();

	return dat;
}

void IapProgram(int addr, char dat)
{
    IAP_CONTR = 0x80; //使能IAP功能
	IAP_TPS = 12;  //设置等待参数12MHz
	IAP_CMD = 2;  //设置IAP写命令
	IAP_ADDRL = addr; //设置IAP低地址
	IAP_ADDRH = addr >> 8; //设置IAP高地址
	IAP_DATA = dat;  //读IAP数据
	IAP_TRIG = 0x5a; //写触发命令
	IAP_TRIG = 0xa5;
	_nop_();
	IapIdle();
}

void IapErase(int addr)
{
    IAP_CONTR = 0x80; //使能IAP功能
	IAP_TPS = 12;  //设置等待参数12MHz
	IAP_CMD = 3;  //设置IAP擦除命令
	IAP_ADDRL = addr; //设置IAP低地址
	IAP_ADDRH = addr >> 8; //设置IAP高地址
	IAP_TRIG = 0x5a; //写触发命令
	IAP_TRIG = 0xa5;
	_nop_();
	IapIdle();
}

void main(void)
{

	int time100ms = 0;

	//IapErase(IAP_ADDR);
	//IapProgram(IAP_ADDR, 5);

	duty_rate = IapRead(IAP_ADDR);
	
	//p10高阻输入
	P1M0 = 0x00; P1M1 = 0x01; 
	//p37 推挽输出 p36	高阻输入
	P3M0 = 0x80; P3M1 = 0x40; 	
	P37 = 0;
	
	CCON = 0x00;
	CMOD = 0x80;
	CL = 0x00; //计数器清零
	CH = 0x00; //计数器清零

	CCAPM2 = 0x42;  //PCA模块2为PWM模式PCA_PWM2sss
	//PCA模块2输出6位PWM，可以64档
	//pwm频率为	 11059200/64=172.8k， sy7203pwm输入频率为20K-1M
	PCA_PWM2 = 0x80;  
	//占空比值
	CCAP2L = 0;
	CCAP2H = duty_rate;
	CR = 1;

    INTCLKO |= 0x10;
	EA = 1;
	
	
	while (1)
	{
	    for(time100ms = 10; time100ms > 0; time100ms--)
		{
		     Delay100ms();   
		}
		if(time_save > 0)
		{
		    time_save --;
		}
		else //如果倒计时完成
		{
		    if(save_status == 1)  //  需要保存
			{
			    IapErase(IAP_ADDR);
				IapProgram(IAP_ADDR, duty_rate);
				save_status = 0;
			}
		}
		//P37 = ~P37;		   		
	}
}
/**********************************************/
  
