#include 	"main.h"		



#define 	TEST_SFR	0
//==============================================
//1.>中断函数
//==============================================
void interrupt myIsr(void) {
	//----User Code ----/
	if (T1IF) {
		T1IF = 0;


		PA7 = ~PA7;
	}

}

//低速RC 38K作为时钟  1/38000*200 约5.2ms T1唤醒一次进入中断取反PA7

void ECCP_Init(void) {

	T1TH = (65536 - 200) / 256;	//T1定时器计数器
	T1TL = (65536 - 200) % 256;

	T1CON = 0x0E;	//0000 1111
	//bit7: T1GINV：门控翻转位 (T1 计数时的门控有效电平，门控源参考 CMCON1 寄存器); 	
		//0-Low,1=High
	//bit6: T1GE：门控使能（T1REN=1 时有效）;				
		//0-Close,1=Open
	//b5~4: T1CK<1:0>：T1 分频选择; 						
		//00=1T, 01=2T, 10=4T, 11=8T;
	//bit3: T1CKS1: T1 外部时钟源选择（T1CKS0=1 时有效）;	
		//0=外部时钟 PA7;1=内部低速 RC 或者外部低速晶振
	//bit2: T1SYNC：T1 外部时钟源与内部系统时钟同步控制（T1CKS0=1 时有效）;	
		//0 = 同步,1 = 异步
	//bit1: T1CKS0：T1 内外时钟源选择;										
		//0 = 内部 Fcpu,1 = 外部时钟源
	//bit0: T1REN：定时器 T1 使能; 											
		//0=DIS,1=EN

	PCON = 0b00000000;		//0-0- ----	(Initialization state:1011 1111)
	//;Bit7：WDTE: WDT（看门狗定时器）使能位	;0-DIS, 1-EN
	//;Bit5：LVREN: 低电压复位使能位			;0-DIS, 1-EN

	T1IF = 0;
	T1IE = 1;	//务必开启
	PEIE = 1;	//务必开启
	GIE = 1;
	WDTE = 0;
	T1REN = 1;

	OSCM = 0B00000001;	 //0001 0001//-进低速
	OSCM |= 0B01000010;	 //0000 0010//-关高速
	//bit7: MONIF：外振时钟停振监测标志位; 					0 = 未监测到外振时钟停振; 1 = 测到外振时钟停振
	//bit6: WAKEMODE：低速模式下睡眠唤醒后系统时钟选择位；	0 = 选择内外低速作为系统时钟；1 = 选择高速 RC 作为系统时钟
	//bit5: GREENEN：绿色模式使能位；						0 = 普通模式；1 = 绿色模式
	//bit4: RTCEN：RTC 模式使能位（IRC&RTC 模式）；			0 = RTC 模式使能；1 = RTC 模式关闭，外部低速晶振停振
	//bit3: SLCON：内部低速时钟控制位；						0 = 开启内部低速时钟；1 = 关闭内部低速时钟（同时需 SLEEP 且 wdt disable）
	//bit2: XTSEL：内外低速选择位；							0 = 选择内部低速 RC；1 = 选择外部低速晶振
	//bit1: STPHX：内部高速振荡器控制位；					0 = 运行；1 = 停止，内部低速 RC 振荡器仍然运行
	//bit0: CLKMD：系统时钟模式控制位；						0 = 普通模式，高速时钟作为系统时钟；1 = 低速模式，低速时钟作为系统时钟
	asm("NOP");
	SLEEP();
	WDTE = 1;

}
//睡眠配置 关闭看门狗 切换低速时钟，设置T1时钟唤醒时间

void sleep_config() {
	WDTE = 0;
	T1REN = 0;
	T1TH = (65536 - 200) / 256;	//T1定时器计数器
	T1TL = (65536 - 200) % 256;
	T1REN = 1;

	OSCM = 0B00000001;	 //0001 0001//-进低速
	OSCM |= 0B01000010;	 //0000 0010//-关高速
	//bit7: MONIF：外振时钟停振监测标志位; 					0 = 未监测到外振时钟停振; 1 = 测到外振时钟停振
	//bit6: WAKEMODE：低速模式下睡眠唤醒后系统时钟选择位；	0 = 选择内外低速作为系统时钟；1 = 选择高速 RC 作为系统时钟
	//bit5: GREENEN：绿色模式使能位；						0 = 普通模式；1 = 绿色模式
	//bit4: RTCEN：RTC 模式使能位（IRC&RTC 模式）；			0 = RTC 模式使能；1 = RTC 模式关闭，外部低速晶振停振
	//bit3: SLCON：内部低速时钟控制位；						0 = 开启内部低速时钟；1 = 关闭内部低速时钟（同时需 SLEEP 且 wdt disable）
	//bit2: XTSEL：内外低速选择位；							0 = 选择内部低速 RC；1 = 选择外部低速晶振
	//bit1: STPHX：内部高速振荡器控制位；					0 = 运行；1 = 停止，内部低速 RC 振荡器仍然运行
	//bit0: CLKMD：系统时钟模式控制位；						0 = 普通模式，高速时钟作为系统时钟；1 = 低速模式，低速时钟作为系统时钟
	asm("NOP");
	SLEEP();
	WDTE = 1;

}


//****main function****//
void main(void) {
	System_Init();
	GPIO_Init();
	CLR_RAM_EveryBank();

	ECCP_Init();
	while (1) {
		CLRWDT();
		sleep_config();
		PORTA = PORTA ^ 0x04;

	}
}



//****GPIO configuration****//
void GPIO_Init(void) {
	//;PORTA
	PORTA = 0b00000000;		//--00 0000	
	TRISA = 0b00000000;		//0000 0000 :0-OUT;1-IN 	

	PAODCON = 0b00000000;	//--11 -111 :1-EN;0-DIS (Open-drain)	
	PAHCON = 0b11111111;	//--11 1111 :1-DIS;0-EN (UpPull)	
	PADCON = 0b11111111;	//--11 1111 :1-DIS;0-EN (DownPull)	
	WUACON = 0b00000000;	//--00 0000	:1-EN;0=DIS (WakeUp)

	PAIC0 = 0b00000000;		//1111 1111 :1-EN;0-DIS (Drive)

	//;PORTC
	PORTC = 0b00000000;
	TRISC = 0b00000000;		//--00 0000 :0-OUT;1-IN

	PCDCON = 0b11111111;	//---- 1111 :1-DIS;0-EN (DownPull)
	PCHCON = 0b11111111;	//---- 1111 :1-DIS;0-EN (UpPull)

	PCIC0 = 0b00000000;		//1111 1111 :1-EN;0-DIS (Drive)
}


//****System _Init function****// 
void System_Init(void) {
	OPTION = 0b000000001;	 //-000 0000	(Initialization state:0011 1111)
	//;Bit6：INTEDG：外部中断触发方式选择位（PC1）	;0-falling edge, 1-rising edge
	//;Bit5：T0CS：TMR0时钟源选择位					;0-fcpu, 1-ExitClock
	//;Bit4：T0SE：TMR0时钟源边沿选择位				;0-falling edge, 1-rising edge
	//;Bit3：PSA：预分频分配位						;0-TMR0, 1-WDT
	//;B2~0：PS2:PS0：预分频比率选择位
		//000		2T-TMR0			1T-WDT
		//001		4T-TMR0			2T-WDT
		//010		8T-TMR0			4T-WDT
		//011		16T-TMR0		8T-WDT
		//100		32T-TMR0		16T-WDT
		//101		64T-TMR0		32T-WDT
		//110		128T-TMR0		64T-WDT
		//111		256T-TMR0		128T-WDT	

	PCON = 0b10100000;		//1-1- ----	(Initialization state:1011 1111)
	//;Bit7：WDTE: WDT（看门狗定时器）使能位	;0-DIS, 1-EN
	//;Bit5：LVREN: 低电压复位使能位			;0-DIS, 1-EN

	INTCON = 0B00000000;	//0000 0000 (Initialization state:0000 0000)
	//;Bit7：GIE：全局中断使能位	;0-DIS, 1-EN
	//;Bit6：PEIE：外设总中断使能	;0-DIS, 1-EN
	//;Bit5：T0IE：Timer0 溢出中断使能位	;0-DIS, 1-EN
	//;Bit4：INTIE：外部中断使能位（PC1）	;0-DIS, 1-EN
	//;Bit3：PAIE: PORTA 输入状态变化中断使能位
	//;Bit2: T0IF: Timer0 溢出中断标志位，软件复位
	//;Bit1: INTIF:	外部中断标志位（PC1），软件复位
	//;Bit0: PAIF: PORTA 输入状态变化中断标志位，软件复位

	PIE1 = 0B00000000;		//-0-- -000
	//;Bit6：ADCIE：ADC 中断使能位
	//;Bit2: CCP1IE: 捕捉、比较中断使能位
	//;Bit1: T2IE: 定时器 T2 中断使能位
	//;Bit0: T1IE: 定时器 T1 中断使能位

	PIR1 = 0B00000000;	//-0-- -000
	//;Bit6：ADCIF：ADC 中断使能标志位，软件复位
	//;Bit2: CCP1IF: 捕捉、比较中断标志位，软件复位
	//;Bit1: T2IF: 定时器 T2 中断标志位，软件复位
	//;Bit0: T1IF: 定时器 T1 中断标志位，软件复位

	PIE2 = 0B00000000;	//-00- 000-
	//;Bit6：C2IE: 比较器 C2 中断使能位
	//;Bit5：C1IE: 比较器 C1 中断使能位

	//;Bit3：T5IE: 定时器 T5 中断使能位
	//;Bit2: T4IE: 定时器 T4 中断使能位
	//;Bit1: T3IE: 定时器 T3 中断使能位

	PIR2 = 0B00000000;	//-00- 000-
	//;Bit6：C2IE: 比较器 C2 中断标志位，软件复位
	//;Bit5：C1IE: 比较器 C1 中断标志位，软件复位

	//;Bit3：T5IE: 定时器 T5 中断标志位，软件复位
	//;Bit2: T4IE: 定时器 T4 中断标志位，软件复位
	//;Bit1: T3IE: 定时器 T3 中断标志位，软件复位

	OSCM = 0B00000000;	//0000 0000
	//;Bit7：MONIF：外振时钟停振监测标志位; 0= 未监测到外振时钟停振，1=测到外振时钟停振
	//;Bit6：WAKEMODE：低速模式下睡眠唤醒后系统时钟选择位; 0=内外低速，1=高速RC
	//;Bit5：GREENEN：绿色模式使能位；0=普通模式，1=绿色模式
	//;Bit4：RTCEN：RTC 模式软件使能位；0=EN，1=DIS
	//;Bit3：SLCON：内外低速时钟控制位；0=Open内外低速，1=关闭内外低速
	//;Bit2: XTSEL：内外低速选择位；0=内部低速，1=外部低速
	//;Bit1: STPHX：内部高速振荡器控制位；0=run，1=Stop
	//;Bit0: CLKMD: Timer0 溢出中断使能位；0=普通模式，1=低速模式

//RCREG = 0;
}


//****************************************************  
//对用户寄存器进行清0操作 
//分BANK区清楚 
//嵌入汇编操作 
//IRP:FSR7:	间接寻址寻址空间（充分理解 间接寻址操作原理）
//	0 0		BANK0
//	0 1		BANK1
//	1 0		BANK2
//	1 1		BANK3
//****************************************************    
void CLR_RAM_EveryBank(void) {
	#asm
		MOVLW	0x5F  //个数
		MOVWF	0x20  //个数存放地址 
		MOVLW 	0x7F  //REG从后往前 清理 
		MOVWF	_FSR, F
		CLR_RAM_LOOP :
	CALL	CLR_RAM_Demo

		DECF	_FSR, F
		DECFSZ	0X20, F
		GOTO	CLR_RAM_LOOP

		CALL	CLR_RAM_Demo
		RETURN

		CLR_RAM_Demo :

	//	0 1		BANK1
		//BCF	_STATUS,7	//IRP
	BSF		_FSR, 7		//01:BANK1
		CLRF	_INDF

		//	0 0		BANK0
			//BCF		_STATUS,7
		BCF		_FSR, 7	//00:BANK0
		CLRF	_INDF

		RETURN
		#endasm
}


//****delay function****// 
//;Fcpu=8MHz （误差4us）
void DelayUs(unsigned char delayUs) {
	while (delayUs--);
}