//*********************************************************************** 
//Copyright (c) 2022   HuaXin Micro-electronics Co.,Ltd 

//HS16F1200
//TP0
//configuration introduction

//designer:LvBuWei
//updata：updata：20221111

//*********************************************************************** 
//
//EEPROM: 128bytes
//RAM: 64*bytes
//ROM: 1K×14
//STACK: 8-level
//
//*********************************************************************** 
//****************************************************  
//	   	 VDD -1		8 - VSS	                     
//	   	 PB5 -2		7 - PB0	                     
//	OUT1 PB4 -3		6 - PB1 KEY1
//	OUT2 PB3 -4		5 - PB2	KEY2                    
//****************************************************
//Files include 
#include 	"hs16f1200.h" 
#include 	"main.h"

 
//****interrupt function****//
void interrupt myIsr(void)    
{ 
	if(FTP0IF) 
	{ 
		FTP0IF = 0; 
	 /*TP0_Mode_8bit*/
		//PWM0TH = 0X00;	//0000 0000 
		//PWM0TL = 56;	//0000 0000 
	/*TP0_Mode_12bit*/
		//PWM0TH = 0X08;	//0000 0000 
		//PWM0TL = 0x00;	//0000 0000 
		
		//PORTB = PORTB^0x01;	
	} 
} 

//****main function****//
void main(void) 
{ 
	GPIO_Init(); 
	CLR_BANK0_RAM();
	
	//TP0_Init(TP0_Mode_8bit_Time);
	//TP0_Init(TP0_Mode_12bit_Time);
	TP0_Init(TP0_Mode_3PWM);
	
	while(1) 
	{ 
		CLRWDT 
		PORTB = PORTB^0x20;
		DelayUs(1);
	} 
} 
 

//****TP0 configuration****//
/*
	Example of this program：
	MODE1:8bit-Timer(no AutoLoad)
	MODE2:12bit-Timer(no AutoLoad)
	MODE3:PWM*3(3-PWM independent);
*/
void TP0_Init(unsigned char mode) 
{
	if(mode == TP0_Mode_8bit_Time) 
	{
		/*
		8bit timer mode ：
		Config：Fcpu=4Mhz 4'
		*/
	//;Timer register 周期:400us
		PWM0TH = 0X00;	//0000 0000 
		PWM0TL = 56;	//0000 0000  
		
	//;output pin set :
		PWMPSCON = 0X00;//0000 0000 
						//;Bit5~Bit4：PWM1S[1:0]：PWM1X 输出端口选择； 	00=PB2,01=null,10=null,11=PB3
						//;Bit3~Bit2：PWM01S[1:0]：PWM01X 输出端口选择； 	00=PB1,01=PB4,10=PB5,11=null
						//;Bit1~Bit0：PWM0S[1:0]：PWM0X 输出端口选择； 	00=PB0,01=null,10=null,11=null
	
	//;control register
		PWM0C  = 0x43;	//01-- 0011//Fcpu/2=1MHz/2=0.5MHz 一条2us
						//;Bit4：PWMVS2：PWM1X 输出取反位; 	0=DIS,1=EN
						//;Bit3：PWMVS1：PWM01X 输出取反位; 	0=DIS,1=EN
						//;Bit2：PWMVS0：PWM0X 输出取反位; 	0=DIS,1=EN
						//;[Bit7~Bit6:Bit1~Bit0]：CK0[3:0]：PWMX0时钟源选择位

	//;enable register	 
		PWM0EN = 0x88;	//1-00 1000
						//;Bit7：TP0EN:TP0定时器总使能;				0=DIS,1=EN
						//;Bit5：TP0SEL8: 8/ 12 位定时器选择位;		0=8bit,1=12bit
						//;Bit4：PWM1XEN:PWM1X输出控制位;			0=DIS,1=EN
						//;Bit3：PWM0M:PWMX0工作模式选择位;			0=互补,1=独立
						//;Bit2：PWM01XEN:PWM01X输出控制位;			0=DIS,1=EN
						//;Bit1：PWM0XEN:PWM0X输出控制位;			0=DIS,1=EN
						//;Bit0：LOADEN:PWM重装使能(重装周期寄存器);0=DIS,1=EN
					
	
		//FTP0IF = 0;	//TP0 overflow flag
		//FTP0IE = 1;	//TP0 overflow enable bit(1=EN,0=DIS)
		 
		//FGIE  = 1;	//【INTEN.bit7】GIE:global interrupt enable bit 
	}
	else if(mode == TP0_Mode_12bit_Time)
	{
		/*
		12bit timer mode ：
		Config：Fcpu=4Mhz 4'
		Fosc=8MHz
		*/
	//;Timer register
		PWM0TH = 0X08;	//0000 0000 
		PWM0TL = 0x00;	//0000 0000 
	//;output pin set
		PWMPSCON = 0X00;//0000 0000 
						//;Bit5~Bit4：PWM1S[1:0]：PWM1X 输出端口选择； 	00=PB2,01=null,10=null,11=PB3
						//;Bit3~Bit2：PWM01S[1:0]：PWM01X 输出端口选择； 	00=PB1,01=PB4,10=PB5,11=null
						//;Bit1~Bit0：PWM0S[1:0]：PWM0X 输出端口选择； 	00=PB0,01=null,10=null,11=null
	
	//;control register 
		//PWM0C  = 0x43;	//01-- 0011 //Ftp0=Fcpu/2=0.5MHz
		PWM0C  = 0xC1;	//11-- 0001 //Ftp0=Fosc/4=2MHz
						//;Bit4：PWMVS2：PWM1X 输出取反位; 	0=DIS,1=EN
						//;Bit3：PWMVS1：PWM01X 输出取反位; 	0=DIS,1=EN
						//;Bit2：PWMVS0：PWM0X 输出取反位; 	0=DIS,1=EN
						//;[Bit7~Bit6:Bit1~Bit0]：CK0[3:0]：PWMX0时钟源选择位
	//;enable register	 
		PWM0EN = 0xA0;	//1-10 0000
						//;Bit7：TP0EN:TP0定时器总使能;				0=DIS,1=EN
						//;Bit5：TP0SEL8: 8/ 12 位定时器选择位;		0=8bit,1=12bit
						//;Bit4：PWM1XEN:PWM1X输出控制位;			0=DIS,1=EN
						//;Bit3：PWM0M:PWMX0工作模式选择位;			0=互补,1=独立
						//;Bit2：PWM01XEN:PWM01X输出控制位;			0=DIS,1=EN
						//;Bit1：PWM0XEN:PWM0X输出控制位;			0=DIS,1=EN
						//;Bit0：LOADEN:PWM重装使能(重装周期寄存器);0=DIS,1=EN
	
		//FTP0IF = 0;	//TP0 overflow flag
		//FTP0IE = 1;	//TP0 overflow enable bit(1=EN,0=DIS)
		 
		//FGIE  = 1;	//【INTEN.bit7】GIE:global interrupt enable bit 
	}
	else if(mode == TP0_Mode_3PWM)
	{
		/*
		PWM mode ：3PWM-out
		Config：Fcpu=4Mhz 4'
		*/
	//;PWM1 duty
		PWM1DH = 0X0f;	// 
		PWM1DL = 0X30;	//
	//;PWM01 duty
		PWM0DTH= 0X0f;	// 
		PWM0DTL= 0X10;	// 
	//;PWM0 duty
		PWM0DH = 0x0F;	// 
		PWM0DL = 0xC0;	// 
	//;Timer period 
		PWM0PH = 0X0f;	//---- 1111 
		PWM0PL = 0x00;	//0000 0000  512us
	//;output pin set  
		PWMPSCON = 0X00;//0000 0000//pwm1X-PB2；pwm01X-PB1；pwm0X-PB0 
						//;Bit5~Bit4：PWM1S[1:0]：PWM1X 输出端口选择； 	00=PB2,01=null,10=null,11=PB3
						//;Bit3~Bit2：PWM01S[1:0]：PWM01X 输出端口选择； 	00=PB1,01=PB4,10=PB5,11=null
						//;Bit1~Bit0：PWM0S[1:0]：PWM0X 输出端口选择； 	00=PB0,01=null,10=null,11=null
	//;control register 
		PWM0C  = 0x43;	//01-- 0011//Fcpu/2
						//;Bit4：PWMVS2：PWM1X 输出取反位; 	0=DIS,1=EN
						//;Bit3：PWMVS1：PWM01X 输出取反位; 	0=DIS,1=EN
						//;Bit2：PWMVS0：PWM0X 输出取反位; 	0=DIS,1=EN
						//;[Bit7~Bit6:Bit1~Bit0]：CK0[3:0]：PWMX0时钟源选择位
	//;enable register	 
		PWM0EN = 0x9f;	//1-01 1111//3-PWM out
						//;Bit7：TP0EN:TP0定时器总使能;				0=DIS,1=EN
						//;Bit5：TP0SEL8: 8/ 12 位定时器选择位;		0=8bit,1=12bit
						//;Bit4：PWM1XEN:PWM1X输出控制位;			0=DIS,1=EN
						//;Bit3：PWM0M:PWMX0工作模式选择位;			0=互补,1=独立
						//;Bit2：PWM01XEN:PWM01X输出控制位;			0=DIS,1=EN
						//;Bit1：PWM0XEN:PWM0X输出控制位;			0=DIS,1=EN
						//;Bit0：LOADEN:PWM重装使能(重装周期寄存器);0=DIS,1=EN
	}
	FTP0IF = 0;	//TP0 overflow flag
	FTP0IE = 1;	//TP0 overflow enable bit(1=EN,0=DIS)
	 
	FGIE  = 1;	//【INTEN.bit7】GIE:global interrupt enable bit  
}


//****GPIO configuration****//
void GPIO_Init(void) 
{
	OPTION= 0b000000000;//0000 0000	
			//;Bit7：INT1EDG：外部中断1触发方式选择位（PB1）;0-falling edge, 1-rising edge
			//;Bit6：INTEDG：外部中断触发方式选择位（PB0）	;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
			//;Bit2~Bit0：PS2:PS0：预分频比率选择位

	PCON  = 0b10100000;	//101- ----		
			//;Bit7：WDTE: WDT（看门狗定时器）使能位	;0-DIS, 1-EN
			//;Bit6：EIS: IOB0/INT引脚定义位			;0-DIS, 1-EN
			//;Bit5：LVREN: 低电压复位使能位			;0-DIS, 1-EN

//PORTB //----------------------------------------------------------------------

	PORTB = 0b00000000;	

	TRISB = 0b00000000;	//(0-OUT;1-IN) 	
	
	PBIC0 = 0b00000000;	//1111 1111 :1-EN;0-DIS
	
	WUCON = 0b00000000;	//0000 0000	:1-EN;0=DIS 

	ODCON = 0b00000000;	//1111 -111 :1-EN;0-DIS 	

	PHCON = 0b11111111;	//1111 1111 :1-DIS;0-EN 	
	
	PORTB = 0b00000000;	
	 //----------------------------------------------------------------------
} 


//****************************************************  
//CLR_BANK0_RAM: 
//C中嵌入ASM，指令操作特殊寄存器前面需要加下划线“_”;
//****************************************************    
void CLR_BANK0_RAM(void)
{
#asm  
	MOVLW	0X3F
	MOVWF	040H
	MOVLW	0X7F
	MOVWF	_FSR
	
BANK0_RAM_CLR_LOOP:	
	CLRF	_INDF
	DECF	_FSR,F
	DECFSZ	040H,F
	GOTO	BANK0_RAM_CLR_LOOP		
#endasm	   
}

 
//****delay function****// 
//;Fcpu=1MHz;DelayUs = 11+7x     
void DelayUs(unsigned char delayUs)     
{      
	while(delayUs--);    
} 