仪器仪表多功能菜单设计与按钮操作

       仪器仪表在设计中少不了用户界面的设计,菜单界面作为人机交互的重要方式,在设计中也需要慎重考虑。

下面以实际设计为例,介绍几种设计多功能菜单的设计模式。

背景: 电力监控仪器是常见的工控设备,常见用于家庭电费电能计量、机场、工业生产基地、国家智能电网等众多场合。现在需要设计一款智能电表,如应用在国家电网上面,就需要对三相线电压、相电压、三相电流、功率(有功、无功、视在功率)、高次谐波、功率因素、不平衡度、电压合格率、输入输出(I/O)、参数最值、频率等众多参数进行检测并上传至用户界面进行人机交互。

工具: 常见的液晶LCD或者段码液晶(定制好的那种款式)。在这里说明一下为什么不用那种触摸屏或者比较智能化的屏幕。在工业用地环境仪器容易受到电磁干扰,会使触摸屏操作不灵敏或者出现不可控现象,因此在工业应用环境目前大多数还是使用普通液晶屏。另外一项工具就是普通按键。

1.一级菜单划分

       首先对功能进行划分,大致分为多少个GUI界面,在上面的实际问题中,可以分为 GUI初始化I界面,电流菜单、电压菜单、功率因素菜单、谐波菜单等一些列的菜单。分别对这些菜单进行GUI赋值。将初始菜单开始标记:GUI=0。电流菜单GUI=1,电压菜单GUI=2,功率菜单GUI=3。这样一直赋值下去,进行标记,大致能够分出多少个一级菜单了。

2. 按键复用方式菜单切换

       我们在使用不同的仪表仪器时或者在我们使用手机也是一样的效果,同一个按键在不同菜单下作用不同。就像windows的一些按键在一个软件里一个功能,在另外的软件里功能也不一样,这就是一种多态。(扯得有点远了)我们可以理解成这就是按键的功能复用,在本示例中,比如在电压菜单下是负责进入有功功率菜单的,但是此按键在谐波菜单下就是数值键入,从主控部分获取高次谐波的数值。具体怎么实现的呢?可以这么理解:假设一共有3个按键可以使用,分别为key1、key2、key3。采用中断的方式获取键值,对应的键值分别为keyval=1、keyval=2、keyval=3。通过keyavl数值区分不同按键,而在菜单函数里面可以根据keyval数值进行下一步动作。代码如下:

void App_Key1_ISR(void)
{
    keyval=1;
}
void App_Key2_ISR(void)
{
    keyval=2;
}
void App_Key3_ISR(void)
{
    keyval=3;
}

在一级菜单里面进行keyval数值判断:比如在功率菜单里面,代码如下:

void GUI_P(void)
{  
   flag=0;
   clearLCD();
    while(1)
    {
        displayInitU();
        switch(keyval)
        {
            case 1: flag=1;keyval=0;DisplayKW();break;//显示有功或者重新给GUI赋值进入下一级才菜单或者返回等操作(keyval记得及时清零)
            case 2: flag=1;keyval=0;DisplayKVAR();break;//显示无功功率其它功能同上
            case 3:flag=1; keyval=0;DisplayKV()  ;break;//显示视在功率其他功能同上
            defalut :break;
       }
       if(flag==1//判断有按键按下 标志位改变
       {
       break;//跳出本级菜单
       }

    }

}

这样就能够对以上不同键值进行一级菜单以及子菜单进行切换了。

3 菜单主循环功能实现

       在对一级菜单进行定义以及按键功能进行复用功能进行实现以后,就可以实现各个菜单的功能模块。在定义好各个模块以后,需要在主循环里来回切换菜单操作,故还需要一个执行程序,管理所有菜单并负责所有菜单调度(在这里所有的主菜单和子菜单是一个级别)代码如下:

  while(1)
   {

      GUI_CURRENT=GUI;
      switch (GUI_CURRENT)
      {
       case 0: GUI_RESET();      break;//显示闪烁reset界面 初始界面
       case 1: GUI_Phas_I();     break;//显示三相电流参数界面  
       case 2: GUI_2();break;//2-1211级一级菜单进入主界面 
       case 3: GUI_3();break;//测量电压两个参数 无子菜单 直接调用 
       case 4: GUI_4();break;//PQS 测量界面
       case 5: GUI_5();break;//电能E测量菜单
       case 6: GUI_6();break;//功率因素PF操作菜单
       case 7: GUI_7();break;//频率Hz操作菜单
       case 8: GUI_8();break;//谐波HARM操作菜单
       case 9: GUI_9();break;//最大值最小值的操作界面
       case 10:GUI_10();break;//报警操作模块
       case 11:GUI_11();break;//I/O操作菜单
       case 12:GUI_12();break;//2-1211级一级菜单进入主界面 
       case 13:GUI_13();break;//测量电流I peak
       case 14:GUI_14();break;//测量电流I ta tb tc
       case 15:GUI_15();break;//测量PQS P Q R 
       case 16:GUI_16();break;// 测量PQS pd qd sd
       case 17:GUI_17();break;//测量E 付费率功能查询
       case 18:GUI_18();break;//测量 HARM VL_L 参数界面
       case 19:GUI_19();break;//测量 HARM VL_N 参数界面
       case 20:GUI_20();break;//测量 HARM I 参数界面
       case 21: GUI_21();break; //测量ABC-UI max min
       case 22: GUI_22();break;// 测量 I max min
       case 23: GUI_23();break;// 测量 U max min
       case 24: GUI_24();break;// 测量 UNBAL  max min
       case 25: GUI_25();break;// 测量 PQS    max min
       case 26: GUI_26();break;// 测量 PF   max min
       case 27: GUI_27();break;// 测量 F  max min
       case 28: GUI_28();break;// 测量 THDV max min
       case 29: GUI_29();break;// 测量 THDI max min
       case 30: GUI_30();break;// 测量 P max min
       case 31: GUI_31();break;// 测量 Q max min
       case 32: GUI_32();break;// 测量 S max min
       case 33: GUI_33();break;// 测量I/P输出
       case 34: GUI_34();break;//维护choice
       case 35: ;break;//复位REST
       case 36: ;break;//信息菜单INFO
       case 37: ;break;//实时时钟CLK
       case 38: GUI_38();break;// setup 参数 
       case 39: GUI_39();break;// setup DATE
       case 40: GUI_40();break;// setup TIME
       case 41: GUI_41();break;// setup COM
       case 42: GUI_42();break;//setup meter
       case 43: ;break;//setup alarm
       case 44: ;break;//setup io
       case 45: ;break;//setup blin
       case 46: ;break;//setup dmd
       case 47: ;break;//setup def
       case 48: ;break;//setup MRE
       case 49: GUI_49();break;//setup 参数     CT
       case 50: GUI_50();break;//setup 参数     PT
       case 51: GUI_51();break;//setup 参数     F
       case 52: GUI_52();break;//setup 参数   SYS

       }  
      default : break;
    } 

       以上基本实现了仪器仪表的多功能菜单的设计。通过实际操作,稳定可行,能够达到系统要求和仪器仪表的功能需求。

仪器仪表多功能菜单设计与按钮操作_第1张图片

上图是对应五个按键的实际情况。

以上设计虽然能够满足一般性需求,不过仍然有完善的部分:可以在以下三个方面进行改正:

1 增加实时性。通过定时器更新菜单,可以刷新菜单上的数据显示。

2 按键也可以使用定时器监听方式,比如说每隔多少秒查看一下按键是否有改变,这样能够提高系统的利用率,减少开销。

3 对菜单也可以采用事件轮巡的方式进行管理,特别需要减少delay()延迟的使用,提高CPU利用率。

你可能感兴趣的:(嵌入式系统)