📄 state.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 + -