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

📄 state.c

📁 基于C51的通用人机界面程序
💻 C
字号:
#define _state_ 
#include "general.h"
#include "7219.h"
#include "key.h"
#include "com.h"
#include "protocol.h"
#include "cursor.h"
#include "buzzer.h"
//#include "ds1820.h"

//通信是否发起标志
bit f_start_ok;	//开始采集
bit f_cancel_ok;//开始采集
bit f_acq_ok;	//查询参数

bit f_seta_ok;	//设置仪器常数A好
//bit f_setl_ok;	//设置纬度wd好
bit f_setc_ok;	//设置比例系数c好
//bit f_setp_ok;	//设置周期个数p好
bit f_setz_ok;	//设置中天位置z好
bit f_beep_ok;

//各参数改变设置状态的显示缓冲数组,及其格式		

uchar para_p[PLEN];					//周期个数p		[0]个位[1]十位
uchar temp_p[PLEN];
uchar para_a[ALEN];					//仪器常数A		[0][1]秒[2][3]分[4][5]度[6]符号
uchar temp_a[ALEN];
uchar para_c[CLEN];					//比例系数c		[0]指数[1]符号[2][3][4][5]有效数字
uchar temp_c[CLEN];
uchar para_wd[LLEN];				//纬度wd		[0][1]小数两位[2][3]整数两位
uchar temp_wd[LLEN];
uchar para_z[ZLEN];					//中天位置		[3][2][1][0]四位整数
uchar temp_z[ZLEN];

uchar para_gb[6];					//光标坐标值gb	[0][1]小数两位[2][3][4][5]整数四位
uchar result[7];					//静态结果数组	[6][5][4]度[3][2]分[1][0]秒

uchar keyvalue;
uchar Index;
void SetPara(uchar *para,uchar *temp,uchar len,uchar pos_set,uchar pos_disp,uchar pos_dp,uchar state_ent,uchar state_pgup,uchar state_pgdn);
void init_state(){
	
	//State 1st
	Index=0;		//先进'设置'菜单
	frame_cmd(FR_Cancel);
 	//////////////////////////
	f_start_ok=0;
	f_cancel_ok=0;	
	f_acq_ok=0;	
	f_seta_ok=0;	
//	f_setl_ok=0;	
	f_setc_ok=0;
	f_setz_ok=0;	
//	f_setp_ok=0;
	f_beep_ok=0;	
	gboff();
	
	


}
/*******************************************************************************************************
各分支状态的服务程序
*******************************************************************************************************/
void Sev_State0(void){//"算法1"界面(寻北)
	
	ES=0;						//关串口中断,以免DSP板的影响
	gboff();					//关光标
	if(!f_cancel_ok){//
		frame_cmd(FR_Cancel);	//发"停止采集"
		f_cancel_ok=1;			
		f_start_ok=0;			
	}
	cls();	
	//f_start_ok=0;
	disp('-',1);	disp('P',3);	disp('A',4);	disp( 0 ,5);	disp('G',6);	disp( 1 ,8);	disp('-',10);
	ES=1;
	
	/*以下温度传感器调试代码
	
	uchar t;
	//SPK=0;
	//init_ds18b20();
	//writechar(0xcc); 	
	//writechar(0x44);
	//t=readchar();
	readtemp();
	//uint tem;
  	t=temrom[1];
	t=t>>8;
	t+=temrom[0];
	t=t*0.0625;
		
	cls();
	//if((t/100)==0)disp(' ',1);else
	
	disp(t/10,1);
	disp(t%10,2);
	//disp((t%100)%10,3);
	disp('^',9);	
	disp('C',10);
	*/
}
void Sev_State1(void){//"算法2"界面(标定)

	ES=0;						//关串口中断,以免DSP板的影响
	gboff();					//关光标
	if(!f_cancel_ok){//
		frame_cmd(FR_Cancel);	//发"停止采集"
		f_cancel_ok=1;			
		f_start_ok=0;			
	}
	cls();	
	//f_start_ok=0;
	disp('-',1);	disp('P',3);	disp('A',4);	disp( 0 ,5);	disp('G',6);	disp( 2 ,8);	disp('-',10);
	ES=1;
}
void Sev_State2(void){//"参数设置"界面
	
	cls();
	if((f_seta_ok==1)&&(f_setc_ok==1)&&(f_setz_ok==1)){
		disp('-',1);	disp('S',3);	disp('E',4);	disp('T',5);	disp('U',7);	disp('P',8);	disp('-',10);
	}
	else{
	//以下为向DSP查询参数过程
	if(!f_acq_ok){
		frame_cmd(FR_Para);		//发查询命令	
		f_acq_ok=1;
	}
	
	frame_unpack(FR_Para);		//解包接收的数据到参数数组para(串口慢,程序快)

	//memcpy(temp_p,para_p,PLEN);	//拷贝para到修改参数的临时数组temp
	memcpy(temp_a,para_a,ALEN);
	memcpy(temp_c,para_c,CLEN);
	//memcpy(temp_wd,para_wd,LLEN);
	memcpy(temp_z,para_z,ZLEN);	

	}
	
}

void Sev_State3(void){//寻北测量过程
	uint m,n;	
	//ES=0;
	m=para_gb[5]*1000+para_gb[4]*100+para_gb[3]*10+para_gb[2];		//摆动光标数值
	n=para_z[3]*1000+para_z[2]*100+para_z[1]*10+para_z[0];			//摆动光标中心

	result[6]=result[5]=result[4]=result[3]=result[2]=result[1]=result[0]=0;//清结果数组
	cls();
	//ES=0;
	disp(para_gb[5],4);	disp(para_gb[4],5);	disp(para_gb[3],6);	disp_dp(para_gb[2],7);
	disp(para_gb[1],8);	disp(para_gb[0],9);
	//ES=1;
	gb(m,n);				//点灯
	//ES=1;
	//起始命令选择分支
	if(!f_start_ok){//
		frame_cmd(FR_Start);//发"开始采集"
		f_start_ok=1;
		f_cancel_ok=0;
		f_beep_ok=0;
	}
	//processmsg();
	//ES=1;
	frame_unpack(FR_Start);//协议解包并应答
		
}

void Sev_State13(void){//标定测量过程
	uint m,n;	
	//ES=0;
	m=para_gb[5]*1000+para_gb[4]*100+para_gb[3]*10+para_gb[2];		//摆动光标数值
	n=para_z[3]*1000+para_z[2]*100+para_z[1]*10+para_z[0];			//摆动光标中心

	result[6]=result[5]=result[4]=result[3]=result[2]=result[1]=result[0]=0;//清结果数组
	cls();
	//ES=0;
	disp(para_gb[5],4);	disp(para_gb[4],5);	disp(para_gb[3],6);	disp_dp(para_gb[2],7);
	disp(para_gb[1],8);	disp(para_gb[0],9);
	//ES=1;
	gb(m,n);				//点灯
	//ES=1;
	if(!f_start_ok){//
		frame_cmd(FR_Swing);//发"开始标定"
		f_start_ok=1;
		f_cancel_ok=0;
		f_beep_ok=0;
	}
	//processmsg();
	//ES=1;
	frame_unpack(FR_Swing);//协议解包并应答
		
}



void Sev_State4(void){//显示参数p(周期个数)
	cls();
	disp('P',1);	disp('=',2);
	disp(para_p[1],9);	disp(para_p[0],10);
	
	//if(!f_setp_ok){//
		frame_data(FR_P,para_p,PLEN);
		//f_setp_ok=1;//置发送好标志
	//}
	frame_unpack(FR_P);//协议解包并应答
	
}
void Sev_State5(void){//显示参数a(仪器常数)
	cls();
	disp('E',1);		disp('=',2);
	disp(para_a[6],4);	disp(para_a[5],5);	disp(para_a[4],6);	/*disp('^',4);*/
	disp(para_a[3],7);	disp_dp(para_a[2],8);	/*disp('/',7);*/
	disp(para_a[1],9);	disp(para_a[0],10);	/*disp('"',10);*/

	//if(!f_seta_ok){//
		frame_data(FR_A,para_a,ALEN);
		//f_seta_ok=1;//置发送好标志
	//}
	frame_unpack(FR_A);//协议解包并应答
	
}
void Sev_State6(void){//显示参数wd(纬度)
	cls();
	disp('U',1);	disp('=',2);
	disp(para_wd[2],8);	disp_dp(para_wd[1],9);
	disp(para_wd[0],10);	/*disp(para_wd[0],9);*/
	//disp('^',10);

	//if(!f_setl_ok){	//
		frame_data(FR_L,para_wd,LLEN);
		//f_setl_ok=1;	//置发送好标志
	//}
	frame_unpack(FR_L);//协议解包并应答
	
}
void Sev_State7(void){//显示参数c(比例系数)
	cls();
	disp('C',1);		disp('=',2);
	disp(para_c[3],7);	disp(para_c[2],8);	disp(para_c[1],9);	disp(para_c[0],10);
	/*disp('E',8);
	disp(para_c[1],9);//符号
	disp(para_c[0],10);*/
	
	//if(!f_setc_ok){//
		frame_data(FR_C,para_c,CLEN);
		//f_setc_ok=1;//置发送好标志
	//}
	//processmsg();
	frame_unpack(FR_C);//协议解包并应答
	
}
//------p(9,10),无小数---------------------------------------------------
void Sev_State8(void){//设置p值[1]
	
	SetPara(para_p,temp_p,PLEN,1,9,PLEN,4,9,9);
}
void Sev_State9(void){//设置p值[0]

	SetPara(para_p,temp_p,PLEN,0,9,PLEN,4,8,8);
}
//--------wd(8,9,10),1位小数--------------------------------
void Sev_State10(void){//设置wd值[2]

	SetPara(para_wd,temp_wd,LLEN,2,8,1,6,12,11);
}
void Sev_State11(void){//设置wd值[1]

	SetPara(para_wd,temp_wd,LLEN,1,8,1,6,10,12);
}
void Sev_State12(void){//设置wd值[0]

	SetPara(para_wd,temp_wd,LLEN,0,8,1,6,11,10);
}
//--------a(4,5,6,7,8,9,10),2位小数------------------------
void Sev_State14(void){//设置a值[6]

	SetPara(para_a,temp_a,ALEN,6,4,2,5,20,15);
}

void Sev_State15(void){//设置a值[5]

	SetPara(para_a,temp_a,ALEN,5,4,2,5,14,16);
}
void Sev_State16(void){//设置a值[4]

	SetPara(para_a,temp_a,ALEN,4,4,2,5,15,17);
}
void Sev_State17(void){//设置a值[3]

	SetPara(para_a,temp_a,ALEN,3,4,2,5,16,18);
}
void Sev_State18(void){//设置a值[2]

	SetPara(para_a,temp_a,ALEN,2,4,2,5,17,19);
}
void Sev_State19(void){//设置a值[1]

	SetPara(para_a,temp_a,ALEN,1,4,2,5,18,20);
}
void Sev_State20(void){//设置a值[0]

	SetPara(para_a,temp_a,ALEN,0,4,2,5,19,14);
}
//------c(7,8,9,10),无小数-----------------------------------
void Sev_State21(void){//设置c值[3]

	SetPara(para_c,temp_c,CLEN,3,7,CLEN,7,24,22);
}
void Sev_State22(void){//设置c值[2]

	SetPara(para_c,temp_c,CLEN,2,7,CLEN,7,21,23);
}
void Sev_State23(void){//设置c值[1]

	SetPara(para_c,temp_c,CLEN,1,7,CLEN,7,22,24);
}
void Sev_State24(void){//设置c值[0]

	SetPara(para_c,temp_c,CLEN,0,7,CLEN,7,23,21);
}
//------z(7,8,9,10),---------------------------------
void Sev_State25(void){//设置z值[3]

	SetPara(para_z,temp_z,ZLEN,3,7,ZLEN,29,28,26);
}
void Sev_State26(void){//设置z值[2]

	SetPara(para_z,temp_z,ZLEN,2,7,ZLEN,29,25,27);
}
void Sev_State27(void){//设置z值[1]

	SetPara(para_z,temp_z,ZLEN,1,7,ZLEN,29,26,28);
}
void Sev_State28(void){//设置z值[0]

	SetPara(para_z,temp_z,ZLEN,0,7,ZLEN,29,27,25);
}
//--------------------------------------------
void Sev_State29(void){//显示Z值
	cls();
	disp('A',1);		disp('=',2);
	disp(para_z[3],7);	disp(para_z[2],8);	disp(para_z[1],9);	disp(para_z[0],10);
	
	//if(!f_setc_ok){//
		frame_data(FR_Z,para_z,ZLEN);
		//f_setc_ok=1;//置发送好标志
	//}
	//processmsg();
	frame_unpack(FR_Z);//协议解包并应答
}

void Sev_State30(void){//显示结果
	ES=0;						//关串口中断,以免DSP板的影响
	gboff();					//关光标
	if(!f_cancel_ok){//
		frame_cmd(FR_Cancel);	//发"停止采集"
		f_cancel_ok=1;			
		f_start_ok=0;			
	}
	cls();
	disp(result[9],1);	disp(result[8],2);	disp(result[7],3);
	//disp('^',4);	
	disp(result[6],4);
	disp(result[5],5);	disp(result[4],6);
	//disp('/',7);
	disp(result[3],7);
	disp(result[2],8);	disp(result[1],9);
	//disp('"',10);
	disp(result[0],10);
	
	if(!f_beep_ok){
		beep();
		beep();
		beep();
		f_beep_ok=1;
	}

	ES=1;

}


void Sev_State31(void){//报错误
	ES=0;						//关串口中断,以免DSP板的影响
	gboff();					//关光标
	if(!f_cancel_ok){//
		frame_cmd(FR_Cancel);	//发"停止采集"
		f_cancel_ok=1;			
		f_start_ok=0;			
	}
	cls();
	disp('r',3);disp('E',1);	disp('r',2);	
		
	if(!f_beep_ok){
		beep();
		beep();
		beep();
		f_beep_ok=1;
	}

	ES=1;

}


//通用函数:设置某参数的某位
void SetPara(	uchar *para,		//被设置数组
				uchar *temp,		//被修改缓存数组
				uchar len,			//数组大小
				uchar pos_set,		//被修改数组位置
				uchar pos_disp,		//显示起始位置
				uchar pos_dp,		//小数位置(即数组位置[pos_dp]加小数点,无小数点=LEN)
				uchar state_ent,	//"ENTER"转状态字	(保存修改)
				//uchar state_esc,	//"ESC"转状态字		(不保存)
				uchar state_pgup,	//"PGUP"转状态字	(右移一位)
				uchar state_pgdn	//"PGDN"转状态字	(左移一位)
			)
{		
	uchar i;
	cls();
	for(i=0;i<len;i++){
		if((i==pos_set)&&(i==pos_dp))	disp_dp(*(temp+i),pos_disp+len-1-i);
		else if(i==pos_set)				disp(*(temp+i),pos_disp+len-1-i);
		else if(i==pos_dp)				disp_dp(*(temp+i),pos_disp+len-1-i);
		else							disp(*(temp+i),pos_disp+len-1-i);
	}
	delay(20);	disp(' ',pos_disp+len-1-pos_set);	delay(20);

	keyvalue=kbscan();//
	switch(keyvalue){
		case NUM1:		{*(temp+pos_set)=1;break;}
		case NUM2:		{*(temp+pos_set)=2;break;}
		case NUM3:		{*(temp+pos_set)=3;break;}
		case NUM4:		{*(temp+pos_set)=4;break;}
		case NUM5:		{*(temp+pos_set)=5;break;}
		case NUM6:		{*(temp+pos_set)=6;break;}
		case NUM7:		{*(temp+pos_set)=7;break;}
		case NUM8:		{*(temp+pos_set)=8;break;}
		case NUM9:		{*(temp+pos_set)=9;break;}
		case NUM0:		{*(temp+pos_set)=0;break;}
		case BN_ENT:{
						//*(para+pos_set)=*(temp+pos_set);
						memcpy(para,temp,len);		
						Index=state_ent;
						break;
					}
		case BN_ESC:{
						//*(temp+pos_set)=*(para+pos_set);
						memcpy(temp,para,len);
						Index=state_ent;
						break;
					}
		case BN_PGUP:	{Index=state_pgup;break;}
		case BN_PGDN:	{Index=state_pgdn;break;}
	}
}
//

⌨️ 快捷键说明

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