#include 	"main.h"		



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

	if (FT3IF) { //定时器3 中断模式
		FT3IF = 0;
		//无重装载功能，需自己设置定时器
		T3TH = (4096 - 200) / 256;	//定时计数 高位
		T3TL = (4096 - 200) % 256;	//定时计数 低位
		PA7 = ~PA7; //200us 翻转一次

	}
}


//定时器3 定时器模式，使用Fcpu/2的4分频作为时钟  200us发生一次中断

void T3_Init(void) {
	T3C1 = 0x05; //Fcpu/2   4分频 1MHZ


	//时钟计算
					//Fcpu=16MHZ/2=8MHZ
					//定时器时钟 =(Fcpu/2)/4=1MHZ  
					//一个计数器值为1us


//T3C1 
	//bit6:T3OUT0：T3PWM 输出全低电平使能; 
						//0=T3PWM 输出不受影响
						//1=T3PWM 输出全低电平
	//bit5~4:T3CKS<1:0>：T3 定时器时钟源选择
						// 00 	:	Fcpu/2
						// 01 	:	Fosc
						// 10 	:	PA2(上升、下降沿可选)
						// 11 	:	PA7(上升沿)
	//bit2~0: T3CK<2:0>：T3 定时器时钟分频选择
						// 111 : 1分频					// 110 : 2分频
						// 101 : 4分频					// 100 : 8分频
						// 011 : 16分频				// 010 : 32分频
						// 001 : 64分频				// 000 : 128分频



	T3TH = (4096 - 200) / 256;	//定时计数高位
	T3TL = (4096 - 200) % 256;	//定时计数低位


	T3C0 = 0x80;	//使能定时器
	//bit7:T3REN：T3 定时器总使能; 0=DIS ,1=EN
	//bit4:T3PWMINV：T3PWM 输出极性取反; 0=NOT INV ,1=INV
	//bit3:T3BUZEN：T3BUZZER 输出使能，PC4 口输出; 0=DIS ,1=EN
	//bit1:T3PWMEN：T3PWMEN 输出使能，PC4 口输出; 0=DIS ,1=EN

	FT3IF = 0;
	FT3IE = 1;//使能定时器3中断
	PEIE = 1;	//使能外设中断
	GIE = 1;	//使能总中断

}


void main(void) {
	System_Init();
	GPIO_Init();
	CLR_RAM_EveryBank();
	T3_Init();
	while (1) {
		CLRWDT();
	}
}


//****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 = 0b000000000;	 //-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 = 0b10110000;		//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--);
}