/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  
	FileName:HS23P2721_Template.c  
	ProjectName:  *TC2*配置使用说明*
	FunctionDesc:  
	CreateDate: 20210425 
	Version: V2.0 
	Author:  
	ModifyHistory:  
	Remark:  
	Copyright (c) 2021   苏州华芯微电子股份有限公司 
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ 
  
//RAM: 96*8bit
//ROM: 2K×16
//STACK: 5-level
//***********************************************************

#include	"HS23P2721.h" 
 

/****TC2****功能说明****/
/**8bit-定时器**/
/**BUZ模式**/
/**PWM模式**/


/*Function statment<<=========================================================*/ 
void GpioInit(void); 
void RAM_CLR(void);


#define	TC2_Mode_Timer	0x00
#define	TC2_Mode_BUZ	0x01
#define	TC2_Mode_PWM	0x02
void TC2_Init(unsigned char mode);

void DelayUs(unsigned char delayUs);


/*Interrupt entrance function <<====================================================*/ 
void __interrupt[0x8] isr(void) 
{ 	//FTC2IF:TC2 中断请求标志
	if(FTC2IF)							
	{
		FTC2IF = 0;						//0-DIS,1-EN
		
		//P4:P4端口寄存器
		P4 = P4^0x08;					//---0 1000
										//0-OUT , 1-IN
	}	 
} 
 
/*Main function<<===========================================================*/ 
void main(void) 
{ 
	GpioInit(); 
	RAM_CLR();
	
	TC2_Init(TC2_Mode_Timer);
//	TC2_Init(TC2_Mode_PWM);	//P01
//	TC2_Init(TC2_Mode_BUZ);	//P01
	while(1) 
	{ 	//WDTR:看门狗定时器
		WDTR = 0x5A;				/*clear watchdog timer*/ 
 
 		//P0:P0端口寄存器			
		P0 = P0^0xff;				//---1 1111
		
		DelayUs(40);													 
	} 
} 


//*TC2 initial sub function<<=================================================
/*
	本程序示例：
	TC2_Mode_Timer:8bit-定时器(可自动装载)
	TC2_Mode_BUZ:BUZ输出;
	TC2_Mode_PWM:PWM输出;
*/
void TC2_Init(unsigned char mode) 
{
	if(mode == TC2_Mode_Timer)
	{
		/*TC2_Mode_Timer*/
		
		//TC2C:定时/计数器 2 的 8 位数据
		TC2C = 0x56;
		
		//TC2R:定时/计数器 2 自动装载位
		TC2R = 0x56;
		
		PWMS = 0x00;	//---- 0000
						//Bit0:PWMS0：PWM0输出端口选择
							//0-P54输出PWM0（前提PWMS1=0）
							//1-P41输出PWM0
						//Bit1:PWMS2：PWM2输出端口选择
							//0-P01输出PWM2
							//1-P40输出PWM2(前提PWMS3=0)
						//Bit2&Bit3:PWM3输出端口选择
							//00：P44输出PWM3 
							//01：P40输出PWM3 
							//10：P54输出PWM3 
							//11：P54和P40同时输出PWM3
							
		//T0M:TC0、TC1 和 TC2 的时钟源选择及绿色模式唤醒寄存器				
		T0M  = 0x00;	//---0 000-
						//Bit1:TC0GN-TC0 绿色模式功能唤醒控制
							//0-DIS，1-EN
						//Bit2:TC0X8-TC0 内部时钟选择控制位
							//0-TC0 内部时钟来至 FCPU，TC0RATE=FCPU/2~FCPU/256
							//1-TC0 内部时钟来至 FHOSC，TC0RATE=FOSC/1~FOSC/128
						//Bit3:TC1X8-TC1 内部时钟选择控制位
							//0-TC1 内部时钟来至 FCPU，TC0RATE=FCPU/2~FCPU/256
							//1-TC1 内部时钟来至 FHOSC，TC0RATE=FOSC/1~FOSC/128
						//Bit4:TC2X8-TC2 内部时钟选择控制位
							//0-TC2 内部时钟来至 FCPU，TC0RATE=FCPU/2~FCPU/256
							//1-TC2 内部时钟来至 FHOSC，TC0RATE=FOSC/1~FOSC/128
							
		//TC2M:定时/计数器 2 模式控制位					
		TC2M = 0xf4;	//1111 0100
						//Bit0:PWMEN：PWM 输出控制
							//0-禁止 PWM 输出
							//1-使能 PWM 输出，PWM 输出占空比由 TC0OUT 和 ALOAD0 控制
						//Bit1:TCOUT：TC 超时输出信号控制。仅当 PWMEN = 0 时有效
							//0-禁止，P5.4 或者 P5.3 或者 P0.1 作为输入/输出口
							//1-使能，P5.4 或者 P5.3 或者 P0.1 输出 TCOUT 信号。可用作驱动 Buzzer
						//Bit2:ALOAD:自动装载控制。仅当 PWMEN = 0 时有效
							//0-DIS,1-EN
						//Bit3:TnCKS:TC 时钟信号控制位
							//0-内部时钟（Fcpu 或 Fosc）
							//1-外部时钟，T0CK 或 T1CK 或 T2CK 输入
						//Bit4~Bit6:TPS[2:0]:TC 分频选择位
							//TPS[2:0]    	TCnX8=0    		 TCnX8=1
							//	000			Fcpu / 256		Fosc / 128
							//	001			Fcpu / 128		Fosc / 64
							//	010			Fcpu / 64		Fosc / 32
							//	011			Fcpu / 32		Fosc / 16
							//	100			Fcpu / 16		Fosc / 8
							//	101			Fcpu / 8		Fosc / 4
							//	110			Fcpu / 4		Fosc / 2
							//	111			Fcpu / 2		Fosc / 1
						//Bit7:TR：TC 启动控制位
							//0-DIS,1-EN	
		
		
		//TC2IF:TC2 中断请求标志
		FTC2IF = 0;		//0-DIS,1-EN
		
		//FTC2IEN:TC2 中断控制位
		FTC2IEN = 1;	//0-DIS,1-EN
		
		//FGIE:全局中断控制位
		FGIE = 1;		//0-DIS,1-EN
	}
	else if(mode == TC2_Mode_BUZ)
	{
		/*TC2_Mode_BUZ**P01**/
		
		//TC2C:定时/计数器 2 的 8 位数据
		TC2C = 0x00;
		
		//TC2R:定时/计数器 2 自动装载位
		TC2R = 0x00;
		
		PWMS = 0x00;	//---- 0000
						//Bit0:PWMS0：PWM0输出端口选择
							//0-P54输出PWM0（前提PWMS1=0）
							//1-P41输出PWM0
						//Bit1:PWMS2：PWM2输出端口选择
							//0-P01输出PWM2
							//1-P40输出PWM2(前提PWMS3=0)
						//Bit2&Bit3:PWM3输出端口选择
							//00：P44输出PWM3 
							//01：P40输出PWM3 
							//10：P54输出PWM3 
							//11：P54和P40同时输出PWM3
							
		//T0M:TC0、TC1 和 TC2 的时钟源选择及绿色模式唤醒寄存器					
		T0M  = 0x00;	//---0 000-
						//Bit1:TC0GN-TC0 绿色模式功能唤醒控制
							//0-DIS，1-EN
						//Bit2:TC0X8-TC0 内部时钟选择控制位
							//0-TC0 内部时钟来至 FCPU，TC0RATE=FCPU/2~FCPU/256
							//1-TC0 内部时钟来至 FHOSC，TC0RATE=FOSC/1~FOSC/128
						//Bit3:TC1X8-TC1 内部时钟选择控制位
							//0-TC1 内部时钟来至 FCPU，TC0RATE=FCPU/2~FCPU/256
							//1-TC1 内部时钟来至 FHOSC，TC0RATE=FOSC/1~FOSC/128
						//Bit4:TC2X8-TC2 内部时钟选择控制位
							//0-TC2 内部时钟来至 FCPU，TC0RATE=FCPU/2~FCPU/256
							//1-TC2 内部时钟来至 FHOSC，TC0RATE=FOSC/1~FOSC/128
							
		//TC2M:定时/计数器 2 模式控制位					
		TC2M = 0xe2;	//1110 0010-BUZ-P01 
						//Bit0:PWMEN：PWM 输出控制
							//0-禁止 PWM 输出
							//1-使能 PWM 输出，PWM 输出占空比由 TC0OUT 和 ALOAD0 控制
						//Bit1:TCOUT：TC 超时输出信号控制。仅当 PWMEN = 0 时有效
							//0-禁止，P5.4 或者 P5.3 或者 P0.1 作为输入/输出口
							//1-使能，P5.4 或者 P5.3 或者 P0.1 输出 TCOUT 信号。可用作驱动 Buzzer
						//Bit2:ALOAD:自动装载控制。仅当 PWMEN = 0 时有效
							//0-DIS,1-EN
						//Bit3:TnCKS:TC 时钟信号控制位
							//0-内部时钟（Fcpu 或 Fosc）
							//1-外部时钟，T0CK 或 T1CK 或 T2CK 输入
						//Bit4~Bit6:TPS[2:0]:TC 分频选择位
							//TPS[2:0]    	TCnX8=0    		 TCnX8=1
							//	000			Fcpu / 256		Fosc / 128
							//	001			Fcpu / 128		Fosc / 64
							//	010			Fcpu / 64		Fosc / 32
							//	011			Fcpu / 32		Fosc / 16
							//	100			Fcpu / 16		Fosc / 8
							//	101			Fcpu / 8		Fosc / 4
							//	110			Fcpu / 4		Fosc / 2
							//	111			Fcpu / 2		Fosc / 1
						//Bit7:TR：TC 启动控制位
							//0-DIS,1-EN
														
		//TC2IF:TC2 中断请求标志
		FTC2IF = 0;		//0-DIS,1-EN
		
		//FTC2IEN:TC2 中断控制位
		FTC2IEN = 1;	//0-DIS,1-EN
		
		//FGIE:全局中断控制位
		FGIE = 1;		//0-DIS,1-EN		
	}
	else if(mode == TC2_Mode_PWM)
	{
		/*TC2_Mode_PWM*/
	
		//TC2C:定时/计数器 2 的 8 位数据
		TC2C = 0x00;
		
		//TC2R:定时/计数器 2 自动装载位
		TC2R = 0x1f;
		
		PWMS = 0x00;	//---- 0000:P01-
						//Bit0:PWMS0：PWM0输出端口选择
							//0-P54输出PWM0（前提PWMS1=0）
							//1-P41输出PWM0
						//Bit1:PWMS2：PWM2输出端口选择
							//0-P01输出PWM2
							//1-P40输出PWM2(前提PWMS3=0)
						//Bit2&Bit3:PWM3输出端口选择
							//00：P44输出PWM3 
							//01：P40输出PWM3 
							//10：P54输出PWM3 
							//11：P54和P40同时输出PWM3
							
		//T0M:TC0、TC1 和 TC2 的时钟源选择及绿色模式唤醒寄存器					
		T0M  = 0x00;	//---0 000-
						//Bit1:TC0GN-TC0 绿色模式功能唤醒控制
							//0-DIS，1-EN
						//Bit2:TC0X8-TC0 内部时钟选择控制位
							//0-TC0 内部时钟来至 FCPU，TC0RATE=FCPU/2~FCPU/256
							//1-TC0 内部时钟来至 FHOSC，TC0RATE=FOSC/1~FOSC/128
						//Bit3:TC1X8-TC1 内部时钟选择控制位
							//0-TC1 内部时钟来至 FCPU，TC0RATE=FCPU/2~FCPU/256
							//1-TC1 内部时钟来至 FHOSC，TC0RATE=FOSC/1~FOSC/128
						//Bit4:TC2X8-TC2 内部时钟选择控制位
							//0-TC2 内部时钟来至 FCPU，TC0RATE=FCPU/2~FCPU/256
							//1-TC2 内部时钟来至 FHOSC，TC0RATE=FOSC/1~FOSC/128
		
		//TC2M:定时/计数器 2 模式控制位
		TC2M = 0xe1;	//1110 0001:pwm:256-level
						//Bit0:PWMEN：PWM 输出控制
							//0-禁止 PWM 输出
							//1-使能 PWM 输出，PWM 输出占空比由 TC0OUT 和 ALOAD0 控制
						//Bit1:TCOUT：TC 超时输出信号控制。仅当 PWMEN = 0 时有效
							//0-禁止，P5.4 或者 P5.3 或者 P0.1 作为输入/输出口
							//1-使能，P5.4 或者 P5.3 或者 P0.1 输出 TCOUT 信号。可用作驱动 Buzzer
						//Bit2:ALOAD:自动装载控制。仅当 PWMEN = 0 时有效
							//0-DIS,1-EN
						//Bit3:TnCKS:TC 时钟信号控制位
							//0-内部时钟（Fcpu 或 Fosc）
							//1-外部时钟，T0CK 或 T1CK 或 T2CK 输入
						//Bit4~Bit6:TPS[2:0]:TC 分频选择位
							//TPS[2:0]    	TCnX8=0    		 TCnX8=1
							//	000			Fcpu / 256		Fosc / 128
							//	001			Fcpu / 128		Fosc / 64
							//	010			Fcpu / 64		Fosc / 32
							//	011			Fcpu / 32		Fosc / 16
							//	100			Fcpu / 16		Fosc / 8
							//	101			Fcpu / 8		Fosc / 4
							//	110			Fcpu / 4		Fosc / 2
							//	111			Fcpu / 2		Fosc / 1
						//Bit7:TR：TC 启动控制位
							//0-DIS,1-EN
							
		//TC2IF:TC2 中断请求标志
		FTC2IF = 0;		//0-DIS,1-EN
		
		//FTC2IEN:TC2 中断控制位
		FTC2IEN = 1;	//0-DIS,1-EN
		
		//FGIE:全局中断控制位
		FGIE = 1;		//0-DIS,1-EN		
	}
}


/***************************************************************
函数名：RAM_CLR
传参：
返回值：
功能：清—RAM,0~5f可间接寻址
引脚：
***************************************************************/
void RAM_CLR(void)
{
	__asm
	{
			B0MOV 	Y, #0
			B0MOV	Z, #5FH
		CLR_RAM:
			CLR		@YZ
			DECMS	Z
			JMP		CLR_RAM
			CLR		@YZ
	}
}


/*Gpio initial sub function<<=================================================
;-------初始化IO--P0M P4M P5M------------------ 
;PnM:0-InPut ;1-OutPut 
;PnUR:0-DisUpPull;1-EnUpPull
Gpio initial sub function<<==================================================*/
void GpioInit(void) 
{
	//P0:P0端口寄存器
	P0=0X00;					//---0 0000
								//0-L , 1-H
								
	//P0UR:P0端口上拉寄存器
	P0UR=0X00;					//---0 0000
								//0-DIS, 1-EN
								
	//P0M:P0端口模式控制寄存器						
	P0M = 0XFF;					//---1 1111
								//0-IN,1-OUT
								
	//P4:P4端口寄存器							
	P4=0X00;					//---0 0000
								//0-L , 1-H
								
	//P4UR:P4端口上拉寄存器							
	P4UR=0X00;					//---0 0000
								//0-DIS, 1-EN
								
	//P4M:P4端口模式控制寄存器							
	P4M = 0XFF;					//---1 1111
								//0-IN,1-OUT
								
	//P5:P5端口寄存器						
	P5=0X00;					//---0 0---
								//0-L , 1-H
								
	//P5UR:P5端口上拉寄存器
	P5UR=0X00;					//---0 0---
	
	//P5M:P5端口模式控制寄存器
	P5M = 0XFF; 				//---1 1---
								//0-IN,1-OUT
 
} 
 


/***************************************************************
函数名：DELAY
***************************************************************/
void DelayUs(unsigned char delayUs)
{
	while(delayUs--);
}

