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

//当前版本: 1.0                                      
//作    者: 华芯微MCU组
//完成日期: 2025.08.7
//*****************************************************   
//Files include 
#include 	"hs16p1880.h" 		

 


//**所有中断统一入口，没有优先级区分，只能靠软件查询顺序排优先级***//
void interrupt myIsr(void)
{ 
	if(INTIF)//检查INT中断
	{
		INTIF = 0; 
		PORTB = PORTB^0X04;
		
	}
	if(INT1IF)//检查INT1中断
	{
		INT1IF = 0; 
		PORTB = PORTB^0X08;
		
	}
	
} 
//*********************************************************************** 
void WDT_Init(void)
{
	CLRWDT;
	 
//;option attentions 
	OPTION= 0b00000000; 
			//;Bit7：INT1EDG：外部中断1触发方式选择位（PB1）;0-falling edge, 1-rising edge
			//;Bit6：INTEDG：外部中断触发方式选择位（PB0）	;0-falling edge, 1-rising edge

	
//;PCON  
	PCON  = 0b10100000;		
			//;Bit7：WDTE: WDT（看门狗定时器）使能位	;0-DIS, 1-EN

			//;Bit5：LVREN: 低电压复位使能位			;0-DIS, 1-EN			
}
 
//****GPIO configuration****//
void sys_gpio_init(void)
{
	OPTION= 0b000000000; 
			//;Bit7：INT1EDG：外部中断1触发方式选择位（PB1）;0-falling edge, 1-rising edge
			//;Bit6：INTEDG：外部中断触发方式选择位（PB0）	;0-falling edge, 1-rising edge


	PCON  = 0b00100000;	 		
			//;Bit7：WDTE: WDT（看门狗定时器）使能位	;0-DIS, 1-EN
	
			//;Bit5：LVREN: 低电压复位使能位			;0-DIS, 1-EN
					
//PORTB //----------------------------------------------------------------------
	PORTB = 0b00000000;	//0000 0000 :PORTB数据寄存器
	TRISB = 0b00000011;	//0000 0011 :PORTB输入输出配置寄存器 (0-OUT;1-IN) 	
				//PB0 PB1输入 
				
	WUCON = 0b00000000;	//0000 0000	:PORTB变化中断唤醒寄存器 (1-EN;0=DIS)
	ODCON = 0b00000000;	//--00 0000 :PORTB开漏寄存器 (1-EN;0-DIS)
	PHCON = 0b11111100;	//1111 1100 :PORTB上拉寄存器 (1-DIS;0-EN)
				//PB0 PB1开上拉
	
	PDCON = 0b11111111;	//1111 ---- :bit7:4 PORTB3:0下拉寄存器;1-DIS;0-EN
				
	
	PDCON1= 0b11111111;	//---- --11 :bit1:0 PORTB5:4下拉寄存器;1-DIS;0-EN
	//----------------------------------------------------------------------
}



void System_Init(void)
{
	INTEN = 0B00000000;		  
					  //Bit7 GIE 使能全局中断     1-使能 0-禁止	
					  //Bit6 空 
					  //Bit5 INT1IE 使能外部中断1 1-使能 0-禁止
					  //Bit4 TP0IE 使能T2溢出中断  1-使能 0-禁止
					  //Bit3 TC0IE 使能T1溢出中断 1-使能 0-禁止
					  //Bit2 INTIE 使能外部中断0  1-使能 0-禁止
					  //Bit1 PBIE 使能端口变化中断1-使能 0-禁止 
					  //Bit0 空 
	INTFLAG=0B00000000;	
					  //Bit7 空	
					  //Bit6 空 
					  //Bit5 INT1IF 外部中断1标志位
					  //Bit4 TP0IF T2溢出中断标志位	
					  //Bit3 TC0IF TC1溢出中断标志位		
					  //Bit2 INTIF 外部中断0标志位		
					  //Bit1 PBIF PA/PB输入状态变化中断标志位	
					  //Bit0 空 

	INTEN1 = 0B00000000;	
			                  //Bit7 空	
					  //Bit6 空
					  //Bit5 空
					  //Bit4 空	
					  //Bit3 空	
					  //Bit2 空 
					  //Bit1 COMINTEN  端口比较器中断使能位
					  //Bit0 空 		
	INTFLAG1=0B00000000;	
					  //Bit7 空	
					  //Bit6 空
					  //Bit5 空
					  //Bit4 空	
					  //Bit3 空	
					  //Bit2 空 
					  //Bit1 COMINTF 端口比较器翻转标志位， 软件复位
					  //Bit0 空 
}


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

	OPTION= 0b01000000; //Bit7 INT1EDG, 外部中断1触发方式 0 INT1引脚下降沿触发
                        //Bit6 INTEDG, 外部中断 触发方式 1 INT引脚上升沿触发
  

	PCON = 0b10100000;  //Bit7 FWDTE,WDT使能位    1 使能WDT
                          
                        //Bit5 FLVDTE,LVDT使能位  1使能LVDT 

//INTIF: 外部中断标志位，软件复位
	INTIF = 0;	 
	
//INTIE: 外部中断使能位(1=EN,0=DIS)	
	INTIE = 1;	 
	
//GIE:全局中断使能位
	GIE  = 1;	 

}


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

	OPTION= 0b01000000;  
			//Bit7 INT1EDG, 外部中断1触发方式 0 INT1引脚下降沿触发
                        //Bit6 INTEDG,  外部中断 触发方式 1 INT引脚上升沿触发
         

	PCON  = 0b10100000;	 
			//Bit7 FWDTE,WDT使能位    1 使能WDT
                      
                        //Bit5 FLVDTE,LVDT使能位  1使能LVDT 
//INT1IF: 外部中断标志位，软件复位
	INT1IF = 0;	 
	
//INT1IE: 外部中断使能位(1=EN,0=DIS)	
	INT1IE = 1;	 
	
//GIE:全局中断使能位
	GIE  = 1;	 
}

//****************************************************  
//清除所有ram 
//C中嵌入ASM，指令操作特殊寄存器前面需要加下划线“_”;
//****************************************************    
void clr_all_ram(void)
{
	STATUS &= 0x1F;
#asm  
	MOVLW	0X3F
	MOVWF	040H
	MOVLW	0X7F
	MOVWF	_FSR
	
BANK0_RAM_CLR_LOOP:	
	CLRF	_INDF
	DECF	_FSR,F
	DECFSZ	040H,F
	GOTO	BANK0_RAM_CLR_LOOP		
#endasm	   	   
}

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


//****delay function****// 
//;Fcpu=1MHz;DelayUs = 11+7x     
void DelayUs(unsigned char delayUs)
{      
	while(delayUs--);    
} 


void main(void) 
{
	sys_gpio_init(); //系统寄存器和GPIO配置	
	WDT_Init();	 //看门狗初始化
	System_Init();	 //系统初始化
//	EXIT_INT_INIT();//INT 初始化
	EXIT1_INT_INIT();//INT1初始化
	clr_all_ram();   //清所有ram
	CLRWDT;	   	 //清看门狗
	while(1)
	{		
	  CLRWDT;	//清看门狗
	   			
	} 
}
