 //************************************************************
//  Copyright (c) 深圳市赛元微电子有限公司
//	文件名称	: main.c
//	作者		: Jamie
//	模块功能	: 水位检测+触控按键DEMO
//  最后更正日期:
// 	版本		: 
//              :  
//*************************************************************
#include "h\SC92R425_C.H"
#include "h\data_type.h"
#include "lib\SensorMethod.h"
#include "h\uart.h"

#define  __DEBUG__				//打开此开关进行水位检测参数调试

#ifdef   __DEBUG__
uchar  UartSendBuf[6]={ 0};
uchar i,ChannlCount=5;
#endif

//*****************全局变量区***************************************************
INT32U exKeyValueFlag = 0;		//当前轮按键标志
INT32U WatL_exKeyValueFlag = 0;		//当前轮按键标志

INT16U  AdjustCount = 0;		//定时时间计算
BOOL   NotWaterAdjust = 0;		//无水校准标志

INT8U  gTkIsValid = 0; 			//按键有效标志
INT8U  exKeyValue = 0;			//当前轮按键键值
INT8U  WatL_exKeyValue = 0;			//当前轮按键键值
INT8U  KeyValue = 0;			//按键键值

unsigned int Key_CNT = 0;		//长按计数执行无水校准
 /**************************************************
*函数名称：void TimerInit(void) 
*函数功能：定时器初始化
*入口参数：void
*出口参数：void
**************************************************/
void TimerInit(void)
{
	TMCON |= 0x01;		//bit0: 0为FOSC/12,1为FOSO

	TMOD |= 0x01;                 //0000 0001;Timer0设置工作方式1
	TL0 = (65536 - 32000)%256;    //溢出时间：时钟为Fsys，则32000*（1/Fsys）=1ms;
	TH0 = (65536 - 32000)/256;
	TR0 = 0;
	ET0 = 1;//定时器0允许
	TR0 = 1;//打开定时器0
}
/**************************************************
*函数名称：void timer0()interrupt 1 
*函数功能：定时器中断服务函数
*入口参数：void
*出口参数：void 
**************************************************/
void timer0()interrupt 1
{
	TL0 = (65536 - 32000)%256;    //溢出时间：时钟为Fsys，则32000*（1/Fsys）=1ms;
	TH0 = (65536 - 32000)/256;
	if(NotWaterAdjust == 0)
	{
		AdjustCount++;
		if(AdjustCount>10000)
		{
			NotWaterAdjust = 1;		//上电一定时间内NotWaterAdjust为0，时间到了以后为1，NotWaterAdjust为0允许进行无水校准
		}		
	}			 	
}

void delay(INT16U t)
{
	INT16U i,j;
	for(i=0;i<t;i++)
		for(j=0;j<100;j++)
		{
			WDTCON  = 0x10;		
		}
}
 /**************************************************
*函数名称：void  Sys_Init(void) 
*函数功能：系统初始化
*入口参数：void
*出口参数：void  
**************************************************/
void  Sys_Init(void)
{	
	WDTCON  = 0x10;				    //1--1 -- 00    开WDT,WDT清0,WDT 524.288ms溢出;烧录时，可Code Option选择ENWDT
	//TK对应的IO设置为强推挽输出1
	P0CON = 0xFF;
	P0PH  = 0xFF;
		
	P1CON = 0xFF;
	P1PH  = 0xFF;
	P2CON = 0xFF;
	P2PH  = 0xFF;
	P5CON = 0xFF;
	P5PH  = 0xFF;
	P0 = 0x00;
	P1 = 0x00;
	P2 = 0x00;
	P5 = 0x00; 	
	P1CON = 0xfb;	   
	EA = 1;						//开总中断	
    TimerInit(); 				//定时器初始化
}
/**************************************************
*函数名称：void ChangeTouchKeyvalue(void) 
*函数功能：转换TK键值
*入口参数：void
*出口参数：void
**************************************************/
void ChangeTouchKeyvalue(void)
{
	switch(exKeyValueFlag)
	{		
		case 0x00000001:exKeyValue = 1;break; 
	    default:exKeyValue = 0xff;break; 			
	}
		switch(WatL_exKeyValueFlag)
		{
			case 0x00080000://0x00001000
				WatL_exKeyValue = 1;
			break;
			
			case 0x000C0000://0x00001200
				WatL_exKeyValue = 2;
			break;
			
			case 0x000C4000://0x00001300
				WatL_exKeyValue = 3;
			break;
			
			case 0x000C6000://0x00001320
				WatL_exKeyValue = 4;
			break;
			
			default:
				WatL_exKeyValue = 0;
			break;
			
		}	
	switch(WatL_exKeyValue)				  //根据不同的档位点亮对应LED灯
	{		
		case 0:P0 = 0X00; P2 = 0X00;break; 
		case 1:P0 = 0X00; P2 = 0X02;break;
		case 2:P0 = 0X00; P2 = 0X03;break;
		case 3:P0 = 0X20; P2 = 0X03;break;
		case 4:P0 = 0X22; P2 = 0X03;break;
	    default:break; 			
	}
}
/**************************************************
*函数名称：void UpdateLcdBufFunc(void) 
*函数功能：更新显示数据函数
*入口参数：void
*出口参数：void
**************************************************/
void UpdateLcdBufFunc(void)
{
	if(exKeyValue != 0xff)
	{
		if(gTkIsValid == 0)			//松手前只出一次键
		{		
			KeyValue=exKeyValue; 
            switch(KeyValue)
            {		
				case 1:						   //组合按键，上电10秒内长按3秒进行空水箱校准，校准成功后通过全部LED闪烁进行提示
				Key_CNT++;
				if(!NotWaterAdjust)
				{
					if(Key_CNT>=50)
					{	
						Key_CNT = 0;
						if(NoWaterCalibration()==1)	  //只有在确定没有水时才能调用无水校准函数，此函数返回1代表校准成功，返回0代表校准失败
						{
							P0 = 0X22; P2 = 0X03;
							delay(2000);
							P0 = 0X00; P2 = 0X00;
							delay(2000);			  //校准成功通过闪灯进行提醒
							P0 = 0X22; P2 = 0X03;
							delay(2000);
							P0 = 0X00; P2 = 0X00;
							delay(2000);
							P0 = 0X22; P2 = 0X03;
							delay(2000);
							P0 = 0X00; P2 = 0X00;
							delay(2000);
							P0 = 0X22; P2 = 0X03;
							delay(2000);
							P0 = 0X00; P2 = 0X00;
							delay(2000);
							P0 = 0X22; P2 = 0X03;
							delay(2000);
							P0 = 0X00; P2 = 0X00;
						}
						else					  //如果校准失败，LED一直闪烁
						{
							while(1)
							{
							    WDTCON  = 0x10;	
								P0 = 0X22; P2 = 0X03;
								delay(2000);
								P0 = 0X00; P2 = 0X00;
								delay(2000);
							} 	
						}
						NotWaterAdjust = 1;	
						gTkIsValid = 1;	
					}
					
				} 
                default:exKeyValue = 0xff;break; 			
            }
		}						 	
	}
	else
	{
		gTkIsValid = 0;        
	}	
}
/**************************************************
*函数名称：void  Sys_Scan(void) 
*函数功能：扫描TK和显示
*入口参数：void
*出口参数：void  
**************************************************/
void Sys_Scan(void)
{      				
	if(SOCAPI_TouchKeyStatus&0x80)	    //重要步骤2:  触摸键扫描一轮标志，是否调用TouchKeyScan()一定要根据此标志位置起后
	 {	
		 
		SOCAPI_TouchKeyStatus &= 0x7f;	//重要步骤3: 清除标志位， 需要外部清除。													    
		exKeyValueFlag = TouchKeyScan();//按键数据处理函数 
		WatL_exKeyValueFlag = WaterLeveDetectionScan();//水位检测函数
		
		#ifdef   __DEBUG__
		for(i=0;i<ChannlCount;i++)	 
		{			 		 		 			 
			UartSendBuf[0]=WatL_RawData[i]/10000+0X30;
			UartSendBuf[1]=WatL_RawData[i]%10000/1000+0X30;				 
			UartSendBuf[2]=WatL_RawData[i]%1000/100+0X30;
			UartSendBuf[3]=WatL_RawData[i]%100/10+0X30;
			UartSendBuf[4]=WatL_RawData[i]%10+0X30;
			UartSendBuf[5]=' ';
			Uart_SendString(UartSendBuf,6);  			  				 		  			
		}
			UartSendBuf[0]=WatL_exKeyValue/10000+0X30;
			UartSendBuf[1]=WatL_exKeyValue%10000/1000+0X30;				 
			UartSendBuf[2]=WatL_exKeyValue%1000/100+0X30;
			UartSendBuf[3]=WatL_exKeyValue%100/10+0X30;
			UartSendBuf[4]=WatL_exKeyValue%10+0X30;
			UartSendBuf[5]='\n';
			Uart_SendString(UartSendBuf,6); 
		
		#endif 
		
		ChangeTouchKeyvalue();   		//转换键值
        UpdateLcdBufFunc();         	//按键控制无水校验 
		WL_TouchKeyRestart();				//启动下一轮转换																													 			
	}		  	   
}
/**************************************************
*函数名称：void main(void)								  
*函数功能：主函数
*入口参数：void
*出口参数：void  
**************************************************/
void main(void)
{
	Sys_Init();
	
	#ifdef   __DEBUG__
	Uart0_Init(32,38400);
	#endif
	//水位以及触控按键初始化
	WL_TouchKeyInit();
		P0 = 0X22; P2 = 0X03;
		delay(2000);delay(2000);delay(2000);
		delay(2000);delay(2000);delay(2000);
		P0 = 0X00; P2 = 0X00;		
	while(1)
	{
		WDTCON  = 0x10;	
		Sys_Scan();
	} 
}
