//*****************************************************   
//Copyright (c) 2021, 苏州华芯微电子股份有限公司
//All rights reserved                                 
//
//文件名称: HS16F3211-COMP
//摘    要: HS16F3211-COMP 比较器内部基准比较
//  		VDD比较器的-端输入 比较器+端内部基准1.25v
//          VDD大于4.41V DemoPortOut输出低 反之输出高
//当前版本: 1.0                                      
//作    者: 华芯微MCU组
//完成日期: 2021.09.01
//*****************************************************   

#include 	<hs16f3211.h> 

//***********************宏定义*****************************
#define  unchar     unsigned char 
#define  unint      unsigned int
#define  unlong     unsigned long

#define	CLRWDT()	asm("clrwdt")

#define  DemoPortOut	FPB5
/*-------------------------------------------------
 *  函数名：GPIO_Init
 *	功能：  GPIO设置
 *  输入：  无
 *  输出：  无
 --------------------------------------------------*/	
void GPIO_Init(void) 
{
	OPTION= 0b00000010; //Bit7 INT1EDG, 外部中断1触发方式 0 INT1引脚下降沿触发
                        //Bit6 INTEDG, 外部中断 触发方式 0 INT引脚下降沿触发
                        //Bit5 T0CS, TMR0时钟源选择位 0 内部指令时钟
                        //Bit4 T0SE, TMR0时钟源边沿选择位 0 T0CKI引脚下降沿触发计数
                        //Bit3 PSA, 预分频分配位 0 预分频器分配给TMR0
                        //Bit2:0 PS[2:0], 预分频配置 010 '8分频
    
    PORTA = 0b00000000;	
    IOSTA = 0b00000000;	//PA输入输出 0-输出 1-输入
                        //PA口->全输出

    PORTB = 0b00000000;	
    IOSTB = 0b00000000;	//PB输入输出 0-输出 1-输入
                        //PB口->全输出
}


//**************中断处理**********************************
void interrupt ISR(void)
{
    //比较器翻转中断处理**********************
	if(FCOMINTF)    
	{
		FCOMINTF = 0;   //清除比较器翻转中断标记位
	}
}

/*-------------------------------------------------
 *  函数名：COMP_Init
 *	功能：  COMP_Init比较器初始化 选择内部1.25V作为正端
 *  输入：  无
 *  输出：  无
 --------------------------------------------------*/	
void COMP_Init(void) 
{
    /*8bit定时器中断：1.024ms 
    Config配置区域：4Mhz 2'
    */
    CMPM = 0x11;	//Bit6:5 CPIINS[1:0], 比较器负端输入选择 00 VDD作为比较器负端输入
                    //Bit4 XRVSEL, 档位选择 1 第二组
                    //Bit3:0 VRS<3:0>, 负端电压档位选择 001 4.41v
    
    CMPCON= 0xD4;	//Bit7 CMPEN, CMP使能位 1 使能比较器
                    //Bit6 COMIF, 比较器转换标志 0
                    //Bit5 FTCKS, 输出使能滤波时钟选择 1 低速时钟
                    //Bit4 CODEB, 输出滤波 1 使能3个时钟延迟
                    //Bit3 CPEN+, 比较器+端 0 禁止
                    //Bit2 CVEN+, 比较器+端 1 使能接内部基准1.25v
                    //Bit1 COPOL, 比较器输出极性选择 0 不取反
    
    FGIE  = 0;	//关全局中断
}

/*-------------------------------------------------
 *  函数名：DelayMs
 *	功能：  软件延时函数
 *  输入：  延时时间 单位 MS 存在一定的误差
 *  输出：  无
 --------------------------------------------------*/	
void DelayMs(unsigned char delayMs)
{
	unsigned char delay_us;
	while(delayMs--)
	{
		delay_us=247;
		while(delay_us--);
	}
}

//****主函数****//
void main(void) 
{
    GPIO_Init();
    COMP_Init();
    DelayMs(1);
    while(1)
    {
        CLRWDT();
    	if(FCMPIF){ //VDD小于4.41V
            DemoPortOut=1;
        }else{
            DemoPortOut=0;
        }
    }
}
