|
发表于 2009-12-19 22:28:37
|
显示全部楼层
看了半天,我没看懂状态机,我的多层界面采用索引
//定义按键功能指针
void (*KeyFuncPtr)(void);
/*定义类型*/
typedef struct
{ unsigned int KeyStateIndex; //当前的状态索引号
void (*CurrentOperate)(void); //当前状态应该执行的功能操作
} StateTab;
/*-------------------------------------------------------------*/
StateTab KeyTab[MENU_SIZE]=
{
{1,(*main_main)},
{11,(*main_0)}, //参数设置
{12,(*main_0)}, //数据监视
{13,(*main_0)}, //关于
{14,(*main_14)}, //手动发送
{15,(*main_14_set)}, //设置为自动发送
{151,(*main_main)}, //
{141,(*hand_send)},
{111,(*main_11)}, //参数设置子菜单 主站号码
{112,(*main_11)}, //温度限定 //5
{113,(*main_11)}, //过压限定
{114,(*main_12)}, //过流限定
{115,(*main_12)}, //欠压限定
{116,(*main_12)}, //功率限定
{117,(*main_13)}, //全部默认 //10
{118,(*main_13)}, //数据存储
{119,(*main_13)}, //自动发送频率设定
{131,(*about)}, //关于子菜单
{1111,(*set_number)}, //设置主站号码
{1121,(*main_121)}, //温度限定子 //14
{1122,(*main_121)}, //wenduxianding
{11211,(*set_temph)}, //高温限定
{11221,(*set_templ)}, //低位限定
{1131,(*set_ovv)}, //过压限定设置
{1141,(*set_ovi)}, //过流设置 //19
{1151,(*set_qy)}, //欠压设置
{1161,(*set_ovw)}, //功率限定设置
{1171,(*set_default)},//默认设置
{1181,(*set_store)}, //数据存储 23
{121,(*main_21)}, //数据监视gsm
{122,(*main_21)}, //电能
{123,(*main_21)}, //开关量
{124,(*main_22)}, // 温度 27
{1221,(*main_221)},//三相电压电流
{1222,(*main_221)},//三功率 29
{1223,(*main_221)},//有功功率
{1224,(*main_224)},//无功功率
{1231,(*rd_switch)}, //开关量读取函数 31
{1211,(*main_211)}, //gsm子--at
{1212,(*main_211)}, //init
{1213,(*main_211)}, // 发信息测试 34
{12111,(*test_at)}, //at
{12121,(*test_init)}, //init
{12131,(*test_sms)}, //sms
{12211,(*axiang)},
{12221,(*abcxiang)}, //41
{12231,(*abcxiang2)},
{12241,(*abcxiang3)},
{1241,(*wendu)}, //41
{1191,(*set_auto)}, //自动发送频率设定
};
/*-------------------------------------------------------------*/
void Menu_Change(unsigned char key)
{
unsigned char i=0;
unsigned int temp;
unsigned char cengxian[5]="";
// 第一层 第二层 第三层 第四层 第五层
//unsigned char status[]={0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2d,0x20,0x2d,0x20,0x2d,0x20,0x2d,0x20};//
unsigned char status_s[] =" - - - - ";
//第一层菜单偏移为8 第二为10 第三为12 第四为14 第五为16
if(zidongesc)
{zidongesc=0;
key=Esc;
}
switch(key)
{
case UP: //向上的键
{
temp=Menu_Index-1;
for(i=0;i<MENU_SIZE;i++)
{if(temp==KeyTab.KeyStateIndex) {Menu_Index=temp;tab_num=i;break;}
}
break;
}
case Enter: //回车键
{
temp=Menu_Index*10+1;
for(i=0;i<MENU_SIZE;i++)
{if(temp==KeyTab.KeyStateIndex) {Menu_Index=temp;tab_num=i;break;}
}
break;
}
case Down: //向下的键
{
temp=Menu_Index+1;
for(i=0;i<MENU_SIZE;i++)
{if(temp==KeyTab.KeyStateIndex) {Menu_Index=temp;tab_num=i;break;}
}
break;
}
case Esc: //退出键
{
temp=Menu_Index/10;
for(i=0;i<MENU_SIZE;i++)
{if(temp==KeyTab.KeyStateIndex) {Menu_Index=temp;tab_num=i;break;}
}
break;
}
}
KeyFuncPtr=KeyTab[tab_num].CurrentOperate;
(*KeyFuncPtr)(); //执行当前的按键操作
if(key)
OSWait(K_TMO,30);
if(key||caidanxiang)
{
if(Menu_Index<=10) {cengxian[0]=Menu_Index;cengxian[1]=10;cengxian[2]=10;cengxian[3]=10;cengxian[4]=10;}
if((Menu_Index>10)&&(Menu_Index<100)) {cengxian[0]=Menu_Index/10;cengxian[1]=Menu_Index%10;cengxian[2]=10;cengxian[3]=10;cengxian[4]=10;}
if((Menu_Index>100)&&(Menu_Index<1000)) {cengxian[0]=Menu_Index/100;cengxian[1]=(Menu_Index%100)/10;cengxian[2]=Menu_Index%10;cengxian[3]=10;cengxian[4]=10;}
if((Menu_Index>1000)&&(Menu_Index<10000)) {cengxian[0]=Menu_Index/1000;cengxian[1]=(Menu_Index%1000)/100;cengxian[2]=((Menu_Index%1000)%100)/10;cengxian[3]=Menu_Index%10;cengxian[4]=10;}
if(Menu_Index>10000) {cengxian[0]=Menu_Index/10000;cengxian[1]=(Menu_Index%10000)/1000;cengxian[2]=((Menu_Index%10000)%1000)/100;cengxian[3]=(((Menu_Index%10000)%1000)%100)/10;cengxian[4]=Menu_Index%10;}
status_s[7]=cengxian[0]+48;
status_s[9]=cengxian[1]+48;
status_s[11]=cengxian[2]+48;
status_s[13]=cengxian[3]+48;
status_s[15]=cengxian[4]+48;
display_str(3,0,status_s);
caidanxiang=0;//实现首次进入餐单就刷新一次
if(!zhizhen)
{ switch ((Menu_Index%10)-1)
{
case 0:display_str(0,0,"->");display_str(1,0,"--");display_str(2,0,"--");break;
case 1:display_str(0,0,"--");display_str(1,0,"->");display_str(2,0,"--");break;
case 2:display_str(0,0,"--");display_str(1,0,"--");display_str(2,0,"->");break;
case 3:display_str(0,0,"->");display_str(1,0,"--");display_str(2,0,"--");break;
case 4:display_str(0,0,"--");display_str(1,0,"->");display_str(2,0,"--");break;
case 5:display_str(0,0,"--");display_str(1,0,"--");display_str(2,0,"->");break;
case 6:display_str(0,0,"->");display_str(1,0,"--");display_str(2,0,"--");break;
case 7:display_str(0,0,"--");display_str(1,0,"->");display_str(2,0,"--");break;
case 8:display_str(0,0,"--");display_str(1,0,"--");display_str(2,0,"->");break;
}
}
}
} |
|