📄 main.c
字号:
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 + -