//*****************************************************   
//Copyright (c) 2021, 苏州华芯微电子股份有限公司
//All rights reserved                                 
//
//文件名称: HS16F3211-INT/INT1 
//摘    要: HS16F3211-INT/INT1功能演示
//  	    INT触发，有两个外部中断
//INT对应管脚PB0；设置成输入带上拉（设置成输入固定电平，避免浮空输入）
//INT1对应管脚PB1；设置成输入带上拉（设置成输入固定电平，避免浮空输入）


//当前版本: 1.0                                      
//作    者: 华芯微MCU组
//完成日期: 2021.09.18
//*****************************************************   
#include 	<hs16f3211.h> 
//***********************宏定义*****************************
#define  unchar     unsigned char 
#define  unint      unsigned int
#define  unlong     unsigned long
#define	CLRWDT()	asm("clrwdt")

/*-------------------------------------------------
 *  函数名：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, 预分频分配位 1 预分频器分配给TMR0
                        //Bit2:0 PS[2:0], 预分频配置 010 '8分频
    
    
    PCON = 0b10100000;  //Bit7 FWDTE,WDT使能位    1 使能WDT
                        //Bit6 FEIS,IOB0/INT引脚定义位   0 IOB0引脚被选择，屏蔽INT功能    
                        //Bit5 FLVDTE,LVDT使能位  1使能LVDT      
    
    
    
    PORTA = 0b00000000;	
    IOSTA = 0b00000000;	//PA配置输入输出 0-输出 1-输入
                        //PA口->全输出

    PORTB = 0b00000000;	
    IOSTB = 0b00000010;	//PB配置输入输出 0-输出 1-输入
                        //PB1 INT1输入 
			
    PHCON = 0b11111101; //PB配置上拉     0-使能 1-禁止		
		        //PB1开上拉
}

//****中断函数****//
/*
PB端口方波
*/
void interrupt myIsr(void)    
{ 
	if(FINT1IF) 
	{ 
		FINT1IF = 0; 	 
		PORTB = PORTB^0xfc;	
	} 
	if(FINTIF) 
	{ 
		FINTIF = 0; 	 
		PORTB = PORTB^0xfc;	
	} 
} 

//****EXIT_INT设置****//
//PB0-外部中断引脚-PB0：设置成输入带上拉
void EXIT_INT_INIT(void)
{

	OPTION= 0b01000001; //Bit7 INT1EDG, 外部中断1触发方式 0 INT1引脚下降沿触发
                        //Bit6 INTEDG, 外部中断 触发方式 1 INT引脚上降沿触发
                        //Bit5 T0CS, TMR0时钟源选择位 0 内部指令时钟
                        //Bit4 T0SE, TMR0时钟源边沿选择位 0 T0CKI引脚下降沿触发计数
                        //Bit3 PSA, 预分频分配位 1 预分频器分配给TMR0
                        //Bit2:0 PS[2:0], 预分频配置 001 '4分频

	PCON = 0b11100000;  //Bit7 FWDTE,WDT使能位    1 使能WDT
                        //Bit6 FEIS,IOB0/INT引脚定义位   1 IOB0 INT功能    
                        //Bit5 FLVDTE,LVDT使能位  1使能LVDT 

//INTIF: 外部中断标志位，软件复位
	FINTIF = 0;	//INTFLAG.bit2
	
//INTIE: 外部中断使能位(1=EN,0=DIS)	
	FINTIE = 1;	//INTEN.bit2
	
//GIE:全局中断使能位
	FGIE  = 1;	//INTEN.bit7

}

//****EXIT1_INT设置****//
//PB1-外部中断引脚INT1-PB1：设置成输入带上拉 
void EXIT1_INT_INIT(void)
{

	OPTION= 0b10000001;  
	

	PCON  = 0b10100000;	 

//INTIF: 外部中断标志位，软件复位
	FINT1IF = 0;	//INTFLAG.bit2
	
//INTIE: 外部中断使能位(1=EN,0=DIS)	
	FINT1IE = 1;	//INTEN.bit2
	
//GIE:全局中断使能位
	FGIE  = 1;	//INTEN.bit7
}

//****主函数****// 
void main(void) 
{
    GPIO_Init();
    //EXIT_INT_INIT();
    EXIT1_INT_INIT();    
    while(1)  
    { 
      CLRWDT();	
    }    
}
