#ifndef _STOP_C_
#define _STOP_C_
/*********************************************************************************************************************/
#include "include/ca51f_config.h"		
#include "include/ca51f2sfr.h"
#include "include/ca51f2xsfr.h"
#include "include/gpiodef_f2.h"
#include "include/system_clock.h"

#include "include/uart.h"
#include "include/delay.h"
#include <intrins.h>
/*********************************************************************************************************************
	STOP功能函数
*********************************************************************************************************************/

extern bit int0_flag,int1_flag,int2_flag,int3_flag,int4_flag,int5_flag,int6_flag,int7_flag,int8_flag,int9_flag;

//扫描按键定义
//#define KEY_INPUT		P05F=INPUT|PU_EN
//#define KEY_DAT			P05

/***********************************************************************************
函数名  ： EnterSleepMode										 	
功能描述： STOP功能函数。在休眠模式下，不关闭看门狗功能，利用RTC定时器，以125毫秒为时间间隔，定时唤醒CPU以执行喂狗操作。
输入参数： 无
返回值  ： 无
***********************************************************************************/
void EnterSleepMode(void)
{
	bit IE_EA;

/*
	说明：在进入STOP模式之前，应关闭相应的外设电路。对于未使用到的IO端口，尽量避免使其处于悬浮状态，建议设置为高阻态并加上拉电阻。	
*/
	
#if (SYSCLK_SRC == PLL)	
	Sys_Clk_Set_IRCH();		//如果系统时钟为PLL，在进入STOP之前要把系统时钟切换回IRCH
	PLLCON = 0;				//关闭PLL
#endif
#ifdef LVD_RST_ENABLE
	LVDCON = 0;				//关闭LVD
#endif
	I2CCON = 0;				//关闭I2C，否则无法关闭主时钟
	CKCON = 0;				//所有时钟关闭
	PWCON &= ~0x08;			//设置LDO进入低功率模式	
	MECON |= (1<<6); 		//设置FLASH进入深度睡眠状态
	
	while(1)
	{
		if((STPSTH|STPSTL) == 0)		//如果有中断未响应,等待中断被响应
		{
			WDFLG = 0xA5;				//喂狗：在休眠模式下，不关闭看门狗功能，利用RTC定时器，以125毫秒为时间间隔，定时唤醒CPU以执行喂狗操作。
			IE_EA = EA; 				//保存全局中断使能位状态
			EA = 0;						
			PCON = (PCON&0x84) | 0x02;	//进入STOP模式
			_nop_();
			_nop_();
			_nop_();	
			EA = IE_EA; 				//恢复原全局中断开关状态	
			_nop_();
			_nop_();
			_nop_();		
		}
		
		if(int0_flag || int1_flag || int2_flag || int3_flag || int4_flag || int5_flag || int6_flag|| int7_flag|| int8_flag || int9_flag)			
		{
			break;
		}
	/*		
		KEY_INPUT;	
		if(KEY_DAT == 0)				//检测扫描按键
		{
			break;
		}
	*/
	}	
	PWCON |= 0x08;						//退出STOP模式后，把LDO设回高功率模式	
#ifdef LVD_RST_ENABLE
	LVDCON = 0xE1;						//设置LVD复位电压为2V
#endif
#if (SYSCLK_SRC == PLL)
	Sys_Clk_Set_PLL(PLL_Multiple);		//系统时钟切换回PLL
#endif	
}
/*********************************************************************************************************************/
#endif
