//*****************************************************   
//Copyright (c) 2021, 苏州华芯微电子股份有限公司
//All rights reserved                                 
//
//文件名称: HS16F3211_WAKEUP_IO_CHANGE
//摘    要: HS16F3211休眠，IO电平变化唤醒睡眠演示
//  		程序进入睡眠，PB7端口电平变化唤醒睡眠,
//          PB7设置为端口变化唤醒功能时，输入输出状态要配置为输入。注意，管脚不要悬空
//当前版本: 1.0                                      
//作    者: 华芯微MCU组
//完成日期: 2021.09.13
//*****************************************************   

#include 	<hs16f3211.h> 

//***********************宏定义*****************************
#define  unchar     unsigned char 
#define  unint      unsigned int
#define  unlong     unsigned long
#define  DemoPortOut	FPB0
#define  DemoPortOut1	FPB1

#define	NOP()		asm("NOP")    
#define	CLRWDT()	asm("clrwdt")    
#define	SLEEP()		asm("sleep")    



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

    PORTB = 0b00000000;	
    IOSTB = 0b10000000;	//PB输入输出 0-输出 1-输入
                        //PB口->全输出
                        
    PHCON = 0b01111111;	//输入状态下配置PB端口上拉
						//1111 1111 :1-DIS;0-EN                                                            
}


//**************中断处理******************
void interrupt ISR(void)	//空
{
   
}

/*-------------------------------------------------
 *  函数名：PB_WAKEUP_INIT
 *	功能：  PB端口输入状态变化均可唤醒睡眠 
 *          PB对应端口需要设置成输入(切记不让端口处于浮空输入状态)；
 *  输入：  无
 *  输出：  无
 *          PB口开启唤醒功能时，对应WUCON位设置为 1     //   PB7设置为变化唤醒  WUCON.7=1;
 --------------------------------------------------*/	
void PB_WAKEUP_INIT(void)  //PB7端口变化唤醒设置	
{
	IOSTB = 0b10000000;	//PB输入输出 0-输出 1-输入 对应端口配置为输入
	WUCON = 0b10000000;	//输入状态下配置PORTB输入状态变化/唤醒控制寄存器
						//对应PB口置1，设置对应的PB口变化检测功能
	                    //0000 0000	:1-EN;0=DIS                   
	                                                             
	FPBIF = 0;	        //PBIF: PB端口变化中断标志位，软件复位
	FPBIE = 1;	        //PBIE: PB端口变化中断使能位(1=EN,0=DIS)	
	                    //该位必须置1，否则无法唤醒睡眠
	                    
	FGIE  = 0;	        //GIE:全局中断使能位       //不管FGIE是否置1，PB端口变化都能唤醒睡眠     
	                    
}

/*-------------------------------------------------
 *  函数名：delay_ms
 *	功能：  写入参数 x,可以延时xMS
 *  输入参数：  x
 --------------------------------------------------*/	
void delay_ms(unint x)
{
	unint i,j;
	for(i=0;i<x;i++)
	{	
		for(j=0;j<140;j++);
	}
}


//****主函数****//
void main(void) 
{
    GPIO_Init();   //端口初始化
    PB_WAKEUP_INIT();//PB端口变化唤醒睡眠初始化
    while(1)
    {
	    NOP();    
		SLEEP();  	 
    }
}
