/****************************************************************************************
 *
 * 文件名: main.c
 * 项目名:
 * 版 本: v1.0
 * 日 期: 2015年12月09日 18时55分06秒
 * 作 者: Administrator
 * 
 ****************************************************************************************/
#include "main.h"


unsigned char kf8_touch_flag;
unsigned char kf8_time_flag;	// 时间间隔标志
unsigned char fast_key_flag;	// 时间间隔标志
unsigned int  Touch_Watch_Count;		// 监控触摸运行，超时无工作认为识别，重新初始化
unsigned int clr_show_watch;
unsigned char clr_show_enable;
unsigned int  key_time_count;
unsigned int  fast_Count;
unsigned long  _KF8_LIBi_channel_flag_Old_;	// 缓存上一次按键标志，实现按键变化才执行按键代码
unsigned char key_out;
unsigned int  time;				// 时间间隔计数
unsigned char PWM3_T;
unsigned int  temper_int;				// 时间间隔计数
unsigned char PWM1L_back;
signed	int	PWM1L_int;
unsigned char PWM2L_back;
signed	int	PWM2L_int;
unsigned char PWM3;
unsigned char PWM3L_back;

#define LED_G_ON	P0LR3=1;
#define LED_G_OFF	P0LR3=0;


//unsigned	int	_KF8_LIBi_Slide_channel_out0_;
//unsigned	int	_KF8_LIBi_Slide_channel_out1_;
//;************************************************************************************
//;* 函 数 名:  delay_ms
//;* 函数功能: 延时函数
//;* 入口参数: 无
//;* 返    回:   无
//;************************************************************************************
void delay_ms(uint ms_data)
{
	uint j=0;
	while(ms_data--)
	{
		_CWDT();
		j=100;///200;
		while(j--);
	}
}
//;************************************************************************************
//;* 函 数 名:  delay_us
//;* 函数功能: 延时函数
//;* 入口参数: 无
//;* 返    回:   无
//;************************************************************************************
void delay_us(uint us_data)
{
	while(us_data--);
}
//;************************************************************************************
//;* 函 数 名:
//;* 函数功能: 解析按键信息函数
//;* 入口参数: 无
//;* 返    回:   无
//;************************************************************************************
void Show_Key_Out()
{
	if((_KF8_LIBi_Slide_Press_Flag&0x03)==0)
	{
		PWM1L_back=PWM1L;
		PWM2L_back=PWM2L;
	}
	if(kf8_time_flag) // 定时查看滑轮结果，否则显示太快，耗时较多，影响触摸采样速度
	{
		kf8_time_flag=0;
	//((((((((((((((((((((((((((((((((((((((((
		if(_KF8_LIBi_Slide_Press_Flag&0x01)
		{
			temper_int=_KF8_LIBi_Slide_distance_out_[0];
			PWM2L_int=temper_int;

			PWM2L_int=PWM2L_int+PWM2L_back;
			if(PWM2L_int>255)
			{
				PWM2L=255;
			}
			else if(PWM2L_int<0)
			{
				PWM2L=0;
			}
			else
			{
				PWM2L=PWM2L_int;
			}
			Show_Slide_work_out();
			clr_show_watch=0;
		}
		if(_KF8_LIBi_Slide_Press_Flag&0x02)
		{
			temper_int=_KF8_LIBi_Slide_distance_out_[1];
			PWM1L_int=temper_int;

			PWM1L_int=PWM1L_int+PWM1L_back;
			if(PWM1L_int>255)
			{
				PWM1L=255;
			}
			else if(PWM1L_int<0)
			{
				PWM1L=0;
			}
			else
			{
				PWM1L=PWM1L_int;
			}
			Show_Wheel_work_out();
			clr_show_watch=0;
		}
		if(_KF8_LIBi_channel_flag_Old_!=_KF8_LIBi_channel_flag_||fast_key_flag)
		{
			#define Key_1_Code_Define	0x000010  //CT 4	+
			#define Key_2_Code_Define	0x000008  //CT 3    -

			fast_key_flag=0;
			_KF8_LIBi_channel_flag_Old_=_KF8_LIBi_channel_flag_;

			if(_KF8_LIBi_channel_flag_Old_==Key_1_Code_Define)
			{
				if(PWM3!=51)
				{
					PWM3=PWM3+1;
				}
				PWM3L_back=PWM3*5;
				Show_Key1_work_out();
				clr_show_enable=0;
			}
			else if(_KF8_LIBi_channel_flag_Old_==Key_2_Code_Define)
			{
				if(PWM3!=0)
				{
					PWM3=PWM3-1;
				}
				PWM3L_back=PWM3*5;
				Show_Key2_work_out();
				clr_show_enable=0;
			}
			else								// 按键弹起
			{
				key_out=0;
				key_time_count=0;
				clr_show_enable=1;
				Show_begin_Mes();
			}
			//clr_show_watch=0;
		}
		//----------------------
		clr_show_watch++;
		if(clr_show_watch==8)
		{
			clr_show_watch=16;

			if(clr_show_enable)
				Show_begin_Mes();
		}
		//))))))))))))))))))))))))))))))))))))))))))))))))
	}
}
//;************************************************************************************
//;* 函 数 名:  void main()
//;* 函数功能: 主函数，入口函数
//;* 入口参数: 无
//;* 返    回:   无
//;************************************************************************************
void main()
{
	init_mcu();						//初始化MCU寄存器
	delay_ms(200);
	clr_show_watch=0;
    clr_show_enable=1;

	#if	LCD_PRINT
		PP1=0XFF;
		PP2=0XFF;
		PWM1L=0X00;
		PWM2L=0X00;
		PWM1ON=1;
		PWM2ON=1;
		T1ON=1;
		PWM3=0;
		PWM3L_back=0;

		LCD1602_Init();
		Show_begin_Mes();
	#endif

#if	use_vdd_ref
	CTCTL1 = 0x41;//             //分频和源    0/4/8/C & 1
	VDAC=0x90;// 0.5VDD       公式0.05Vdd（N+1)    N=0--15
#else
	CTCTL1 	= 0x40;		//电压源和时钟分频设置  0 4 8 C~ 4/8/16/32  xxyy yyyx   0~ Vref  1~ VDD
	// 电压选择和使能配置
	VRECTL =0x92;
	__asm
	;;//VDACS=0x40; 		// 保留寄存器，翻转电压也选择Vref	0x40 Vref  0x00  Vdd, 默认Vdd
		MOVB #0x00
		MOV R0,#0x40
		ORL 0x1A,R0
	__endasm;
	VDAC=0x90;// 0.5Vref       公式0.05Vxx（N+1)    N=0--15
#endif
	kf8_touch_flag=0;
	_KF8_LIBi_channel_flag_Old_=0x000000;

	_KF8TS27_Lib_Set_Slide_W_Parameter(0);// 参数见kf8ts27_touch_s.h中说明，使用T4计数可不调用
	_KF8TS27_Init_Touch_Slide_W_();		//调用电容触摸库函数的初始化
//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	while(1)
	{
		_CWDT();
//----------------------------------------------------
		if(kf8_touch_flag)
		{
			kf8_touch_flag=0;
			//调试函数TOUCH_DEBUG_TRS_DEAL 实现采样值和参考值传输到上位机调试软件中，具体见软件说明
//			TOUCH_DEBUG_TRS_DEAL();
			//触摸处理函数，如果系统需要休眠，应在该函数前，唤醒后继续。可以根据处理次数或单次休眠。
			_KF8TS27_Touch_Process_Slide_W_();
			//----------------------------------
		#if	LCD_PRINT
			Show_Key_Out();
		#endif
		}
		//@@@@@@@=====================================================@@@@//
		//@@@@@@@============== 监听处理代码===========================@@@@//
		//@@@@@@@=====================================================@@@@//
		#if 0	// 嵌汇编节省空间
			Touch_Watch_Count++;
			if(Touch_Watch_Count>=50000) // 可细调粗略时间  50000=0xC350
			{
				Touch_Watch_Count=0;
				_KF8TS27_Init_Touch_Slide_W_();
			}
		#else
			__asm
				BANKSEL _Touch_Watch_Count
				INC _Touch_Watch_Count
				JB PSW,2
				INC _Touch_Watch_Count+1	// ++
				MOV R0,_Touch_Watch_Count+1
				MOV R1,#0xC3
				SUB R1,R0 	;//借位不满足条件
			    PAGESEL Watch_Touch_Deal_End
			    JB PSW,0
			    JMP Watch_Touch_Deal_End
			    PAGESEL Watch_Touch_Deal_DO
			    JB PSW,2	;//相等判断低位，否则不借位下一定成立
			    JMP Watch_Touch_Deal_DO
			    MOV R0,_Touch_Watch_Count
			    MOV R1,#0x50
			    SUB R1,R0	;//不借位满足条件
			    PAGESEL Watch_Touch_Deal_End
			    JB PSW,0
			    JMP Watch_Touch_Deal_End
			Watch_Touch_Deal_DO:
				BANKSEL _Touch_Watch_Count
				CLR _Touch_Watch_Count
				CLR _Touch_Watch_Count+1
				PAGESEL __KF8TS27_Init_Touch_Slide_W_
				CALL __KF8TS27_Init_Touch_Slide_W_
				PAGESEL $
			Watch_Touch_Deal_End:
			__endasm;
			if(1);
		#endif
		//@@@@@@@=====================================================@@@@//
		//@@@@@@@============== 监听处理代码结束=======================@@@@//
		//@@@@@@@=====================================================@@@@//


		//调试函数TOUCH_DEBUG_SEND_OUT 可传输出4个BYTE数据
		//格式 AA 05  XX XX  XX  XX  SUM  BB,其中 05为 识别作用，05的正确预示着传输线路通畅
		// 需要使用带串口DTR选项的串口工具，波特率115200，需要手动进入编程器功能，见触摸调试软件中说明
		//			sentbuf1=0x01;
		//			sentbuf2=0x01;
		//			sentbuf3=0x01;
		//			sentbuf4=0x01;
		//			TOUCH_DEBUG_SEND_OUT();
//----------------------------------------------------
	}
}
//中断函数0:0X04入口地址
void int_fun0() __interrupt (0)
{
//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#if	touch_use_T4
	if(T3IF)
	{
		T3IF=0;		//做标志位，在主函数检测标志执行
		T4CTL=0x00;
		kf8_touch_flag=1;
		Touch_Watch_Count=0;
	}
#endif
//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
}
//中断函数1:0x14入口地址
void int_fun1() __interrupt (1)
{
#if !touch_use_T4		// 不使用T4计时时，触摸T3中断可以使用低优先级
	if(T3IF)
	{
		T3IF=0;		//如果为了不影响中断，可以把触摸通道处理放到主函数，在此做一个标志位，然后在主函数检测标志位进行扫描即可
		kf8_touch_flag=1;	//触摸标志位
		Touch_Watch_Count=0;
	}
#endif

	if(T0IF)
	{
		T0IF=0;
		T0=0x20;//125us
#if	LCD_PRINT
		time++;
		if(time>800)
		{
			time=0;
			kf8_time_flag=1;	// 100ms
	    }

		PWM3_T++;
		if(PWM3_T>50)
		{
			PWM3_T=0;
		}
		if(PWM3_T<PWM3)
		{
			LED_G_ON
		}
		else
		{
			LED_G_OFF
		}
		if(clr_show_enable==0)
		{
			key_time_count++;
			if(key_time_count>24000)
			{
				key_time_count--;
				fast_Count++;
				if(fast_Count>1600)
				{
					fast_Count=0;
					fast_key_flag=1;
				}
			}
			else if(key_time_count>16000)
			{
				fast_Count++;
				if(fast_Count>2400)
				{
					fast_Count=0;
					fast_key_flag=1;
				}
			}
			else if(key_time_count>8000)
			{
				fast_Count++;
				if(fast_Count>3200)
				{
					fast_Count=0;
					fast_key_flag=1;
				}
			}
			else
			{
				fast_Count=0;
			}
		}
#endif
	}
//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
}
