/******************************************************************************
;  *   	@MCU				 : MC51F003A4
;  *   	@Create Date         : 2021.10.11
;  *   	@Author/Corporation  : Martin/SinoMCU
;  *   	@晟矽微技术支持QQ 	 : 2048615934
;  *    @晟矽微官网		     : http://www.sinomcu.com/
;  *   	@Copyright           : 2020 SINOMCU Corporation,All Rights Reserved.
;  *----------------------Abstract Description---------------------------------
;  *			          定义                              		
******************************************************************************/
#include "TIMER.h"

/************************************************
;  *    @Function Name       : Timer0_Init
;  *    @Description         : T0配置
;  *    @IN_Parameter      	 :
;  *    @Return parameter    :
;  ***********************************************/
void Timer0_Init(void)
{
#if (TIMER_MODE == 0) //T0方式0  13位计时器/定时器
	TMOD = 0x00;	  //内部时钟  方式0
	TCON = 0x00;
	TCON1 = 0x03; //FT0=FSYS/16	禁止溢出IO翻转
	TR0 = 0;	  //无论是读或者写 TLx/THx 的值，必须先停止(TR0=0;)
	TL0 = 0x11;   //低5位  高8位	1ms 8192-1000=7192 
	TH0 = 0xE0;   //读写时，先读写L，在H

	IP = 0x02;
	IPH = 0x00; //中断等级1(高)
	T0IE = 1;
	EA = 1;
	TR0 = 1;
#endif
#if (TIMER_MODE == 1) //T0方式1  16位计时器/定时器
	TMOD = 0x01;	  //内部时钟  方式1
	TCON = 0x00;
	TCON1 = 0x03; //FT0=FSYS/16	禁止溢出IO翻转
	TR0 = 0;	  //无论是读或者写 TLx/THx 的值，必须先停止(TR0=0;)
	TL0 = 0x18;   //	1ms
	TH0 = 0xFC;   //读写时，先读写L，在H

	IP = 0x02;
	IPH = 0x00; //中断等级1(高)
	T0IE = 1;
	EA = 1;
	TR0 = 1;
#endif
#if (TIMER_MODE == 2) //T0方式2  8位重载计时器/定时器
	TMOD = 0x02;	  //内部时钟  方式2
	TCON = 0x00;
	TCON1 = 0x03;	//FT0=FSYS/16	禁止溢出IO翻转
	TR0 = 0;		 //无论是读或者写 TLx/THx 的值，必须先停止(TR0=0;)
	TL0 = 256 - 200; //	 200us
	TH0 = 256 - 200;

	IP = 0x02;
	IPH = 0x00; //中断等级1(高)
	T0IE = 1;
	EA = 1;
	TR0 = 1;
#endif
#if (TIMER_MODE == 3)	//T0方式3	两个8位计数器/定时器(只限于T0)
	TMOD = 0x03;	  //内部时钟  方式3
	TCON = 0x00;
	TCON1 = 0x33;	//FT0/1=FSYS/16	禁止溢出IO翻转
	TR0 = 0;		 //无论是读或者写 TLx/THx 的值，必须先停止(TRx=0;)
	TR1 = 0;	
	TL0 = 256 - 200; 	//	 200us
	TH0 = 256 - 100;	//	 100us

	IP = 0x02;
	IPH = 0x00; //T0中断等级1(高)  TL中断等级0(低)

	T0IE = 1;
	T1IE = 1;
	EA = 1;
	TR0 = 1;
	TR1 = 1;
#endif
}

void Timer0_ISR(void) interrupt T0_IRQn
{
	SFR_INTERRUPT_BUFF_BIT_T0 = SFRSL0;		//进中断缓存SFR
	
#if (TIMER_MODE == 0)
	SLK_SFR0();
	TR0 = 0;	//无论是读或者写 TLx/THx 的值，必须先停止(TR0=0;)
	TL0 = 0x11; //低5位   高8位
	TH0 = 0xE0; //读写时，先读写L，在H
	LED1 = !LED1;
	TR0 = 1;
#endif
#if (TIMER_MODE == 1)
	SLK_SFR0();
	TR0 = 0; //无论是读或者写 TLx/THx 的值，必须先停止(TR0=0;)
	TL0 = 0x18;
	TH0 = 0xFC; //读写时，先读写L，在H
	LED1 = !LED1;
	TR0 = 1;
#endif
#if (TIMER_MODE == 2)
	SLK_SFR0();
	LED1 = !LED1;
#endif
#if (TIMER_MODE == 3)
	SLK_SFR0();
	TR0 = 0;		 //无论是读或者写 TLx/THx 的值，必须先停止(TRx=0;)	
	TL0 = 256 - 200; 	//	 200us
	LED1 = !LED1;
	TR0 = 1;
#endif

	SFRSL0 = SFR_INTERRUPT_BUFF_BIT_T0;		//退出中断还原SFR
}

void Timer1_ISR(void) interrupt T1_IRQn
{
	SFR_INTERRUPT_BUFF_BIT_T1 = SFRSL0;		//进中断缓存SFR
	
#if (TIMER_MODE == 3)
	SLK_SFR0();	
	TR1 = 0;			//无论是读或者写 TLx/THx 的值，必须先停止(TRx=0;)
	TH0 = 256 - 100;	//	 100us
	LED2 = !LED2;
	TR1 = 1;
#endif
	
	SFRSL0 = SFR_INTERRUPT_BUFF_BIT_T1;		//退出中断还原SFR
}

/**************************** end of file *********************************************/







