
#ifndef _MAIN_C_
#define _MAIN_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/lcd_led.h"
#include "include/delay.h"
#include "include/wdt.h"
#include "include/ext_int.h"
#include <intrins.h>
/*********************************************************************************************************************			
	本例程实现4com*9seg、1/3bias LCD显示功能，LCD时钟设置为XOSCL或IRCL，实现LCD最小电流模式。
	
	重要提示：
	若产品在进入休眠状态前需关闭LCD显示，请在关闭LCD功能前，将所设置的COM脚和SEG脚设置为输出模式并输出低电平。此举可有效避免在关闭LCD功能时，LCD屏幕出现拖影现象。
*********************************************************************************************************************/			

unsigned char EnterStopScanTimer;
unsigned char xdata Feed_Wdt_Flag;
void RTC_Init(void);
void EnterSleepMode(void);
void LCD_Off(void);
void LCD_Init(void);

/***********************************************************************************
函数名  ： Mcu_FeedDog										 	
功能描述： 看门狗喂狗函数，(Feed_Wdt_Flag == 0xA5)条件不可取消
输入参数： 无
返回值  ： 无
***********************************************************************************/
void Mcu_FeedDog(void)
{
	if(Feed_Wdt_Flag == 0xA5)
	{
		WDFLG = 0xA5;
		Feed_Wdt_Flag = 0x00;
	}			
}

/***********************************************************************************
函数名  ： WDT_Init										 	
功能描述： 看门狗初始化
输入参数： 无
返回值  ： 无
***********************************************************************************/
void WDT_Init(void)	//备注：需默认开启看门狗功能，并将其设置为复位模式
{
#if (RTC_CLK_SELECT == IRCL)
	CKCON |= ILCKE;									//使能IRCL
	WDCON  = WDTS(WDTS_IRCL) | WDRE(WDRE_reset);   	//设置看门狗时钟源为ILCKE，模式为复位模式
#elif (RTC_CLK_SELECT == XOSCL)	
	P72F = P72_XOSCL_IN_SETTING;					//设置P72为晶振引脚
	P71F = P71_XOSCL_OUT_SETTING;					//设置P71为晶振引脚
	CKCON |= XLCKE;									//使能XSOCL
	while(!(CKCON & XLSTA));						//等待XSOCL稳定
	WDCON  = WDTS(WDTS_XOSCL) | WDRE(WDRE_reset);   //设置看门狗时钟源为XOSCL，模式为复位模式
#endif
	WDVTHH = 0;										//看门狗复位阈值高八位设置 当前值为5s	
	WDVTHL = 75;									//看门狗复位阈值低八位设置
	WDFLG = 0xA5;		

	Feed_Wdt_Flag = 0xA5;
}

/*********************************************************************************************************************/

/***********************************************************************************
函数名  ： SleepEnterUserCode										 	
功能描述： 用户自定义函数，在MCU进入休眠状态前，需关闭的外围设，可放在此函数中操作。
输入参数： 无
返回值  ： 无
***********************************************************************************/
void SleepEnterUserCode(void)									
{
#ifdef HAVE_EXINT0_EN
	Ext_Int0_Init();
#endif	
#ifdef HAVE_EXINT1_EN		
	Ext_Int1_Init();
#endif
#ifdef HAVE_EXINT2_EN
	Ext_Int2_Init(); 
#endif
#ifdef HAVE_EXINT3_EN
	Ext_Int3_Init();
#endif
#ifdef HAVE_EXINT4_EN
	Ext_Int4_Init();
#endif
#ifdef HAVE_EXINT5_EN
	Ext_Int5_Init();
#endif
#ifdef HAVE_EXINT6_EN
	Ext_Int6_Init();
#endif	
#ifdef HAVE_EXINT7_EN
	Ext_Int7_Init();
#endif
#ifdef HAVE_EXINT8_EN
	Ext_Int8_Init();
#endif
#ifdef HAVE_EXINT9_EN
	Ext_Int9_Init();
#endif
}

/***********************************************************************************
函数名  ： SleepExitUserCode										 	
功能描述： 用户自定义函数，在MCU退出休眠状态后，需恢复的功能，可放在此函数中操作。
输入参数： 无
返回值  ： 无
***********************************************************************************/
void SleepExitUserCode(void)
{
#ifdef HAVE_EXINT0_EN
	Ext_Int0_Close();
#endif
#ifdef HAVE_EXINT1_EN
	Ext_Int1_Close();
#endif	
#ifdef HAVE_EXINT2_EN
	Ext_Int2_Close();
#endif
#ifdef HAVE_EXINT3_EN
	Ext_Int3_Close();
#endif
#ifdef HAVE_EXINT4_EN
	Ext_Int4_Close();
#endif
#ifdef HAVE_EXINT5_EN
	Ext_Int5_Close();
#endif	
#ifdef HAVE_EXINT6_EN
	Ext_Int6_Close();
#endif	
#ifdef HAVE_EXINT7_EN
	Ext_Int7_Close();
#endif
#ifdef HAVE_EXINT8_EN
	Ext_Int8_Close();
#endif
#ifdef HAVE_EXINT9_EN
	Ext_Int9_Close();
#endif
}

/*********************************************************************************************************************/

void main(void)
{
#ifdef LVD_RST_ENABLE
	LVDCON = 0xE1;					//设置LVD复位电压为2V
#endif
	
#if (SYSCLK_SRC == PLL)
	Sys_Clk_Set_PLL(PLL_Multiple);	//设置系统时钟为PLL，PLL_Multiple为倍频倍数
#endif
	
#ifdef UART0_EN
	Uart0_Initial(UART0_BAUTRATE);	//初始化UART0
#endif
	
#ifdef UART1_EN
	Uart1_Initial(UART1_BAUTRATE);	//初始化UART1
#endif

#ifdef UART2_EN
	Uart2_Initial(UART2_BAUTRATE);	//初始化UART2
#endif
	
	WDT_Init();
	RTC_Init();	
	LCD_Init();
	EA = 1;													//开全局中断
	EnterStopScanTimer = 40;
	
	while(1)
	{
		Mcu_FeedDog(); 						//喂狗
		if(EnterStopScanTimer == 0)		    //示例演示：在退出省电模式5秒后，重新进入省电模式。
		{
			SleepEnterUserCode();
			LCD_Off();	 	//重要提示：若产品在进入休眠状态前需关闭LCD显示，请在关闭LCD功能前，将所设置的COM脚和SEG脚设置为输出模式并输出低电平。此举可有效避免在关闭LCD功能时，LCD屏幕出现拖影现象。
			EnterSleepMode();
			LCD_Init();
			SleepExitUserCode();
			EnterStopScanTimer = 40; 		//时间单位：125ms
		}
	}
}
#endif
