⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 本程序是一个人机接口程序
💻 C
📖 第 1 页 / 共 4 页
字号:
				ShowChar(line,25,Supply_Voltage_Lower_Bound%10+0x30);
				break;
		case 13:for(i=0;i<6;i++) ShowChar(line,21+i,password_user[i]);
				 break; 
		case 14: ShowChar(line,25,High_temperatuer_Off_Delay+0x30);
				break;
		case 15: ShowChar(line,14,ucCurtime[6]/16+0x30);
				 ShowChar(line,15,ucCurtime[6]%16+0x30);
				 ShowChar(line,17,ucCurtime[4]/16+0x30);
				 ShowChar(line,18,ucCurtime[4]%16+0x30);
				 ShowChar(line,20,ucCurtime[3]/16+0x30);
				 ShowChar(line,21,ucCurtime[3]%16+0x30);
				 ShowChar(line,23,ucCurtime[2]/16+0x30);
				 ShowChar(line,24,ucCurtime[2]%16+0x30);
				 ShowChar(line,26,ucCurtime[1]/16+0x30);
				 ShowChar(line,27,ucCurtime[1]%16+0x30);
				 break;
		case 16: break;
	}
}

void Modi_RealTime(unsigned char Line_On_Page)
{
	
	unsigned char xdata p[10]={"----------"};				  //年月日时分五个数值,每个数值两位
	unsigned char code w[10]={14,15,17,18,20,21,23,24,26,27}; //时间数值每一位在LCD上显示的位置
	unsigned char i,j;

	ReverseShowLine(14,Line_Right,Line_On_Page+1);
	for(i=0;i<10;i++) ShowChar(Line_On_Page+1,w[i],p[i]);
    ReverseShowLine(14,Line_Right,Line_On_Page+1);
	j=0;
	while(1)
	{
	 	feeddog();
		if(key==100) continue;
		CH452_Write(CH452_SYSOFF);		           //关键盘中断
		if(key<10 && j<10)  
		{								           //数值键输入
			if(j==3 && p[2]=='0' && key==0) ;	   //禁止输入00月
			else if(j==3 && p[2]=='1' && key>2);   //禁止输入12以上月份
			else if(j==5 && p[4]=='0' && key==0);  //禁止输入00日
			else if(j==4 && key>3);			       //禁止输入31日以上日
			else if(j==5 && p[4]=='3' && key>1);   //禁止输入31日以上日
			else if(j==7 && p[6]=='2' && key>3);   //禁止输入23以上时
			else if(j==8 && key>5);			       //禁止输入59以上分
			else 
			{	
				p[j++]=key+0x30;
				ReverseShowLine(14,Line_Right,Line_On_Page+1);
				for(i=0;i<10;i++) ShowChar(Line_On_Page+1,w[i],p[i]);
				ReverseShowLine(14,Line_Right,Line_On_Page+1);
			}
		}	
		else if(key==10 && j!=0)		   //后退,错误输入
		{
			p[--j]='-';
			ReverseShowLine(14,Line_Right,Line_On_Page+1);
			for(i=0;i<10;i++) ShowChar(Line_On_Page+1,w[i],p[i]);
			ReverseShowLine(14,Line_Right,Line_On_Page+1);
		}
		else if(key==11 && j==10)		   //确认键
		{
			ucCurtime[0]=0x30;					   //修改时间时,将秒固定设置为中间值30秒
			ucCurtime[1]=(p[8]-0x30)*16+p[9]-0x30; //分
			ucCurtime[2]=(p[6]-0x30)*16+p[7]-0x30; //时
			ucCurtime[3]=(p[4]-0x30)*16+p[5]-0x30; //日
			ucCurtime[4]=(p[2]-0x30)*16+p[3]-0x30; //月
			ucCurtime[6]=(p[0]-0x30)*16+p[1]-0x30; //年
			Set1302(ucCurtime);                    //写入以上数据
		 	return ;	
		}
		key=100;						   //重置键盘码为无效值
		CH452_Write(CH452_SYSON2W);	   //配置CH452为两线制方式,SDA用做按键中断输出
	 }
}
//登入系统
//返回0:密码错误
//返回1:用户密码正确
//返回2:管理员密码正确
//返回3:试用解锁
//返回4:查阅历史记录
unsigned char Log_in(void)
{
	unsigned char i;
	unsigned char password_in[6];

	InitLCD();							   //LCD预置
	Show_logo();                           //显示厂商标识
	ShowLine(3,17,"输入密码");
	ShowChar(4,17,'_');
	ShowLine(7,2,"湘潭大众整流器制造有限公司");
	ReverseShowLine(0,30,7);			   //反白显示最下一行
	i=0;								   //将密码输入的位数置0
	Get_temperatuer();                     //预读温度,因第一次读温度会是85度
	key=100;
	ENABLE_KEY_INTERRUPT;
	CH452_Write(CH452_SYSON2W);	           //配置CH452为两线制方式,SDA用做按键中断输出


	while(1)
	{	
		feeddog();
		if(key>11) continue;
		CH452_Write(CH452_SYSOFF);		   //关键盘中断
		if(key<10 && i<6)  
		{								   //数值键输入
			password_in[i]=key+0x30;
			ShowChar(4,17+i,'*');		   //*掩盖密码
			i++;
			if(i!=6) ShowChar(4,17+i,'_');
		}	
		else if(key==10 && i!=0)		   //后退,错误输入
		{
		 	ShowChar(4,17+i,' ');
			i--;
		 	ShowChar(4,17+i,'_');
			password_in[i]=0;
		}
		else if(key==11 && i==6)		   //确认键
		{
			for(i=0;i<6;i++) if(password_in[i]!=password_admin[i]) break;	
			if(i==6)
			{
				ClearScreen();			   //清屏
				return 2;				   //超级用户登入.返回2
			}
			for(i=0;i<6;i++) if(password_in[i]!=password_xzy[i]) break;	
			if(i==6)
			{
				ClearScreen();			   //清屏
				return 2;				   //超级用户登入.返回2
			}
			for(i=0;i<6;i++) if(password_in[i]!=Sample_Password[i]) break;	
			if(i==6 && Sample_flag)
			{
				Sample_flag=0;
				Write_system_set();
				ClearScreen();			   //清屏
				return 3;				   //解锁登入.返回3
			}
			for(i=0;i<6;i++) if(password_in[i]!=password_user[i]) break;	
			if(i==6) 
			{
				ClearScreen();	           //清屏
				return 1;				   //用户登入,返回1
			}
			/*
			for(i=0;i<6;i++) if(password_in[i]!=password_fault[i]) break;	
			if(i==6) 
			{
				ClearScreen();	           //清屏
				return 4;				   //用户登入,返回4
			}
			*/
       	    ShowChar(4,17,'_');	           //密码错误,自动清除,等待重新输入
			for(i=1;i<6;i++) ShowChar(4,17+i,' ');
			i=0;
		}
		CH452_Write(CH452_SYSON2W);	       //配置CH452为两线制方式,SDA用做按键中断输出
		key=100;						   //重置键盘码为无效值
	}
}

void User_setup(void)
{
	unsigned char i,j;
	unsigned char line=1; //行	
	unsigned char Rev_Line_On_Page=1;
	unsigned char *s;
	#define Line_Max_UserSet 16
	#define Line_Left 4
	#define Line_Right 28
	
	unsigned char code temp[Line_Max_UserSet][25]={
		{" 1,故障列表             "},
		{" 2,开闭环选择:          "},
		{" 3,闭环工作模式:        "},
		{" 4,电流给定值:        A "},
		{" 5,电压给定值:        V "},
		{" 6,过流值:            A "},
		{" 7,过压值:            V "},
		{" 8,变压器温上限:      ℃"},
		{" 9,水温上限:          ℃"},
		{"10,排温上限:          ℃"},
		{"11,网电电压上限:      V "},
		{"12,网电电压下限:      V "},
		{"13,用户密码:            "},
		{"14,高温封脉时间:      分"},
		{"15,时间:    /  /     :  "},
		{"16,系统设定             "},
		
	};
	ClearScreen();			   //清屏	
	ShowLine(0,10,"* 设  定 *");
	for(i=0;i<6;i++) ShowLine(2+i,4,temp[i]);
	for(i=0;i<6;i++) Show_user_set_value(2+i,i+1);
	
	ReverseShowLine(Line_Left,Line_Right,2);	//反白显示第三行
	key=100;
	ENABLE_KEY_INTERRUPT;
	CH452_Write(CH452_SYSON2W);	           //配置CH452为两线制方式,SDA用做按键中断输出
	while(1)
	{
		feeddog();
		if(key==100) continue;
		CH452_Write(CH452_SYSOFF);		   //关键盘中断
		if(key==15)	 //下
		{
			if(line==Line_Max_UserSet) 
			{
				key=100;
				CH452_Write(CH452_SYSON2W);	           //配置CH452为两线制方式,SDA用做按键中断输出
				continue; 
			}
			line++;
			ReverseShowLine(Line_Left,Line_Right,Rev_Line_On_Page+1);
			Rev_Line_On_Page++;

			if(Rev_Line_On_Page==7)   
			{
				for(i=0;i<6;i++) ShowLine(2+i,4,temp[i+line-6]);
				for(i=0;i<6;i++) Show_user_set_value(2+i,i+line-5);
				ReverseShowLine(Line_Left,Line_Right,7);
				Rev_Line_On_Page=6;
			}
			else ReverseShowLine(Line_Left,Line_Right,Rev_Line_On_Page+1);
		} 
		if(key==14)	 								   //上
		{
			if(line==1) 
			{
				key=100;
				CH452_Write(CH452_SYSON2W);	           //配置CH452为两线制方式,SDA用做按键中断输出
				continue; 
			}
			line--;
			ReverseShowLine(Line_Left,Line_Right,Rev_Line_On_Page+1);
			Rev_Line_On_Page--;
			if(Rev_Line_On_Page==0)   
			{
				for(i=0;i<6;i++) ShowLine(2+i,4,temp[i+line-1]);
				for(i=0;i<6;i++) Show_user_set_value(2+i,i+line);
				ReverseShowLine(Line_Left,Line_Right,2);
				Rev_Line_On_Page=1;
			}
			else ReverseShowLine(Line_Left,Line_Right,Rev_Line_On_Page+1);
			
		}	
		if(key==16)                                    //ESC
		{
			Write_system_set();
			ClearScreen();			                   //清屏
			Show_1_page();					           //显示第一页
			Output_control();
			Alarm_old=0xff;
			Show_Alarm_prompt();
			key=100;
			CH452_Write(CH452_SYSON2W);	               //配置CH452为两线制方式,SDA用做按键中断输出
			return;
		}
		if(key==11)                                    //确定键
		{
			switch(line)
			{
			 	case 1: ClearScreen();			       //清屏
						Show_Fault_List();
						ClearScreen();			       //清屏
						Show_1_page();				   //显示第一页
						Output_control();
						Alarm_old=0xff;
						Show_Alarm_prompt();
						key=100;
						CH452_Write(CH452_SYSON2W);	   //配置CH452为两线制方式,SDA用做按键中断输出
						return;                        //直接退回用户界面
				case 2: if(Loop_state==1) Loop_state=0;//开闭环翻转
						else Loop_state=1;
					 	ReverseShowLine(23,Line_Right,Rev_Line_On_Page+1);
						Show_user_set_value(Rev_Line_On_Page+1,line);
						ReverseShowLine(23,Line_Right,Rev_Line_On_Page+1);
						for(i=0;i<200;i++) for(j=0;j<200;j++);//delay
						break;
			 	case 3: if(Loop_mode==1) Loop_mode=0;
						else Loop_mode=1;
					 	ReverseShowLine(23,Line_Right,Rev_Line_On_Page+1);
						Show_user_set_value(Rev_Line_On_Page+1,line);
						ReverseShowLine(23,Line_Right,Rev_Line_On_Page+1);
						for(i=0;i<200;i++) for(j=0;j<200;j++);//delay
						break;
				case 4: Current_Set_value=(unsigned int)Input_value(Rev_Line_On_Page,5);
						break;
				case 5: Voltage_Set_value=(unsigned int)Input_value(Rev_Line_On_Page,3);
						break;
				case 6: Current_Upper_Bound=(unsigned int)Input_value(Rev_Line_On_Page,5);
						break;
				case 7: Voltage_Upper_Bound=(unsigned int)Input_value(Rev_Line_On_Page,3);
						break;
				case 8: Temperatuer_Transformator_Upper_Bound=(unsigned char)Input_value(Rev_Line_On_Page,2);
						break;
				case 9: Temperatuer_Water_Upper_Bound=(unsigned char)Input_value(Rev_Line_On_Page,2);
						break;
				case 10: Temperatuer_Panel_Upper_Bound=(unsigned char)Input_value(Rev_Line_On_Page,2);
						break;
				case 11: Supply_Voltage_Upper_Bound=Input_value(Rev_Line_On_Page,9);
						break;						
				case 12: Supply_Voltage_Lower_Bound=Input_value(Rev_Line_On_Page,9);
						break;
				case 13: s=Modify_Password(Rev_Line_On_Page);
					    for(i=0;i<6;i++) password_user[i]=s[i];
						break; 
				case 14: High_temperatuer_Off_Delay_Set=(unsigned char)Input_value(Rev_Line_On_Page,1);
						 break;
				case 15: Modi_RealTime(Rev_Line_On_Page);
						 break;
				case 16: while(Log_in()!=2);
						 ClearScreen();
						 Sys_setup();
						 ClearScreen();			       //清屏
						 Show_1_page();				   //显示第一页
						 Output_control();
						 Alarm_old=0xff;
						 Show_Alarm_prompt();
						 return;                       //直接返回用户界面
			}
		} 	
		key=100;
		CH452_Write(CH452_SYSON2W);	                   //配置CH452为两线制方式,SDA用做按键中断输出
	}
}



//显示温度
void Show_Temperatuer(void)
{
	unsigned char i;

	Get_temperatuer();                                 //读取四个温度数值
	//如果读出的数值有一个是85度.则再读多次,以防止18B20在第一次读温度时是原始值85
	if (temperatuer_val[0]==85 || temperatuer_val[1]==85 || temperatuer_val[2]==85 || temperatuer_val[3]==85) 
	{
		for(i=0;i<100;i++) 
		{
			feeddog();
			Get_temperatuer();      
			if(temperatuer_val[0]!=85) i=100;
		}
	}
	//水温
	if(temperatuer_val[0]/10) ShowChar(5,24,temperatuer_val[0]/10+0x30);
	else ShowChar(5,24,' ');
	ShowChar(5,25,temperatuer_val[0]%10+0x30);
	
	//变压器温度
	if(temperatuer_val[3]/10) ShowChar(4,24,temperatuer_val[3]/10+0x30);
	else ShowChar(4,24,' ');
	ShowChar(4,25,temperatuer_val[3]%10+0x30);
	//排温,母排和副排选择温度较高的一个显示
	if(temperatuer_val[2]>temperatuer_val[1]) i=temperatuer_val[2];
	else i=temperatuer_val[1];
	if(i/10) ShowChar(5,8,i/10+0x30);
	else ShowChar(5,8,' ');
	ShowChar(5,9,i%10+0x30);
}

//给定值调整
//UD=1升,UD=-1降
void Set_value_Adj(signed char UD)
{
	if(Loop_mode==1)  //稳压
	{
		if(Voltage_Set_value>Voltage_Measuring_Range && UD==1) return;
		if(Voltage_Set_value==0 && UD==-1) return;
		Voltage_Set_value+=UD;
	}	
	else 
	{
		if(Current_Set_value+10>Current_Measuring_Range && UD==1) return;
		if(Current_Set_value<10 && UD==-1) 
		{
			Current_Set_value=0;
			Show_Preset();
			return;	 	
		}
		Current_Set_value+=UD*10;
	}
	Show_Preset();
}


//远控按钮输入
void Scan_Remoto_key(void)
{
	unsigned char s[INPUT_RETRY_TIMES];
	unsigned char i,j;

	P4_1=1;                                //将远控按键输入选通到P0
	P4_2=1;
	P4_3=0;	
	for(i=0;i<INPUT_RETRY_TIMES;i++)	   //间隔时间连读3次,如数据不一致则判断为干扰,丢弃
	{
		s[i]=P0|0xc0;
		delay(INPUT_RETRY_DELAY);		   //读取的延时请测试和调整
	}
	P4_1=1;
	P4_2=1;
	P4_3=1;
	
	if(s[0]==0xff) return;
	if((s[0]&0x01)!=0x01)                     //故障复位
	{
		for(i=3;i<12;i++) Set_Relay(i,0);  //报警继电器全部释放
		Set_Relay(2,0);                    //封脉继电器释放
	 	Set_Relay(12,0); 				   //跳闸继电器释放
		Alarm=0;
		Show_Alarm_prompt();
		BEEP=1;                            //关闭报警声音
		sound=0;
	}
	if((s[0]&0x02)!=0x02)                     //远控启动
	{
	 	BEEP=0;
	   	for(i = 0;i < 200;i++) for(j = 0;j < 200;j++);
		if(!sound) BEEP = 1;
		system_staus=1;
		Set_Relay(13,1);
		ShowLine(0,12,"运行");
		Preset(0);    //软给定
	}
	if((s[0]&0x04)!=0x04)                     //远控停止
	{
	 	BEEP=0;
	   	for(i = 0;i < 200;i++) for(j = 0;j < 200;j++);
		if(!sound) BEEP = 1;
		system_staus=0;
		Set_Relay(13,0);
		Set_DAC(1,0);                      //0输出
		ShowLine(0,12,"停止");
	}
	if((s[0]&0x08)!=0x08)                     //远控电流升
	{
		BEEP=0;
	   	for(i = 0;i < 200;i++) for(j = 0;j < 200;j++);
		if(!sound) BEEP = 1;
		if(system_staus != 0)
		{
			Set_value_Adj(1);              //直接输出给定
			Preset(1);
		}
	}
	if((s[0]&0x10)!=0x10)                  //远控电流降
	{
	 	BEEP=0;
	   	for(i = 0;i < 200;i++) for(j = 0;j < 200;j++);
		if(!sound) BEEP = 1;		
		if(system_staus != 0)
		{
			Set_value_Adj(-1);             //直接输出给定
			Preset(1);
		}

⌨️ 快捷键说明

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