#include 	"main.h"		

//1.>中断函数
//==============================================
void interrupt myIsr(void)    
{

	if(FINTIF) 
	{
		FINTIF = 0; 	 
		PORTA = PORTA^0x40;	
	}
	if(FPAIF) 
	{ 
		PAIF = 0; 	 
		PORTA = PORTA^0x08;	
	}
}



//PA6 端口唤醒
void PA_CHANGE_INIT(void)
{	
//PA6 as example 
	TRISA |= 0b01000000;
	
	PAHCON = 0b11111111;	//上拉寄存器 :1-DIS;0-EN  	

	WUACON = 0b01000000;	//0000 0000	:1-EN;0=DIS -务必开启(睡眠)
	//0 关闭对应IO口中断/唤醒功能
	//1 使能对应IO口中断/唤醒功能
	//bit7:WUA7 ->PA7 
	//bit6:WUA6 ->PA6 
	//bit5:WUA5 ->PA5
	//bit4:WUA4 ->PA4 
	//bit3:WUA3 ->PA3 
	//bit2:WUA2 ->PA2 
	//bit1:WUA1 ->PA1 
	//bit0:WUA0 ->PA0 


	
	FPAIF = 0;	//PORTA 输入状态变化中断标志位
	
	FPAIE = 1;	//睡眠务必开启  PORTA 输入状态变化中断使能位
	FGIE  = 1;  //开启全局中断
}


//****INT function****//
//PC1-input with Up_pull
void INT_Init(void)
{
	OPTION = 0b010000000;	 //-100 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  = 0b10110000;		//1-1- ----	(Initialization state:1011 1111)
			//;Bit7：WDTE: WDT（看门狗定时器）使能位	;0-DIS, 1-EN
			//;Bit5：LVREN: 低电压复位使能位			;0-DIS, 1-EN
	
	TRISC = 0b00000010;	//(0-OUT;1-IN) 
	PCHCON = 0b11111101;	//1111 1111 :1-DIS;0-EN    

	FINTIF = 0;
	
	FINTIE = 1;
	
	//PEIE = 1;		//
	FGIE  = 1;
}


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

	PA_CHANGE_INIT();
	
		
	WDTE = 0; //关闭看门狗
	_NOP();
	SLEEP();
	_NOP();
	WDTE = 1;
	
	while(1) 
	{ 
		CLRWDT();  
		PORTC = PORTC^0xff;		
		DelayUs(200);
	} 
} 


//****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)
{
	OPTIONR = 0b00000001;	 //-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--);
}