#include "H/Function_Init.H" 
#include "ZCD_Option_EW.h"
#if (Test == 11)

/**************************************************
*函数名称：void ZCD_NegativeInputOption(void) 
*函数功能：负端输入初始化
*入口参数：void
*出口参数：void
**************************************************/
void ZCD_NegativeInputOption(void)
{
	ZOCINX &= ~0xC0;
	ZOCINX |= 0x40;  //选择ZCD
  ZOCCON = 0x00;
	ZOCCFG = 0x00;
	
	ZOCCFG &= ~0x80;  //负端输入信号

	ZOCCFG |=  0 << 6;//过零检测输出反相控制位，输出不反相
	ZOCCFG |=  1 << 5;	//过零检测输出使能位；过零方波信号可通过管脚输出
	
	ZOCCFG |=  1 << 4;//使能ZCD延时完成中断
	ZOCCFG |=  1 << 3;//使能ZCD下降沿中断
	ZOCCFG |=  1 << 2;//使能ZCD上升沿中断
	
	
	ZOCINX &= ~0x10; //过零信号数字输入通道不使能
  
}

/**************************************************
*函数名称：void ZCD_PositiveInputOption(void)
*函数功能：正端输入初始化
*入口参数：void
*出口参数：void
**************************************************/
void ZCD_PositiveInputOption(void)
{
	ZOCINX &= ~0xC0;
	ZOCINX |= 0x40;  //选择ZCD
  ZOCCON = 0x00;
	ZOCCFG = 0x00;
	
	ZOCCFG |= 0x80;  //正端输入信号

	//负端过零阈值电压可通过 ZCDRF[3:0]选择外接端口 ZCDN 或者内部基准 VDD 的 15 档分压之一
	ZOCCON |= 0x08;  //负端选择8/16VDD
	ZOCCFG |= 0x03;  //选择正端输入通道为ZCDP3


	ZOCCFG |=  0 << 6;//过零检测输出反相控制位，输出不反相
	ZOCCFG |=  1 << 5;	//过零检测输出使能位；过零方波信号可通过管脚输出
	
	ZOCCFG |=  1 << 4;//使能ZCD延时完成中断
	ZOCCFG |=  1 << 3;//使能ZCD下降沿中断
	ZOCCFG |=  1 << 2;//使能ZCD上升沿中断
	
	
	ZOCINX &= ~0x10; //过零信号数字输入通道不使能
  
}

/**************************************************
*函数名称：void ZCD_ZCDINInputOption(void)
*函数功能：ZCDIN输入初始化
*入口参数：void
*出口参数：void
**************************************************/
void ZCD_ZCDINInputOption(void)
{
  ZOCINX &= ~0xC0;
	ZOCINX |= 0x40;  //选择ZCD
  ZOCCON = 0x00;
	ZOCCFG = 0x00;

	ZOCCFG |=  0 << 6;//过零检测输出反相控制位，输出不反相
	ZOCCFG |=  1 << 5;	//过零检测输出使能位；过零方波信号可通过管脚输出
	
	ZOCCFG |=  1 << 4;//使能ZCD延时完成中断
	ZOCCFG |=  1 << 3;//使能ZCD下降沿中断
	ZOCCFG |=  1 << 2;//使能ZCD上升沿中断
	
	
	ZOCINX |= 0x10; //过零信号数字输入通道使能
	
}

unsigned int HardwareCycleValue;

/*****************************************************
*函数名称：void ZCDCMPOP_Test(void)
*函数功能：Uart测试
*入口参数：void
*出口参数：void
*****************************************************/
void ZCDCMPOP_Test(void)
{
	P2CON |= 0XFF;
	
	//负端输入
	ZCD_NegativeInputOption();
	ZCD_SetFilterTime(FilterTime_200us);  //滤波时间200us
	ZCD_DelayedTrigOption(0x64);   //上升沿延迟触发时间：50us * 0x64 = 5000us
	
	//正端输入，可开启钳位功能，若开启，负端需选择8/16 VDD
//	ZCD_PositiveInputOption();
//	ZCD_CLAMP_Cmd(ENABLE);  //开启钳位功能
//	ZCD_SetFilterTime(FilterTime_200us);
	
	//ZCDIN输入
//	ZCD_ZCDINInputOption();
//	ZCD_SetFilterTime(FilterTime_200us);
	
	ZOCCON |=  1 << 7	;//过零检测使能控制；打开 ZCD
	IE1 |= 0X40;		//ZCD中断
	EA=1;

	
	
/////模拟比较器模式
//	ZOCINX  = 0X90; //选择CMP，ZCDINEN使能，此时整形后的过零信号可由ZCDIN接入，CMP功能可以同时启用
//	ZOCCFG |= 0x10;//模拟比较器正端的输入为内部 1.2V 基准电压
//	ZOCCFG |=0x04;//上升沿中断
//	
//	ZOCCON |= 0X80;//打开CMP
//	
//	IE1 |= 0X20;		//CMP中断
//	EA=1;
/////_______________________________________________


/////运算放大器模式
//	ZOCINX  = 0XD0; //选择OP，ZCDINEN使能，此时整形后的过零信号可由ZCDIN接入，OP功能可以同时启用
//	ZOCCON |= 0X01;//OP输出到OP_O（外部引脚）
//	ZOCCON |= 0X80;//打开OP
/////_______________________________________________
	
	
	
	while(1)
	{
		if(ZCD_GetInputFreq() == 0)
		{
			P20=~P20;  //ZCD输入信号频率为50Hz
		}
		else
		{
			P21=~P21;  //ZCD输入信号频率为60Hz
		}
		
		if(ZCD_GetSTAFlagStatus() == STATE_ZCD_LOCK)
		{
			P22=~P22;  //ZCD处于LOCK状态
		}
		if(ZCD_GetSTAFlagStatus() == STATE_CALC_FREQ)
		{
			P23=~P23;  //ZCD处于计算频率过程
		}
		if(ZCD_GetSTAFlagStatus() == STATE_CALC_FREQ_DONE)
		{
			P24=~P24;  //ZCD频率计算过程完成
		}
		if(ZCD_GetSTAFlagStatus() == STATE_FIRST_ZERO_CROSS)
		{
			P25=~P25;  //ZCD处于第一过零点判断
		}
		if(ZCD_GetSTAFlagStatus() == STATE_PHASE_LOCK)
		{
			P26=~P26;  //ZCD处于锁相过程
		}
		
		HardwareCycleValue = ZCD_GetHardwareCycle();  //获取硬件周期，即输入信号的周期
	}
}

/*****************************************************
*函数名称：void CMPInt(void) interrupt 12
*函数功能：CMP中断函数
*入口参数：void
*出口参数：void
*****************************************************/
void CMPInt(void) interrupt 12
{
	if((ZOCCON&0x40)==0x40)//中断判断
	{
		P23=~P23;
		ZOCCON &= ~0x40;		
	}
}

/*****************************************************
*函数名称：void ZCDInt(void) interrupt 13
*函数功能：ZCD中断函数
*入口参数：void
*出口参数：void
*****************************************************/
void ZCDInt(void) interrupt 13
{
	if((ZOCCON&0x40)==0x40)//下降沿中断
	{
		ZOCCON &= ~0x40;		
	}
	if((ZOCCON&0x20)==0x20)//上升沿中断
	{
		ZOCCON&= ~0x20;
	}	
	if((ZOCCON&0x10)==0x10)//延迟完成中断
	{
		ZOCCON&= ~0x10;
	}	
}
#endif

