 #include "stc8h.h"
#include "intrins.h" 
#include "eeprom.h"
#include <stdio.h>

 

#define MAIN_Fosc 11059200UL
#define BRT         (65536 - MAIN_Fosc / 115200 / 4)
//#define EEPROMId  	 0x0E00
 
typedef unsigned char u8;
typedef unsigned int u16;
  
u8 save;
u8 state;
 u8 dat;
u16 EEPROMId = 0005;
u16 time;
 
 bit key_flag;

//void delayms(u16 ms);   
void sys_init();
void PWM_init(void);
void Timer0_Init(void);
 

 void UartInit()
{
    SCON = 0x5a;
    T2L = BRT;
    T2H = BRT >> 8;
    AUXR = 0x15;
}

 
void UartSend(char dat)
{
    while (!TI);
    TI = 0;
    SBUF = dat;
}


u8 LEDControl()
{	
//	u8 dat;

//	u16 EEPROMId = 0XE00;				//将指针指向第8扇区的第一个字节
//	SetMode(CMD_READ);				//设置为读取数据
	
	while(1)
	{	
		dat = IapRead(EEPROMId + 1);			//读取下一字节数据
		printf("dat=%bu\r\n",dat);
		printf("id=%u\r\n",EEPROMId);		
		if(dat == 0XFF)					//下一字节字节未写入数据
		{	dat = IapRead(EEPROMId);		//读取当前字节数据
//			SetMode(CMD_PROGRAM);			//写入数据
	
//			switch(dat)
//			{	
//				case 254: IapProgram(EEPROMId+1,1);break;
//				case 1: IapProgram(EEPROMId+1,15);break;
//				case 15: IapProgram(EEPROMId+1,55);break;
// 
//				default: IapProgram(EEPROMId+1,254);break;
//			}		
			 
			return dat;					//返回当前字节数据
		}else							//下一字节不为空,指针加一，继续判断下一个字节
		{	EEPROMId++;
		}


		if(EEPROMId >= 0XFFD)				//如果当前字节到达EEPROM末尾，擦除扇区所有数据
		{	
//			SetMode(CMD_ERASE);			//扇区擦除
			IapErase(0x0000);				//擦除扇区
			IapErase(0x0200);				//擦除扇区	
			IapErase(0x0400);				//擦除扇区	
			IapErase(0x0600);				//擦除扇区	
			IapErase(0x0800);				//擦除扇区	
			IapErase(0x0A00);				//擦除扇区	
			IapErase(0x0C00);				//擦除扇区	
			IapErase(0x0E00);				//擦除扇区				
			return 1;
		}
	}
}


void main()
{		

	sys_init();  
 
      UartInit();
	
    LEDControl();
  
//     UartSend(IapRead(dat));
//     UartSend(IapRead(EEPROMId));

//     UartSend(IapRead(state));
	
		PWMA_CCR1 = dat;    
	
  	while(1)
	{
//		switch(state)
//	{
//		case 0 :    PWMA_CCR1 = 5;   break;
//		case 1 :   PWMA_CCR1 = 15;   break;
//		case 2 :    PWMA_CCR1 = 55;   break;
//		case 3 :   PWMA_CCR1 = 250;   break;
//		default:break;

//		
//	}

	}


 
	
	 
 	
}



void sys_init(void)
{
	P_SW2=0x80;
	
    P3M0 = 0x00; P3M1 = 0x00;       P1M0 = 0x00; P1M1 = 0x00; 
	
    	 PWM_init();
	 Timer0_Init();
 	
	IT0=1;EX0=1;
	INTCLKO|=0x40;   //EX4=1; 允许INT4外部中断
//	IP2H=0x00;		
	IP2=0x10;

	
	EA=1;			//打开总中断

}
 

//// 初始化PWM功能
void PWM_init(void) {
    PWMA_CCER1 = 0x00;                          // 写CCMRx前必须先清零CCERx关闭通道
    PWMA_CCMR1 = 0x60;                          // 设置CC1为PWMA输出模式
    PWMA_PS        = 0x00;                      //  
    PWMA_CCER1 = 0x03;                          // 使能CC4通道双极
    PWMA_CCR1 = 0;                              // 初始化CCR4计数值为0
    PWMA_ARR = 256;                           // 设置周期时间为12000个计数周期
    PWMA_ENO = 0x01;                            // 使能PWM4P+N端口输出
    PWMA_PSCR = 0;                              // PWM时钟预分频寄存器设置为0
    PWMA_BKR = 0x80;                            // 使能主输出
    PWMA_CR1 = 0x01;                            // 开始计时
	
}
 
 
void Timer0_Isr(void) interrupt 1
{ 	
	TL0 = 0xCD;				//设置定时初始值
	TH0 = 0xD4;				//设置定时初始值

 	 if(time<200)
	{

					switch(dat)
			{	
				case 254: IapProgram(EEPROMId+1,1);break;
				case 1: IapProgram(EEPROMId+1,15);break;
				case 15: IapProgram(EEPROMId+1,55);break;
 
				default: IapProgram(EEPROMId+1,254);break;
			}		
		
		
	}
	else
 
	
	if(time<200) time++;
}



void Timer0_Init(void)		//1毫秒@11.0592MHz
{
	AUXR |= 0x80;			//定时器时钟1T模式
	TMOD &= 0xF0;			//设置定时器模式
	TMOD |= 0x01;			//设置定时器模式
	TL0 = 0xCD;				//设置定时初始值
	TH0 = 0xD4;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
	ET0 = 1;				//使能定时器0中断
}



void INT4_Isr(void) interrupt 16
{
 IAP_CONTR=0x60;			
}


void INT0_Isr(void) interrupt 0
{
 		
}

void delayms(u16 ms)
	{u16 i;
	do{
		i = MAIN_Fosc /10000;
		while(--i);
	}		while(--ms);
} 
	



 

 
 

