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

📄 main.c

📁 本程序是一个人机接口程序
💻 C
📖 第 1 页 / 共 4 页
字号:
	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 + -