📄 main.c
字号:
Loop_state=byte_read(0x802A); //开闭环状态
High_temperatuer_Off_Delay_Set=byte_read(0x802B); //高温封脉时间
Days_Passed=byte_read(0x8400)*256+byte_read(0x8401); //已使用天数
ADC0_coefficients=byte_read(0x802c)*65536+byte_read(0x802d)*256+byte_read(0x802e); //ADC0系数
ADC1_coefficients=byte_read(0x802f)*65536+byte_read(0x8030)*256+byte_read(0x8031); //ADC1系数
ADC2_coefficients=byte_read(0x8032)*65536+byte_read(0x8033)*256+byte_read(0x8034); //ADC2系数
ADC3_coefficients=byte_read(0x8035)*65536+byte_read(0x8036)*256+byte_read(0x8037); //ADC3系数
ADC3_start_coefficients=byte_read(0x8038)*256+byte_read(0x8039); //ADC3底端系数
Voltage_Preset_coefficients=byte_read(0x803A)*256+byte_read(0x803B); //电压给定DAC系数
Current_Preset_coefficients=byte_read(0x803C)*256+byte_read(0x803D); //电流给定DAC系数
}
//写入系统设置
void Write_system_set(void)
{
unsigned char i;
sector_erase(0x8000); //擦除扇区
byte_program(0x8000,Loop_mode); //系统模式,1稳压,0稳流
byte_program(0x8001,Current_Measuring_Range/256);
byte_program(0x8002,Current_Measuring_Range%256); //输出电流量程
byte_program(0x8003,Voltage_Measuring_Range/256);
byte_program(0x8004,Voltage_Measuring_Range%256); //输出电压量程
byte_program(0x8005,Supply_Voltage_Measuring_Range/65536);
byte_program(0x8006,Supply_Voltage_Measuring_Range%65536/256);
byte_program(0x8007,Supply_Voltage_Measuring_Range%256); //网电压量程
byte_program(0x8008,Supply_Voltage_Upper_Bound/65536);
byte_program(0x8009,Supply_Voltage_Upper_Bound%65536/256);
byte_program(0x800A,Supply_Voltage_Upper_Bound%256); //网电电压上限
byte_program(0x800B,Supply_Voltage_Lower_Bound/65536);
byte_program(0x800C,Supply_Voltage_Lower_Bound%65536/256);
byte_program(0x800D,Supply_Voltage_Lower_Bound%256); //网电电压下限
byte_program(0x800e,Temperatuer_Transformator_Upper_Bound); //变压器温度上限
byte_program(0x800f,Temperatuer_Water_Upper_Bound); //水温上限
byte_program(0x8010,Temperatuer_Panel_Upper_Bound); //排温上限
byte_program(0x8011,Sample_flag); //试用标志
byte_program(0x8012,Sample_Days/256);
byte_program(0x8013,Sample_Days%256); //试用时间(天)
for(i=0;i<6;i++) byte_program(0x8014+i,Sample_Password[i]); //试用密码
for(i=0;i<6;i++) byte_program(0x801a+i,password_user[i]); //用户密码
for(i=0;i<6;i++) byte_program(0x8020+i,password_admin[i]); //超级用户密码
byte_program(0x8026,Current_Upper_Bound/256); //过流值
byte_program(0x8027,Current_Upper_Bound%256);
byte_program(0x8028,Voltage_Upper_Bound/256); //过压值
byte_program(0x8029,Voltage_Upper_Bound%256);
byte_program(0x802A,Loop_state); //开闭环状态
byte_program(0x802B,High_temperatuer_Off_Delay_Set); //高温封脉时间
byte_program(0x802C,ADC0_coefficients/65536); //ADC0系数
byte_program(0x802D,ADC0_coefficients%65536/256);
byte_program(0x802E,ADC0_coefficients%256);
byte_program(0x802F,ADC1_coefficients/65536); //ADC1系数
byte_program(0x8030,ADC1_coefficients%65536/256);
byte_program(0x8031,ADC1_coefficients%256);
byte_program(0x8032,ADC2_coefficients/65536); //ADC2系数
byte_program(0x8033,ADC2_coefficients%65536/256);
byte_program(0x8034,ADC2_coefficients%256);
byte_program(0x8035,ADC3_coefficients/65536); //ADC3系数
byte_program(0x8036,ADC3_coefficients%65536/256);
byte_program(0x8037,ADC3_coefficients%256);
byte_program(0x8038,ADC3_start_coefficients/256); //ADC3底端系数
byte_program(0x8039,ADC3_start_coefficients%256);
byte_program(0x803A,Voltage_Preset_coefficients/256); //电压给定DAC系数
byte_program(0x803B,Voltage_Preset_coefficients%256);
byte_program(0x803C,Current_Preset_coefficients/256); //电流给定DAC系数
byte_program(0x803D,Current_Preset_coefficients%256);
}
//显示输入的数值(0-89999)
void Show_value(unsigned char line,unsigned long w)
{
unsigned char i;
for(i=0;i<6;i++) ShowChar(line,20+i,' ');
if(w/100000) ShowChar(line,20,w/100000+0x30);
if(w/10000) ShowChar(line,21,w%100000/10000+0x30);
if(w/1000) ShowChar(line,22,w%10000/1000+0x30);
if(w/100) ShowChar(line,23,w%1000/100+0x30);
if(w/10) ShowChar(line,24,w%100/10+0x30);
ShowChar(line,25,w%10+0x30);
}
//输入过程中显示输入的数值,数值后加上可能需要的光标
void Show_value_1(unsigned char line,unsigned long w,unsigned char wei)
{
unsigned char i;
for(i = 0;i < 6;i++) ShowChar(line,20+i,' ');
if(wei==10 && w>99999 || wei==9 && w>9999 || wei==5 && w>9999 || wei==3 && w>99 || wei==2 && w>9 || wei==1 && w)
{
Show_value(line,w);
}
else
{
if(w/10000) ShowChar(line,20,w/10000+0x30);
if(w/1000) ShowChar(line,21,w%10000/1000+0x30);
if(w/100) ShowChar(line,22,w%1000/100+0x30);
if(w/10) ShowChar(line,23,w%100/10+0x30);
if(w) ShowChar(line,24,w%10+0x30); //一个缺点,参数输入0的时候不显示0
ShowChar(line,25,'_'); //显示光标
}
}
unsigned long Input_value(unsigned char Line_On_Page,unsigned char wei)
{
unsigned long value=0;
unsigned int n;
ReverseShowLine(20,Line_Right,Line_On_Page+1);
Show_value_1(Line_On_Page+1,(unsigned int)value,wei);
ReverseShowLine(20,Line_Right,Line_On_Page+1);
for(n=0;n<40000;n++) ; //键盘延时
CH452_Write(CH452_SYSON2W); //配置CH452为两线制方式,SDA用做按键中断输出
key=100;
while(1)
{
feeddog();
for(n=0;n<30000;n++) ; //键盘延时
// if(key==0 && value==0) continue;
if(key<10)
{
CH452_Write(CH452_SYSOFF);
value*=10;
value+=key;
if(wei==10) if(value>800000) { value=0; }
if(wei==9) if(value>90000) { value=0; }
if(wei==5) if(value>60000) { value=0; }
if(wei==3) if(value>999) { value=0; }
if(wei==2) if(value>99) { value=0; }
if(wei==1) if(value>9) { value=0; }
ReverseShowLine(20,Line_Right,Line_On_Page+1);
Show_value_1(Line_On_Page+1,value,wei);
ReverseShowLine(20,Line_Right,Line_On_Page+1);
key=100; //重置键盘码为无效值
CH452_Write(CH452_SYSON2W); //配置CH452为两线制方式,SDA用做按键中断输出
}
else if(key==10 && value) //后退,错误输入
{
CH452_Write(CH452_SYSOFF);
value/=10;
ReverseShowLine(20,Line_Right,Line_On_Page+1);
Show_value_1(Line_On_Page+1,value,wei);
ReverseShowLine(20,Line_Right,Line_On_Page+1);
key=100; //重置键盘码为无效值
CH452_Write(CH452_SYSON2W); //配置CH452为两线制方式,SDA用做按键中断输出
}
else if(key==11) //确认键
{
CH452_Write(CH452_SYSOFF);
ReverseShowLine(20,Line_Right,Line_On_Page+1);
Show_value(Line_On_Page+1,value);
ReverseShowLine(20,Line_Right,Line_On_Page+1);
key=100; //重置键盘码为无效值
CH452_Write(CH452_SYSON2W); //配置CH452为两线制方式,SDA用做按键中断输出
return value;
}
}
}
void Show_system_set_value(unsigned char line,unsigned char sn)
{
unsigned char i;
switch(sn)
{
case 1: Show_value(line,Current_Measuring_Range);
break;
case 2: Show_value(line,Voltage_Measuring_Range);
break;
case 3: Show_value(line,Supply_Voltage_Measuring_Range);
break;
case 4: if(Sample_flag==1) ShowLine(line,25,"开");
else ShowLine(line,25,"关");
break;
case 5: Show_value(line,Sample_Days);
break;
case 6: for(i=0;i<6;i++) ShowChar(line,21+i,Sample_Password[i]);
break;
case 7: for(i=0;i<6;i++) ShowChar(line,21+i,password_user[i]);
break;
case 8: for(i=0;i<6;i++) ShowChar(line,21+i,password_admin[i]);
break;
case 9: Show_value(line,ADC0_coefficients);
ShowChar(line,26,'C');
break;
case 10: Show_value(line,ADC1_coefficients);
ShowChar(line,26,'C');
break;
case 11: Show_value(line,ADC2_coefficients);
ShowChar(line,26,'C');
break;
case 12: Show_value(line,ADC3_coefficients);
ShowChar(line,26,'C');
break;
case 13: Show_value(line,ADC3_start_coefficients);
ShowChar(line,26,'C');
break;
case 14: Show_value(line,Voltage_Preset_coefficients);
ShowChar(line,26,'C');
break;
case 15: Show_value(line,Current_Preset_coefficients);
ShowChar(line,26,'C');
break;
}
}
unsigned char * Modify_Password(unsigned char Line_On_Page)
{
unsigned char password[7];
unsigned char *p;
unsigned char i,j;
password[0]='_';
for(i=1;i<6;i++) password[i]=' ';
ReverseShowLine(21,Line_Right,Line_On_Page+1);
for(j=0;j<6;j++) ShowChar(Line_On_Page+1,21+j,password[j]);
ReverseShowLine(21,Line_Right,Line_On_Page+1);
i=0;
while(1)
{
feeddog();
if(key==100) continue;
CH452_Write(CH452_SYSOFF); //关键盘中断
if(key<10 && i<6)
{ //数值键输入
password[i++]=key+0x30;
if(i!=6) password[i]='_';
ReverseShowLine(21,Line_Right,Line_On_Page+1);
for(j=0;j<6;j++) ShowChar(Line_On_Page+1,21+j,password[j]);
ReverseShowLine(21,Line_Right,Line_On_Page+1);
}
else if(key==10 && i!=0) //后退,错误输入
{
password[i--]=' ';
password[i]='_';
ReverseShowLine(21,Line_Right,Line_On_Page+1);
for(j=0;j<6;j++) ShowChar(Line_On_Page+1,21+j,password[j]);
ReverseShowLine(21,Line_Right,Line_On_Page+1);
}
else if(key==11 && i==6) //确认键
{
p=password;
return p;
}
key=100; //重置键盘码为无效值
CH452_Write(CH452_SYSON2W); //配置CH452为两线制方式,SDA用做按键中断输出
}
}
//系统高级设置,工厂设置
void Sys_setup(void)
{
unsigned char i,j;
unsigned char line=1; //行
unsigned char Rev_Line_On_Page=1;
unsigned char *s;
#define Line_Max 15
#define Line_Left 4
#define Line_Right 28
unsigned char code temp[Line_Max][24]={
{" 1,输出电流量程: A"},
{" 2,输出电压量程: V"},
{" 3,网电电压量程: V"},
{" 4,使用限制: "},
{" 5,使用时间: D"},
{" 6,限制密码: "},
{" 7,用户密码: "},
{" 8,系统密码: "},
{" 9,反馈电流系数: "},
{"10,反馈电压系数: "},
{"11,网电测量系数: "},
{"12,导通角系数: "},
{"13,导通角底系数: "},
{"14,电压给定系数: "},
{"15,电流给定系数: "},
};
Read_system_set();
ShowLine(0,9,"**系统设定**");
for(i=0;i<6;i++) ShowLine(2+i,4,temp[i]);
for(i=0;i<6;i++) Show_system_set_value(2+i,i+1);
ReverseShowLine(Line_Left,Line_Right,2); //反白显示第三行
CH452_Write(CH452_RESET);
EX0=1;
key=100;
CH452_Write(CH452_SYSON2W); //配置CH452为两线制方式,SDA用做按键中断输出
while(1)
{
feeddog();
if(key==100) continue;
CH452_Write(CH452_SYSOFF); //关键盘中断
if(key==15) //下
{
if(line==Line_Max)
{
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_system_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_system_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
{
ClearScreen(); //清屏
ShowLine(0,9,"**系统设定**");
ShowLine(4,5,"保存退出 不保存退出");
ReverseShowLine(5,13,4);
CH452_Write(CH452_SYSON2W); //配置CH452为两线制方式,SDA用做按键中断输出
i=1;
while(1)
{
if(key==100) continue;
if(key==10 || key==17)
{
if(i==1) i=0;
else i=1;
ReverseShowLine(5,13,4);
ReverseShowLine(15,25,4);
}
if(key==11) break;
key=100;
}
if(i==1)
{
Write_system_set(); //保存系统设置值
Earse_All_Fault_List(); //删除所有故障列表内容
}
return;
}
if(key==11) //确定键
{
switch(line)
{
case 1: Current_Measuring_Range=(unsigned int)Input_value(Rev_Line_On_Page,5);
break;
case 2: Voltage_Measuring_Range=(unsigned int)Input_value(Rev_Line_On_Page,3);
break;
case 3: Supply_Voltage_Measuring_Range=Input_value(Rev_Line_On_Page,9);
break;
case 4: if(Sample_flag) Sample_flag=0;
else Sample_flag=1;
ReverseShowLine(25,Line_Right,Rev_Line_On_Page+1);
Show_system_set_value(Rev_Line_On_Page+1,line);
ReverseShowLine(25,Line_Right,Rev_Line_On_Page+1);
Days_Passed=0; //已用天数复位为0
sector_erase(0x8400);
byte_program(0x8400,0x00);
byte_program(0x8401,0x00);
Days_Passed=byte_read(0x8400)*256+byte_read(0x8401);
if(Days_Passed!=0) {BEEP=0;} //test
for(i=0;i<200;i++) for(j=0;j<200;j++);//delay
break;
case 5: Sample_Days=(unsigned int)Input_value(Rev_Line_On_Page,3);
break;
case 6: s=Modify_Password(Rev_Line_On_Page);
for(i=0;i<6;i++) Sample_Password[i]=s[i];
break;
case 7: s=Modify_Password(Rev_Line_On_Page);
for(i=0;i<6;i++) password_user[i]=s[i];
break;
case 8: s=Modify_Password(Rev_Line_On_Page);
for(i=0;i<6;i++) password_admin[i]=s[i];
break;
case 9: ADC0_coefficients=Input_value(Rev_Line_On_Page,10);
break;
case 10: ADC1_coefficients=Input_value(Rev_Line_On_Page,10);
break;
case 11: ADC2_coefficients=Input_value(Rev_Line_On_Page,10);
break;
case 12: ADC3_coefficients=Input_value(Rev_Line_On_Page,10);
break;
case 13: ADC3_start_coefficients=Input_value(Rev_Line_On_Page,5);
break;
case 14: Voltage_Preset_coefficients=Input_value(Rev_Line_On_Page,5);
break;
case 15: Current_Preset_coefficients=Input_value(Rev_Line_On_Page,5);
break;
}
}
key=100;
CH452_Write(CH452_SYSON2W); //配置CH452为两线制方式,SDA用做按键中断输出
}
}
void Show_user_set_value(unsigned char line,unsigned char sn)
{
unsigned char i;
switch(sn)
{
case 1: break;
case 2: if(Loop_state==1) ShowLine(line,23,"闭环");
else ShowLine(line,23,"开环");
break;
case 3: if(Loop_mode==1) ShowLine(line,23,"稳压");
else ShowLine(line,23,"稳流");
break;
case 4: Show_value(line,Current_Set_value);
break;
case 5: Show_value(line,Voltage_Set_value);
break;
case 6: Show_value(line,Current_Upper_Bound);
break;
case 7: Show_value(line,Voltage_Upper_Bound);
break;
case 8: if(Temperatuer_Transformator_Upper_Bound/10) ShowChar(line,24,Temperatuer_Transformator_Upper_Bound/10+0x30);
ShowChar(line,25,Temperatuer_Transformator_Upper_Bound%10+0x30);
break;
case 9: if(Temperatuer_Water_Upper_Bound/10) ShowChar(line,24,Temperatuer_Water_Upper_Bound/10+0x30);
ShowChar(line,25,Temperatuer_Water_Upper_Bound%10+0x30);
break;
case 10: if(Temperatuer_Panel_Upper_Bound/10) ShowChar(line,24,Temperatuer_Panel_Upper_Bound/10+0x30);
ShowChar(line,25,Temperatuer_Panel_Upper_Bound%10+0x30);
break;
case 11: if(Supply_Voltage_Upper_Bound/10000) ShowChar(line,21,Supply_Voltage_Upper_Bound/10000+0x30);
if(Supply_Voltage_Upper_Bound/1000) ShowChar(line,22,Supply_Voltage_Upper_Bound%10000/1000+0x30);
if(Supply_Voltage_Upper_Bound/100) ShowChar(line,23,Supply_Voltage_Upper_Bound%1000/100+0x30);
if(Supply_Voltage_Upper_Bound/10) ShowChar(line,24,Supply_Voltage_Upper_Bound%100/10+0x30);
ShowChar(line,25,Supply_Voltage_Upper_Bound%10+0x30);
break;
case 12: if(Supply_Voltage_Lower_Bound/10000) ShowChar(line,21,Supply_Voltage_Lower_Bound/10000+0x30);
if(Supply_Voltage_Lower_Bound/1000) ShowChar(line,22,Supply_Voltage_Lower_Bound%10000/1000+0x30);
if(Supply_Voltage_Lower_Bound/100) ShowChar(line,23,Supply_Voltage_Lower_Bound%1000/100+0x30);
if(Supply_Voltage_Lower_Bound/10) ShowChar(line,24,Supply_Voltage_Lower_Bound%100/10+0x30);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -