sysfunction.c

来自「用FreeScale 的MC9S08FL16RM MCU设计的一种家用空调控制器」· C语言 代码 · 共 2,177 行 · 第 1/4 页

C
2,177
字号
    }
    
    //RTC process
    RTC_Minu = IRLcdRTCMH*10 + IRLcdRTCML;
    RTC_Hour = IRLcdRTCHH*10 + IRLcdRTCHL;
    //temperature process
    Set_Temper = (IRLcdTempH*10+IRLcdTempL)*2+80;
    if(F_SysFeature_Sleep&&F_SysMode_Cool)	Set_Temper+=SetTempSleep;
    if(F_SysFeature_Sleep&&F_SysMode_Heat)  Set_Temper-=SetTempSleep;
    SetTempBak = Set_Temper;
    Disp_Temp[0] = Disp_Code[IRLcdTempH];
    Disp_Temp[1] = (Disp_Code[IRLcdTempL] & 0b01111111);
    if(IRLcdTempL==1) Disp_Temp[1] = 0x79;
    DispTemp0Bak = Disp_Temp[0];
  	DispTemp1Bak = Disp_Temp[1];
    
    //timer process
    if(IRLcdOnTHH&0x08)
    {
      OnTimer_Hour = (IRLcdOnTHH&0x03)*10 + IRLcdOnTHL;
      OnTimer_Minu = IRLcdOnTMH*10 + IRLcdOnTML;
      F_OnTimer_Active = 1;
    }
    else 
    {
      F_OnTimer_Active = 0;
    }
    if(IRLcdOffTHH&0x08)
    {
      OffTimer_Hour = (IRLcdOffTHH&0x03)*10 + IRLcdOffTHL;
      OffTimer_Minu = IRLcdOffTMH*10 + IRLcdOffTML;
      F_OffTimer_Active = 1;
    }
    else
    {
      F_OffTimer_Active = 0;
    }
    //Louver
    Louver_Position = Louver;
    //Ionizer
    if(IRLcdIon==0x05)
    {
    	F_Ionizer_Active = 1;
    }
    else
    {
    	F_Ionizer_Active = 0;
    }
    //ID Code
    if(IRLcdIDCode==0x0A)
    {
    	F_ID_A_Code = 1;
    }
    else
    {
    	F_ID_A_Code = 0;
    }
    //received IR data
    F_5sKey = 0;
    F_Buzzer = 1;  //active Buzzer
    BuzzerTime = 400;
    //save IR data
    EE_WTemp[0] = 0x55;	//head data
    if(F_SysMode_On)	EE_WTemp[1] = 0x08;
    if(!F_SysMode_On)	EE_WTemp[1] = 0x00; //system on or off status	
    EE_WTemp[2] = IRLcdFanSpeed;	//Fan speed
    EE_WTemp[3] = Louver;	//stepper motor swing
    EE_WTemp[5] = IRLcdIon;	//Ionizer
    EE_WTemp[6] = IRLcdFeature&0b00000010;	//sleep
    EE_WTemp[7] = IRLcdMode;	//mode
    EE_WTemp[8] = Set_Temper;	//set temperature
    F_UseData_Update = 1;
    SysTimerStr.Timer_2sUserdataUpdate = 2;
    F_Blanking_SetTemp = 1; 
  }
  else				          
  {
    TPM2C1SC = 0b01001000;  //Enable IR RX
  }
  
  if(F_IRLcdErr)		 
  {
_IRLcdErr:    
    F_IRLcdErr = 0;
    F_IRLcdHead1_OK = 0;
    F_IRLcdHead2_OK = 0;
    F_IRLcd1End = 0;
    F_IRLcdEnd = 0;
    IrStr.IRLcdBitCnt = 0;
    IRLcdIDL = 0;
    IRLcdIDH = 0;
    IRLcdMode = 0;
    IRLcdFanSpeed = 0;
    IRLcdRTCML = 0;
    IRLcdRTCMH = 0;
    IRLcdRTCHL = 0;
    IRLcdRTCHH = 0;
    IRLcdOnTHL = 0;
    IRLcdOnTHH = 0;
    IRLcdOffTHL = 0;
    IRLcdOffTHH = 0;
    IRLcdTempL = 0;
    IRLcdTempH = 0;
    IRLcdFeature = 0;
    IRLcdCK = 0;
    IRLcdOnTML = 0;
    IRLcdOnTMH = 0;
    IRLcdOffTML = 0;
    IRLcdOffTMH = 0;
    ScreenOnOff = 0;
    Louver = 0;
    IRLcdFTempL = 0;
    IRLcdFTempH = 0;
    IRLcdVFanSpd = 0;
    IRLcdIon = 0;
    IRLcdRevd0 = 0;
    IRLcdIDCode = 0;
    IRLcdRevd1 = 0;
    IRLcdRevd2 = 0;
    IRLcdRevd3 = 0;
    IRLcdCKSum = 0;
    TPM2C1SC = 0b01001000;  //Enable IR RX
  }
}
/////////////////////////////////
void	Louver_Ctrl(void)
{
  if(Target_Steps==0&&Target_Steps!=Current_Steps)	return;
  if(Target_Steps==0&&Current_Steps==0)	Current_Steps = 2000,Target_Steps = 3300;
  if(!F_SysMode_On) return;
  if(Target_Steps==3300&&((Target_Steps-Current_Steps)*11/126)<=61)	F_Louver60C = 1;
  else		F_Louver60C = 0;	
  if(Target_Steps==3300&&Target_Steps!=Current_Steps)
  {
  	F_Louver110C = 1;
  	return;
  }
  else		F_Louver110C = 0;
  if(Louver_Position==0xff&&(Current_Steps==3300||Current_Steps==2000)) 
  {
  	Steps_Time = 2;
  	Target_Steps = Target_Steps_Bk;
  	return;
  }
  Steps_Time = 2;
	if(Louver_Position==0)
	{
		if(EE_WTemp[3]==0)
    {
    	if(Current_Steps>Target_Steps) EE_WTemp[4] = 110-(uchar)((Current_Steps-Target_Steps)*11/126)-35;
    	if(Current_Steps<Target_Steps) EE_WTemp[4] = (uchar)((Target_Steps-Current_Steps)*11/126);
    }
		Target_Steps_Bk = Target_Steps;
		Current_Steps_Bk = Current_Steps;
		Target_Steps = Current_Steps;
		F_Louver_Pause = 1;
		F_LouverAuto = 0;
	}
	if(Louver_Position==1)
	{
		if(F_Louver_Pause)
		{
			Target_Steps = Target_Steps_Bk;
			Current_Steps = Current_Steps_Bk;
			F_Louver_Pause = 0;
		}
		Target_Steps = 2000 + 401;
		F_LouverAuto = 0;
	}
	if(Louver_Position==2)
	{
		Target_Steps = 2000 + 401 + 252;
		F_LouverAuto = 0;
	}
	if(Louver_Position==3)
	{
		Target_Steps = 2000 + 401 + 252 + 252;
		F_LouverAuto = 0;
	}
	if(Louver_Position==4)
	{
		Target_Steps = 2000 + 401 + 252 + 252 + 355;  //3260
		F_LouverAuto = 0;
	}
	if(Louver_Position==15&&(OUT0_LF||OUT1_MF||OUT2_HF))
	{
		if(F_LouverAuto==0&&Current_Steps>2041&&Current_Steps<3260)
		{
			F_LouverAuto = 1;
			Target_Steps = 1260 + 2000;
		}
		if(Current_Steps<=(2000+401))
		{
			Target_Steps = 1260 + 2000;
		}
		if(Current_Steps>=3260)
		{
			Target_Steps = 3260 - 1260 +401;
		}
	}
}
/////////////////////////////////
void	Fan_Mode(void)
{
	if(!F_SysMode_On||F_Defrost_Start||F_Defrost_End)	return;
	if(F_SysMode_Fan||F_BlnakingCHLed)
	{
		if(OUT6_COMP)	OUT6_COMP = 0;	//in fan mode,comp,outfan and four way value will
		if(OUT5_ODF)	OUT5_ODF = 0;		//be turned off
		F_OutFan_On = 0;
		SysTimerStr.Timer_180sCompOff = 180;	//comp 3min protect
	}
}
/////////////////////////////////
void	Fan_Run(void)
{
	if(!F_SysMode_On||F_Defrost_Start||F_Defrost_End||F_Louver60C)	return;
	if(F_SysMode_Fan||(F_SysMode_Cool&&OUT6_COMP&&!F_FanSpeed_Auto)||F_BlnakingCHLed||
		F_Comp4WVFault||(F_SysMode_Heat&&OUT6_COMP&&!F_FanSpeed_Auto&&!F_ColdDraft))//fan mode or comp on
	{
		if(F_FanSpeed_Low&&!OUT0_LF&&(OUT1_MF||OUT2_HF)&&SysTimerStr.Timer_2sFanRun==0)	
		{ 
			OUT0_LF = 0;
			OUT1_MF = 0;
			OUT2_HF = 0;
			SysTimerStr.Timer_300msFanSpdSW = 60; //fan speed switching delay
		}
		if(F_FanSpeed_Low&&!OUT0_LF&&!OUT1_MF&&!OUT2_HF&&SysTimerStr.Timer_300msFanSpdSW==0)
		{ 
			OUT0_LF = 1;
			OUT1_MF = 0;
			OUT2_HF = 0;
			SysTimerStr.Timer_2sFanRun = 3;
		}
//-------------------------------		
		if(F_FanSpeed_Mid&&!OUT1_MF&&(OUT0_LF||OUT2_HF)&&SysTimerStr.Timer_2sFanRun==0)	
		{ 
			OUT0_LF = 0;
			OUT1_MF = 0;
			OUT2_HF = 0;
			SysTimerStr.Timer_300msFanSpdSW = 60;//fan speed switching delay
		}
		if(F_FanSpeed_Mid&&!OUT0_LF&&!OUT1_MF&&!OUT2_HF&&SysTimerStr.Timer_300msFanSpdSW==0)
		{ 
			OUT0_LF = 0;
			OUT1_MF = 1;
			OUT2_HF = 0;
			SysTimerStr.Timer_2sFanRun = 3;
		}
//-------------------------------
		if(F_FanSpeed_High&&!OUT2_HF&&(OUT1_MF||OUT0_LF)&&SysTimerStr.Timer_2sFanRun==0)	
		{ 
			OUT0_LF = 0;
			OUT1_MF = 0;
			OUT2_HF = 0;
			SysTimerStr.Timer_300msFanSpdSW = 60;//fan speed switching delay
		}
		if(F_FanSpeed_High&&!OUT0_LF&&!OUT1_MF&&!OUT2_HF&&SysTimerStr.Timer_300msFanSpdSW==0)
		{ 
			OUT0_LF = 0;
			OUT1_MF = 0;
			OUT2_HF = 1;
			SysTimerStr.Timer_2sFanRun = 3;
		}
	}
	//=============================
if(F_SysMode_Cool)
	{
		if(F_Comp4WVFault||F_BlnakingCHLed)	return;
		if(!OUT6_COMP&&!OUT0_LF&&SysTimerStr.Timer_2sFanRun==0)
		{
			OUT0_LF = 1;	//comp cut off,indoor fan run at low fan speed
			OUT1_MF = 0;
			OUT2_HF = 0;
			SysTimerStr.Timer_300msFanSpdSW = 60; //fan speed switching delay
			//F_FanSpeed_Low = 1;
			//F_FanSpeed_Mid = 0;
			//F_FanSpeed_High = 0;
			//FanSpeedBak = 0b00001000;
		}
//------------------------------- 
		if(OUT6_COMP) 					//comp on
		{ 
			if(F_FanSpeed_Auto) //Auto fan speed
			{ 
				if((Temp_Indoor>=(Set_Temper+2))&&F_FanSpeed_Low&&SysTimerStr.Timer_2sFanRun==0)
				{ 
					OUT0_LF = 0;
					OUT1_MF = 0;
					OUT2_HF = 0;
					SysTimerStr.Timer_300msFanSpdSW = 60;//fan speed switching delay
					F_FanSpeed_Mid = 1;
					F_FanSpeed_Low = 0;
					F_FanSpeed_High = 0;
					FanSpeedBak = 0b00000101;
				}
				if(!OUT1_MF&&F_FanSpeed_Mid&&SysTimerStr.Timer_300msFanSpdSW==0)
				{ 
					OUT0_LF = 0;
					OUT1_MF = 1;
					OUT2_HF = 0;
					SysTimerStr.Timer_2sFanRun = 3;
				}
//-------------------------------					
				if((Temp_Indoor>=(Set_Temper+6))&&F_FanSpeed_Mid&&SysTimerStr.Timer_2sFanRun==0)
				{ 
					OUT0_LF = 0;
					OUT1_MF = 0;
					OUT2_HF = 0;
					SysTimerStr.Timer_300msFanSpdSW = 60;//fan speed switching delay
					F_FanSpeed_High = 1;
					F_FanSpeed_Low = 0;
					F_FanSpeed_Mid = 0;
					FanSpeedBak = 0b00000011;
				}
				if(!OUT2_HF&&F_FanSpeed_High&&SysTimerStr.Timer_300msFanSpdSW==0) 
				{ 
					OUT0_LF = 0;
					OUT1_MF = 0;
					OUT2_HF = 1;
					SysTimerStr.Timer_2sFanRun = 3;
				}
//-------------------------------    			
				if((Temp_Indoor<=(Set_Temper+4))&&F_FanSpeed_High&&SysTimerStr.Timer_2sFanRun==0)
				{ 
					OUT0_LF = 0;
					OUT1_MF = 0;
					OUT2_HF = 0;
					SysTimerStr.Timer_300msFanSpdSW = 60;//fan speed switching delay
					F_FanSpeed_Mid = 1;
					F_FanSpeed_Low = 0;
					F_FanSpeed_High = 0;
					FanSpeedBak = 0b00000101;
				}
				/*if((OUT1_MF==0)&&(F_FanSpeed_Mid==1)&&(SysTimerStr.Timer_300msFanSpdSW==0))
				{ _asm nop;
					OUT0_LF = 0;
					OUT1_MF = 1;
					OUT2_HF = 0;
				}*/
//-------------------------------				
				if((Temp_Indoor<=(Set_Temper+0))&&F_FanSpeed_Mid&&SysTimerStr.Timer_2sFanRun==0)
				{ 
					OUT0_LF = 0;
					OUT1_MF = 0;
					OUT2_HF = 0;
					SysTimerStr.Timer_300msFanSpdSW = 60;//fan speed switching delay
					F_FanSpeed_Low = 1;
					F_FanSpeed_Mid = 0;
					F_FanSpeed_High = 0;
					FanSpeedBak = 0b00001001;
				}
				if(!OUT0_LF&&F_FanSpeed_Low&&SysTimerStr.Timer_300msFanSpdSW==0)
				{ 
					OUT0_LF = 1;
					OUT1_MF = 0;
					OUT2_HF = 0;
					SysTimerStr.Timer_2sFanRun = 3;
				}
			}
		}
	}
//===========================
		if(F_SysMode_Heat)
		{
		  if(F_Comp4WVFault||F_BlnakingCHLed)	return;
		  if(!OUT6_COMP&&!F_ColdDraft&&SysTimerStr.Timer_2sFanRun==0)	
			{
				if(!OUT0_LF)	OUT0_LF = 1;	//comp cut off,indoor fan run at low fan speed
				if(OUT1_MF)	OUT1_MF = 0;
				if(OUT2_HF)	OUT2_HF = 0;
				SysTimerStr.Timer_300msFanSpdSW = 60; //fan speed switching delay
				//F_FanSpeed_Low = 1;
				//F_FanSpeed_Mid = 0;
				//F_FanSpeed_High = 0;
				//FanSpeedBak = 0b00001000;
			}
//-------------------------------			 
			if(OUT6_COMP) 					//comp on
			{ 
				if(F_FanSpeed_Auto&&F_ColdDraft==0) //Auto fan speed
				{ 
					if((Set_Temper>=(Temp_Indoor+2))&&F_FanSpeed_Low&&SysTimerStr.Timer_2sFanRun==0)
					{ _asm nop;
						OUT0_LF = 0;
						OUT1_MF = 0;
						OUT2_HF = 0;
						SysTimerStr.Timer_300msFanSpdSW = 60;//fan speed switching delay
						F_FanSpeed_Mid = 1;
						F_FanSpeed_Low = 0;
						F_FanSpeed_High = 0;
						FanSpeedBak = 0b00000101;
					}
					if(!OUT1_MF&&F_FanSpeed_Mid&&SysTimerStr.Timer_300msFanSpdSW==0)
					{ _asm nop;
						OUT0_LF = 0;
						OUT1_MF = 1;
						OUT2_HF = 0;
						SysTimerStr.Timer_2sFanRun = 3;
					}
//-------------------------------					
					if((Set_Temper>=(Temp_Indoor+6))&&F_FanSpeed_Mid&&SysTimerStr.Timer_2sFanRun==0)
					{ _asm nop;
						OUT0_LF = 0;
						OUT1_MF = 0;
						OUT2_HF = 0;
						SysTimerStr.Timer_300msFanSpdSW = 60;//fan speed switching delay
						F_FanSpeed_High = 1;
						F_FanSpeed_Low = 0;
						F_FanSpeed_Mid = 0;
						FanSpeedBak = 0b00000011;
					}
					if(!OUT2_HF&&F_FanSpeed_High&&SysTimerStr.Timer_300msFanSpdSW==0)
					{ _asm nop;
						OUT0_LF = 0;
						OUT1_MF = 0;
						OUT2_HF = 1;
						SysTimerStr.Timer_2sFanRun = 3;
					}
//-------------------------------					
					if((Set_Temper<=(Temp_Indoor+4))&&F_FanSpeed_High&&SysTimerStr.Timer_2sFanRun==0)
					{ _asm nop;
						OUT0_LF = 0;
						OUT1_MF = 0;
						OUT2_HF = 0;
						SysTimerStr.Timer_300msFanSpdSW = 60;//fan speed switching delay
						F_FanSpeed_Low = 0;
						F_FanSpeed_Mid = 1;
						F_FanSpeed_High = 0;
						FanSpeedBak = 0b00000101;
					}
					/*if((OUT1_MF==0)&&(F_FanSpeed_Mid==1)&&(SysTimerStr.Timer_300msFanSpdSW==0))
					{
						OUT0_LF = 0;
						OUT1_MF = 1;
						OUT2_HF = 0;
					}*/
//-------------------------------					
					if((Set_Temper<=(Temp_Indoor+0))&&F_FanSpeed_Mid&&SysTimerStr.Timer_2sFanRun==0)
					{ _asm nop;
						OUT0_LF = 0;
						OUT1_MF = 0;
						OUT2_HF = 0;
						SysTimerStr.Timer_300msFanSpdSW = 60;//fan speed switching delay
						F_FanSpeed_Low = 1;
						F_FanSpeed_Mid = 0;
						F_FanSpeed_High = 0;
						FanSpeedBak = 0b00001001;
					}
					if(!OUT0_LF&&F_FanSpeed_Low&&SysTimerStr.Timer_300msFanSpdSW==0)
					{ _asm nop;
						OUT0_LF = 1;
						OUT1_MF = 0;
						OUT2_HF = 0;
						SysTimerStr.Timer_2sFanRun = 3;
					}
//-------------------------------					
					if((Set_Temper>=(Temp_Indoor+2))&&F_FanSpeed_Low&&SysTimerStr.Timer_2sFanRun==0)
					{ _asm nop;
						OUT0_LF = 0;
						OUT1_MF = 0;
						OUT2_HF = 0;
						SysTimerStr.Timer_300msFanSpdSW = 60;//fan speed switching delay
						F_FanSpeed_Low = 0;
						F_FanSpeed_Mid = 1;
						F_FanSpeed_High = 0;
						FanSpeedBak = 0b00000101;
					}
					/*if((OUT1_MF==0)&&(F_FanSpeed_Mid==1)&&(SysTimerStr.Timer_300msFanSpdSW==0))
					{
						OUT0_LF = 0;
						OUT1_MF = 1;
						OUT2_HF = 0;
					}*/
//-------------------------------					
					if((Set_Temper<=(Temp_Indoor+0))&&F_FanSpeed_Mid&&SysTimerStr.Timer_2sFanRun==0)
					{ _asm nop;
						OUT0_LF = 0;
						OUT1_MF = 0;
						OUT2_HF = 0;
						SysTimerStr.Timer_300msFanSpdSW = 60;//fan speed switching delay
						F_FanSpeed_Low = 1;
						F_FanSpeed_Mid = 0;
						F_FanSpeed_High = 0;
						FanSpeedBak = 0b00001001;
						SysTimerStr.Timer_2sFanRun = 3;
					}
					/*if((OUT0_LF==0)&&(F_FanSpeed_Low==1)&&(SysTimerStr.Timer_300msFanSpdSW==0))
					{
						OUT0_LF = 1;
						OUT1_MF = 0;
						OUT2_HF = 0;
					}*/
				}
			}
		}
}
/////////////////////////////////
void	Cool_Mode(void)
{
  if(!F_SysMode_On||F_Comp4WVFault||F_Defrost_Start||F_Defrost_End||F_SensorFault_P)	return;
  if(F_SysMode_Cool)
  {
  	if(F_RunMode_Heat)
  	{
  		F_Comp1thRun = 0;
  		F_Diagnostic_End = 1;
  		F_Disp_E4 = 0;
    	F_BlnakingCHLed = 0;
  	}
  	if(!F_RunMode_Cool&&(OUT5_ODF||OUT6_COMP))
  	{
  		OUT5_ODF = 0;
			OUT6_COMP = 0;
			F_Comp_On = 0;
  		SysTimerStr.Timer_60sCompOff = 60;			
  	}
  	F_RunMode_Cool = 1;
  	F_RunMode_Heat = 0;
  	if(SysTimerStr.Timer_180sPowerOn==0||F_PowDn3Minu)
  	{
  		if(Temp_Indoor>=(Set_Temper+2)&&(SysTimerStr.Timer_180sCompOff==0||F_PowDn3Minu)&&!OUT4_4WV)
  		{
  			if(F_Comp_On==0)
  			{	
  				SysTimerStr.Timer_120sCompRun = 120;	//comp 120s minimum run time
  			}
  			SysTimerStr.Timer_10minCompOff = 10;
  			F_Comp_On = 1;	//comp run flag
  			F_OutFan_On = 1;	//outfan run 2s then comp cut in
  		}
  		if(Set_Temper>=(Temp_Indoor+2)&&SysTimerStr.Timer_120sCompRun==0)
  		{
  			if(F_Comp_On)
  			{
  				SysTimerStr.Timer_180sCompOff = 180;	//comp 3min protect
  				SysTimerStr.Timer_60sCompOff = 60;
  				SysTimerStr.Timer_10minCompOff = 10;
  			}
  			F_Comp_On = 0;	//comp stop flag
  		}
  	}
  }
}
/////////////////////////////////

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?