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

//HS23P1820
//TC0
//1.定时器TC0中断 PB0 输出定时器TC0中断信号；PB1 输出主程序信号；
//2.定时器TC0使用内部低速时钟源，PB0输出TC0中断信号；PB1 输出主程序信号；
//configuration introduction

//designer:LvBuWei
//updata：20220309

//*********************************************************************** 
#include 	"hs23p1820.h" 
#include 	"main.h"	




//****interrupt function****//
void interrupt myIsr(void)    
{ 
	if(FTC0IF) 
	{ 
		FTC0IF = 0; 
	 /*TC0_Mode_8bit*/
		TC0L = 06;	//TC0 Low_8bit
		
		PORTB = PORTB^0x01;	
	} 
} 


//****main function****//
void main(void) 
{ 
	GPIO_Init(); 
	CLR_BANK0_RAM();
	
	TC0_Init(TC0_Mode_8bit);
	//TC0_Init(TC0_Mode_LOW);
	
	while(1) 
	{ 
		CLRWDT  	
		PORTB = PORTB^0x02;		
		DelayUs(1);
	} 
} 
 
 
//****TC0 configuration ****//
/*
	Example of this program：
	MODE1:8bit-Timer(no AutoLoad)
	MODE5:TC0-internal Low_Mode
*/
void TC0_Init(unsigned char mode) 
{ 
	if(mode == TC0_Mode_8bit) 
	{
		/*
		8bit Timer interrupt：1ms
		Config：Fcpu = 4Mhz 4'
		*/
		//;TC0 init value
	 	TC0L = 0x06;	//TC0 Low_8bit
	 	
	 	TC0M = 0x60;	//0110 0000;//Fcpu 4';8bit;
	 					//Bit7：TC0TR:TC0 启动控制位。
						//Bit6~Bit4：TC0S[2:0]:TC0 分频选择位
						//Bit3：TCCKS:TC0 时钟信号控制位	
		
		FTC0IF = 0;		//TC0 overflow flag		 
		FTC0IE = 1;   //TC0 overflow enable bit(1=EN,0=DIS)	
	}
	else if(mode == TC0_Mode_LOW)
	{
		/*
		8bit Timer interrupt：1ms
		Config：Fcpu = 4Mhz 4'
		*/
		//;TC0 init value
	 	TC0L = 0x06;	//TC0 Low_8bit
	 	
	 	TC0M = 0x70;	//0110 0000;//Fcpu 4';8bit
	 					//Bit7：TC0TR:TC0 启动控制位。
						//Bit6~Bit4：TC0S[2:0]:TC0 分频选择位
						//Bit3：TCCKS:TC0 时钟信号控制位	
		
		FTC0IF = 0;		//TC0 overflow flag		 
		FTC0IE = 1;   	//TC0 overflow enable bit(1=EN,0=DIS)	
		
		OSCM = 0x10;	//-001 0000
						//;Bit6：WAKEMODE：睡眠唤醒后系统时钟选择位;0=InsideLowRC,1=HighRC
						//;Bit5：GREENEN：绿色模式使能位		;0=GeneralMode，1=GreenMode
						//;Bit4：SLT0CON：TC0低速时钟控制位(用于唤醒睡眠、绿色);0=HighRC,1=LowRC
						//;Bit3：SLCON：内外低速时钟控制位	;0=OpenLowRC,1=CloseLowRC
						//;Bit2：XTSEL：内外低速选择位		;0=InsideLowRC,1=OutSideLowRC
						//;Bit1：STPHX：内部高速振荡器控制位	;0=Work,1=Stop
						//;Bit0：CLKMD：系统时钟模式控制位	;0=GeneralMode，1=LowMode
	}	
	FTC0TR = 1; 	//;TC0 Start bit	
	FGIE  = 1;	//【INTEN.bit7】GIE:global inturrupt enable bit 
}


//****GPIO configuration****//
void GPIO_Init(void) 
{
	OPTION= 0b000000000;//00-- -000	
						//;Bit7：INT1EDG：外部中断1触发方式选择位（PB1）;0-falling edge, 1-rising edge
						//;Bit6：INTEDG：外部中断触发方式选择位（PB0）	;0-falling edge, 1-rising edge
						
						//;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;	//--11 1111 :1-EN;0-DIS
	
	WUCON = 0b00000000;	//--00 0000	:1-EN;0=DIS 

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

	PHCON = 0b11111111;	//--11 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--);    
} 