/*-------------------------------------------

程序名称：CMS89F626框架示例程序
日期版本：2018/6/15 <V1.1>

备注：

*本程序由 中微半导体有限公司 &应用支持部& 编写整理
*公司网址 www.mcu.com.cn
*技术支持QQ 3001082102  罗工
            3001085706	陈工
-------------------------------------------*/


#include "main.h"
#include "Touch_Kscan_Library.h"
#include "Set_Disp.h"

//#define Flag_Led			//选择那种显示方式			
#define Flag_Lcd	




void DelaySomeTime()	//上电延时
{
	unsigned int i=5000;
	while(i)
	{
		CLRWDT();
		i--;
	}
}





/***********************************************************
主循环
***********************************************************/
void main()
{
	Init_System();
	while(1)
	{
		CLRWDT();
				
		if(B_MainLoop)
		{
			B_MainLoop = 0;
			Refurbish_Sfr();
			
			#ifdef Flag_Lcd
			Set_Disp_Lcd();			//设置Lcd显示
			#endif
					
			Set_Time();			//计时
						
			CheckTouchKey();	//扫描按键
			Kscan();			//按键处理
		
		}
	}
}






















//*************子函数*****************

//数据转换 10进制为99内
void Hex_To_Bcd(unsigned char data)
{
	unsigned char i=0;
	while(data>=10)
	{
		data-=10;
		i++;
	}
	BCD_L=data;
	BCD_H=i;	
}

//中断服务函数
void interrupt Isr_Timer()
{
	if(TMR2IF)				//若只使能了一个中断源,可以略去判断
	{
		TMR2IF = 0;
	
//--------------		
		if(++MainTime >= 20)		//一次主循环时间，20*125us=2.5ms
		{
			MainTime = 0;
			B_MainLoop = 1;
		}
//-------------						
#ifdef  Flag_Lcd
		if(++LcdTime>=10)
		{
			LcdTime=0;
			Disp_Lcd();
		}
#endif		
			
	}
	else
	{
		PIR1 = 0;
		PIR2 = 0;
	}
}


//系统初始化
void Init_System()
{
	asm("nop");
	asm("clrwdt");
	INTCON = 0;				//禁止中断
	OSCCON = 0X71;			//配置振荡为8M
	OPTION_REG = 0;

    WPUA  = 0B00000000;  //上拉无效
    WPUB  = 0B00000000;  
//    WPUC  = 0B00000000; 			
    WPUE  = 0B00000000;  
 
	TRISA = 0B00000111;  //PORTA,0/PORTA,1/PORTA,2--触摸按键     
	TRISB = 0B11000000;  //lcd SEG口  RB6 RB7 仿真口
	TRISC = 0B00001111;	 //PORTC,0~PORTC,3--LCD-COM口 
	TRISE = 0B00000000;  //PORTE,0--触摸电容 
 
	PORTA = 0B00000000;
	PORTB = 0B00000000;	 //关闭所有输出
	PORTC = 0B00000000;
	PORTE = 0B00000000;	 
	
	ANSEL = 0B00000000;	//数模通道
	ANSELH = 0B00000000;
	
						//延时等待电源电压稳定
	DelaySomeTime();	//上电延时

	PIE2 = 0;
	PIE1 = 2;
	PR2 = 250;				//8M下将TMR2设置为125us中断
	T2CON = 4;				//使能定时器2
	
	INTCON = 0XC0;			//使能中断
				
}


//刷新特殊功能寄存器
void Refurbish_Sfr()
{
	ANSEL = 0;
	ANSELH = 0;  		 //均为数字口
	
	TRISA = 0B00000111;  //PORTA,0/PORTA,1/PORTA,2--触摸按键     
	TRISB = 0B11000000;  //lcd SEG口  RB6 RB7 仿真口
//	TRISC = 0B00001111;	 //PORTC,0~PORTC,3--LCD-COM口 
	TRISE = 0B00000000;  //PORTE,0--触摸电容 
			
    EECON1 = 0;  		 //清此寄存器,有好处(测试组建议)

	ANSEL = 0B00000000;	//数模通道
	ANSELH = 0B00000000;

	OPTION_REG = 0;
						//刷新中断相关控制寄存器
	PIE1 = 2;
	PR2 = 250;
	INTCON = 0XC0;
	if(4 != T2CON)
		T2CON = 4;
}

//键处理函数
void Kscan()
{
	static unsigned int KeyOldFlag = 0;
	unsigned int i = (unsigned int)((KeyFlag[1]<<8) | KeyFlag[0]);
	if(i)
	{
		if(i != KeyOldFlag)
		{
			KeyOldFlag = i;			//有检测到按键
			key_long = 100;			//第一次响应长按键时间			
			BuzTime=0;				//蜂鸣器响时间			
			
			switch(i)
			{						//按键处理
				case 1:	Key3_Deal();break;
				case 2:	Key2_Deal();break;
				case 4:	Key1_Deal();break;
				default:break;
			}
		}
		else						//长按键处理
		{	 
			if(key_long)
			{
				key_long--;
			}
			else
			{
				key_long = 50;					
				Flag_long = 1;
				switch(i)
				{
				case 1:	Key3_Deal();break;
				case 2:	Key2_Deal();break;
				case 4:	break;
				default:break;
				}
			}													
		}			
	}
	else
	{
		KeyOldFlag = 0;
		Flag_long = 0;
	}
}


//键处理子函数

//------------------------
void Key1_Deal()		//模式键
{
	secl=0;
	sech=0;
	ds_sec=0;
	ds_min=0;
	ds_hour=0;	
	
	if(Flag_Onoff == 1)
	{
		Flag_Onoff=0;		
	}
	else
	{
		Flag_Onoff=1;		//开机以模式1工作
		ds_hour=2;
		ds_min=0;
		Flag_SS = 0;			
	}
}					
//------------------------
void Key2_Deal()		//小时
{
	if( Flag_Onoff == 1)
	{	
			Flag_SS = 0;
			secl = 0;
			sech = 0;
			ds_sec = 0;
							
			if(ds_hour>=23)
				ds_hour = 0;
			else
				ds_hour++;
			if(ds_hour == 0&& ds_min == 0)		//定时最小1分钟
			{
				ds_min = 1;
			}						
	}	
}
//------------------------
void Key3_Deal()		//分钟
{
	if(Flag_Onoff == 1)
	{
			Flag_buz = 1;    		//鸣器响	
			Flag_SS = 0;
			secl = 0;
			sech = 0;
			ds_sec = 0;
							
			if(ds_min>=59)
				ds_min = 0;
			else
				ds_min++;
				
			if(ds_hour == 0&& ds_min == 0)	//定时最小1分钟
			{
				ds_min = 1;
			}			
	}
}


//定时处理子函数
//----------------------
void Set_Time()
{	
		if(ds_min==0 && ds_hour==0 && Flag_Onoff == 0)
		{
			Flag_Onoff = 0;
		}
		
		else
		{		
			secl++;
			if(secl>=20)
			{
				secl=0;
				sech++;
			}
			if(sech>=10)
			{
				sech=0;
				Flag_SS=!Flag_SS;
				ds_sec++;
			}							//0.5s到
							
			if(ds_sec >= 60)
			{
				ds_sec = 0;	
							
				if(0 != ds_min)	
				{
					ds_min--;
				}
				else
				{
					if(0 != ds_hour)
					{
						ds_hour--;
						ds_min = 59;
					}
				}			
			}
		}							
}






















