output.c

来自「电表解决方案概要power_meter_r8c2g_source_code」· C语言 代码 · 共 1,132 行 · 第 1/2 页

C
1,132
字号

#include "sfr_r82b.h"
#include "disp_definel.h"
#include "main_define.h"
#include "Iic.h"


//#pragma SECTION program pro_4

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

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

void water_detect(void);				/* Debugging Mode 下水位检测,当J1 状态为"ON"时,表示水位到达设定水位 */
void wash_detect(void);					/* Debugging Mode 洗涤时间检测,当J2 状态为"ON"时,修改洗涤和浸泡的时间 */
void ac_freqcy_detect(void);			/* AC 电源频率检测 */
void lid_detect(void);					/* 门开关检测 */
void unbalance_detect(void);			/* 不平衡检测 */
                 
/******************************************************************************************

void alarm(void): 留水和错误报警处理程序,当留水或错误释放后程序继续运行

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

void alarm(void)
{
 if (err_buff)
  {
	  run_err_flag = 1;	  
	  	 	  
	  switch (err_buff)
	  {
		  case PRESET_LID_ERR:				/* 预约开盖处理 */
		  
		  if (lid_open == 0)
		   {
			  lid_open_close_flag = 0;			   
		  	  err_buff = 0;		 
		  	  status_buff = RUN;
			  
		  	  program_start_flag = 1;
		  	  program_pause_flag = 0;	
			  		  
			  buzz_flag = 0;
			  run_err_flag = 0;
			  
	    	  Pflash = 0;
	    	  Tflash = 0;						
	    	  Pflash_switch_flag = 0x00;	
	    	  run_page3_flag = 0;			  			  
		   }
		  break;
		  
		  
		  case DRAIN_ERR:					/* 排水错误处理 */
		  
		  if (lid_open_close_flag == 1)
		   {
			  lid_open_close_flag = 0;
		  	  err_buff = 0;		 
		  	  status_buff = RUN;
		  	  program_start_flag = 1;
		  	  program_pause_flag = 0;			  
			  buzz_flag = 0;	
			  run_err_flag = 0;		
			  
	    	  Pflash = 0;
	    	  Tflash = 0;						
	    	  Pflash_switch_flag = 0x00;
	    	  run_page3_flag = 0;					  				  	  		  
		   }			  		  
		  break;
		  
		  
		  case OPEN_LID_ERR:				/* 开盖异常处理 */
		  
		  if (lid_open == 0)
		   {
			  lid_open_close_flag = 0;			   
		  	  err_buff = 0;		 
		  	  status_buff = RUN;
		  	  program_start_flag = 1;
		  	  program_pause_flag = 0;			  
			  buzz_flag = 0;	
			  run_err_flag = 0;		
			  
	    	  Pflash = 0;
	    	  Tflash = 0;						
	    	  Pflash_switch_flag = 0x00;	
	    	  run_page3_flag = 0;					  			  	  		  
		   }		  		  
		  break;
		  
		  
		  case SPIN_UNBALAN_ERR:			/* 脱水撞桶处理 */
		  
		  if (lid_open_close_flag == 1)
		   {
			  lid_open_close_flag = 0;
		  	  err_buff = 0;		 
		  	  status_buff = RUN;
		  	  program_start_flag = 1;
		  	  program_pause_flag = 0;			  
			  buzz_flag = 0;	
			  run_err_flag = 0;		
			  
	    	  Pflash = 0;
	    	  Tflash = 0;						
	    	  Pflash_switch_flag = 0x00;	
	    	  run_page3_flag = 0;					  			  	  		  
		   }			  		  
		  break;
		  
		  
		  case INLET_ERR:					/* 进水异常处理 */
		  
		  if (lid_open_close_flag == 1)
		   {
			  lid_open_close_flag = 0;
		  	  err_buff = 0;		 
		  	  status_buff = RUN;
		  	  program_start_flag = 1;
		  	  program_pause_flag = 0;			  
			  buzz_flag = 0;	
			  run_err_flag = 0;	
			  
	    	  Pflash = 0;
	    	  Tflash = 0;						
	    	  Pflash_switch_flag = 0x00;	
	    	  run_page3_flag = 0;					  			  		  		  
		   }			  
		  break;
		  
		  
		  case INLET_OVTIME_ERR:			/* 进水超时处理 */
		  
		  if (lid_open_close_flag == 1)
		   {
			  lid_open_close_flag = 0;
		  	  err_buff = 0;		 
		  	  status_buff = RUN;
		  	  program_start_flag = 1;
		  	  program_pause_flag = 0;			  
			  buzz_flag = 0;	
			  run_err_flag = 0;			
			  
	    	  Pflash = 0;
	    	  Tflash = 0;						
	    	  Pflash_switch_flag = 0x00;	
	    	  run_page3_flag = 0;					  			    		  
		   }			  
		  break;		  		  		  		  		  
		  
	  };
	  
  }
 
 if (run_save_water_flag == 1)	
  {
	  status_buff = STOP;
	  buzz_flag = 1;				/* 置蜂鸣标志 */
  }
 if (run_err_flag == 1)
  {
	  status_buff = STOP;	  
	  buzz_flag = 1;				/* 置蜂鸣标志 */
  }

}

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

void input(void),外部输入处理含函数 
   
****************************************************************/

void input(void)
{
	water_detect();			/* 调用水位检测 */
	wash_detect();			/* 调用洗涤时间检测 */
	ac_freqcy_detect();		/* 调用AC 电源频率检测 */
	lid_detect();			/* 调用门开关检测 */
	unbalance_detect();		/* 调用不平衡检测 */
}

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

void output(void),输出处理含函数 
   
****************************************************************/

void output(void)
{
	unsigned char i;
	unsigned char j;
	unsigned char k;
	
//  buzz();
	
  i = output_buff;
	
  if (i == 0)			/* 输出存储变量为0,清零 AC 端口输出 */
   {
	   CW_OPT = 0; 
	   CW_OPT_1 =0;			  
			  
	   Drain_OPT = 0;
	   Drain_OPT_1 = 0;
			  
	   Inlet_OPT = 0;
	   Inlet_OPT_1 = 0;
			  
	   SOF_Inlet_OPT = 0;
	   SOF_Inlet_OPT_1 = 0;
			  
	   CCW_OPT = 0;
	   CCW_OPT_1 = 0;
			  
	   Break_OPT = 0;
	   Break_OPT_1 = 0;
			  
	   ACOFF_OPT = 0;
	   ACOFF_OPT_1 = 0;		 
   }
  else if (i != 0)
   {
	for (j = 0; j < 8; j++)
	 {
		 k = (OPT_Table[j] & i);
		 if (k)
		 continue;
		 
		 switch (OPT_Table[j])			/* 输出存储变量不为0,先清零输出为0的端口 */
		  {
			  case CW:
		 
			  CW_OPT = 0; 
			  CW_OPT_1 =0;			  
			  break;
			  
			  
			  case DRAIN:
			  
			  Drain_OPT = 0;
			  Drain_OPT_1 = 0;
			  break;
			  
			  
			  case INLET:
			  
			  Inlet_OPT = 0;
			  Inlet_OPT_1 = 0;
			  break;		
			  
			  
			  case SOFNER:
			  
			  SOF_Inlet_OPT = 0;
			  SOF_Inlet_OPT_1 = 0;
			  break;	
			  
			  case CCW:
			  
			  CCW_OPT = 0;
			  CCW_OPT_1 = 0;
			  break;
			  
			  case BREAK:
			  
			  Break_OPT = 0;
			  Break_OPT_1 = 0;
			  break;		
			  
			  
			  case ACOFF:
			  
			  ACOFF_OPT = 0;
			  ACOFF_OPT_1 = 0;
			  break;				  			  	  
		  }
	 }	   
	for (j = 0; j < 8; j++)
	 {
		 k = (OPT_Table[j] & i);
		 if (!k)
		 continue;
		 
		 switch (OPT_Table[j])			/* 输出存储变量不为0,清零输出为0的端口后置位输出不为0的端口 */
		  {
			  case CW:
			  
			  CW_OPT = 1;
			  CW_OPT_1 = 1;	  
			  break;
			  
			  
			  case DRAIN:
			  
			  Drain_OPT = 1;
			  Drain_OPT_1 = 1;
			  break;
			  
			  
			  case INLET:
			  
			  Inlet_OPT = 1;
			  Inlet_OPT_1 = 1;
			  break;		
			  
			  
			  case SOFNER:
			  
			  SOF_Inlet_OPT = 1;
			  SOF_Inlet_OPT_1 = 1;
			  break;	
			  
			  case CCW:
			  
			  CCW_OPT = 1;
			  CCW_OPT_1 = 1;
			  break;
			  
			  case BREAK:
			  
			  Break_OPT = 1;
			  Break_OPT_1 = 1;
			  break;		
			  
			  
			  case ACOFF:
			  
			  ACOFF_OPT = 1;
			  ACOFF_OPT_1 = 1;
			  break;				  			  	  
		  }
	 }
   }
   
  return;
  
}

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

void water_detect(void),J1输入判定处理函数,当J3=1时,J1为水位检测 
											 
*************************************************************************/

void water_detect(void)
{
	unsigned char i;
	
	machine_type = J3;
	
	if (machine_type == 0)								/* 检测到J3输入为0 */
	 {
		 if ((output_buff & INLET) != 0);				/* 检测进水是否运行 */
		  {
			  if (inlet_2m_buff <= 30)					/* 进水运行 90s 时,修改水位暂存器为达到设定值 */
			   {
				    water_buff = water_level_buff;
		 			water_full_flag = 1;
		 			drain_empty_flag = 0;				   
			   }
			  
		  }
		  
		 if ((output_buff & DRAIN) != 0);				/* 检测排水是否运行 */
		  {
			  if (drain_2m_buff <= 30)					/* 排水运行 90s 时,修改水位暂存器为水排空 */
			   {
		 			water_buff = 0;
		 			water_full_flag = 0;				   
			   }
			  
		  }		  	
		    
		 return;							/* 返回 */
		 
	 }
	
	i = J1;							/* 当检测到J3输入为1,检测J1判定水位是否达设定水位 */
	
	if (i != 0)								/* J1输入为1,置水位状态为达到设定水位 */
	water_buff = water_level_buff;
	else if (i == 0)						/* J1输入为0,置水位状态为水排空 */
	water_buff = 0;
	
	if (water_buff == water_level_buff)
	 {
		 water_full_flag = 1;				/* 置水位标志 */
		 drain_empty_flag = 0;
	 }
	else if ((water_buff < water_level_buff)||(water_buff == 0))
	water_full_flag = 0;					/* 清水位标志 */
	return;
}

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

void wash_detect(void),J2输入判定处理函数,当J3=1时,J2浸泡洗涤时间修改判定检测 
											 
*********************************************************************************/

void wash_detect(void)
{
	unsigned char j;
	
	machine_type = J3;
	
	if (machine_type == 0)				/* 检测到J3输入为0,返回 */
	return;	
	
	j = J2;								/* 检测到J3输入为1,检测J2 */
	
	if (j != 0)							/* 检测到J2输入为1,修改浸泡,洗涤时间 */
	 {
		run_stream_time = 30;			
		
  		soak_1m_buff = 30;
  		soak_2m_buff = 30;
  		soak_3m_buff = 30;
  		soak_4m_buff = 30;
  		soak_9m_buff = 30;
		process_left_time = 30;
	 }
	
	return;
}

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

void lid_detect(void),J1输入判定处理函数,当J3=0时,J1为门开关检测 
											 
*********************************************************************************/

void lid_detect(void)
{
	unsigned char j;
		
	machine_type = J3;
	
	if (machine_type == 0)					/* 检测到J3输入为0 */
	 {
		 j = J1;							/* 检测到J2 */
		 
		 if (j != save_lid_status)
		  {			  
			  if (save_lid_status == 0)
			   {
				   if((run_err_flag == 1)||(run_save_water_flag == 1))
				   lid_open_close_flag = 1;
			   }	
			   		  
			  save_lid_status = j;		
			  	  			  
		  }		 
		  
		 if (j == 1)						/* J1 = 1, 门关 */
		  {
			  lid_open = 0;
		  }
		  
		 if (j == 0)						/* J1 = 0, 门开 */
		  {
			  lid_open = 1;
		  }		  
		  
	 }
	 
}

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

void unbalance_detect(void),J2输入判定处理函数,当J3=0时,J2为不平衡检测 
											 
*********************************************************************************/

void unbalance_detect(void)
{	
	unsigned char j;
			
	machine_type = J3;
	
	if (machine_type == 0)								/* 检测到J3输入为0 */
	 {
		 j = J2;										/* 检测到J2 */
		 
		 if (j == 0)
		  {
			 if ((program_buff == Special_PGM)&&(status_buff == RUN))
			 err_buff = SPIN_UNBALAN_ERR;
			 
			 else 
			  {
				  if (((output_buff & CW) != 0)||((output_buff & CCW) != 0))
			 	  unbalance_count ++;	
					
			 	  if (unbalance_count == 3)
			 	  {
			 		  unbalance_count = 0;
			 		  unbalance_flag = 1;
					  err_buff = SPIN_UNBALAN_ERR;
			 	  }		

			  }

		  }
	 }
}

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

void ac_freqcy_detect(void),AC电源频率检测,通过INT2计数变量确定频率值
											 
*********************************************************************************/

void ac_freqcy_detect(void)
{
	
	if ((ac_frequency >= 49)&&(ac_frequency <= 51))
	ac_frequency = 50;
	
	else if ((ac_frequency >= 59)&&(ac_frequency <= 61))
	ac_frequency = 60;
	
}

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

void demo_judge(void),通过检测J3,判断是否运行demo程序
											 
*********************************************************************************/

void demo_judge(void)
{
	machine_type = J3;	
	
	if (machine_type == 0)					/* 运行demo程序,初始化环境变量 0 */
	 {
		run_demo_flag = 1;
		
		menu_level_buff = Menu_Level_4;
		
		program_buff = Memo_PGM;				

	 }
	 
	 else 
	 run_demo_flag = 0;

}

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

unsigned char program_time(unsigned char far * table_adr, unsigned char table_colum),

计算所选程序运行所需要的时间和已运行时间,返回剩余时间;计算方法为根据程序时间表计算总
时间,然后根据操作计数器和过程剩余时间计算已运行时间,最后得出程序运行剩余时间

***************************************************************************************/
unsigned char program_time(unsigned char far * table_adr, unsigned char table_colum)
{
	unsigned char i;
	

⌨️ 快捷键说明

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