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

📄 menufunc.lst

📁 一个占用内存极少的菜单系统的实现
💻 LST
字号:
C51 COMPILER V7.06   MENUFUNC                                                              04/16/2008 17:32:02 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE MENUFUNC
OBJECT MODULE PLACED IN .\Obj\MenuFunc.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Src\MenuFunc.C LARGE BROWSE DEBUG OBJECTEXTEND PRINT(.\Lst\MenuFunc.lst) OB
                    -JECT(.\Obj\MenuFunc.obj)

stmt level    source

   1          /******************************************************************************
   2           * MenuFunc.C - "功能"菜单 条项动态生成代码
   3           *
   4           *
   5           * DESCRIPTION: -
   6           *
   7           * modification history
   8           * --------------------
   9           * 01a, 04/sep/2007, 梁炎昌 written
  10           * --------------------
  11           ******************************************************************************/
  12          #include "CPU.H"
  13          
  14          #include "Ks0108.H"
  15          #include "Menu.H"
  16          #include "KeyScan.H"
  17          
  18          
  19          //功能
  20          //Bar型菜单
  21          void DispMenuFuncInit()
  22          {
  23   1      //--------------------
  24   1          GUI_Clear();
  25   1      //--------------------
  26   1          BarMenu = &MenuFunc[language];
  27   1          ItemNum = (*BarMenu).TextNum;
  28   1          DispItem = (*BarMenu).Text;
  29   1      
  30   1          //显示按键对应的文字提示,1-->"进入"
  31   1          GUI_DispStringAtBar(*(Tip[language].Text+1),0,Enter_PosY,126,GUI_TA_HCENTER);
  32   1      
  33   1          //用户定义的初始化代码请放在这里
  34   1          BarMenuInit();//调用公共初始化的代码
  35   1      }
  36          
  37          void DispMenuFuncUp()
  38          {
  39   1      
  40   1          switch(Item){
  41   2              case 0:{
  42   3      #ifdef  DynamicBar
                          Jump2Menu(MenuDataIndex,FlashMode_AutoInit);
              #else
  45   3                  Jump2Menu(SelfMenuIndex,FlashMode_NoAction);
  46   3      #endif                        
  47   3      
  48   3                  break;
  49   3              }
  50   2              case 1:{
  51   3                  Jump2Menu(SelfMenuIndex,FlashMode_NoAction);
  52   3                  break;
  53   3              }
  54   2              default:{
C51 COMPILER V7.06   MENUFUNC                                                              04/16/2008 17:32:02 PAGE 2   

  55   3                  Jump2Menu(SelfMenuIndex,FlashMode_NoAction);
  56   3                  break;
  57   3              }
  58   2          }
  59   1      
  60   1      }
  61          void DispMenuFuncDown()
  62          {
  63   1          POP();
  64   1      }
  65          
  66          void DispMenuFuncLeft()
  67          {
  68   1          BarMenuLeft();
  69   1      }
  70          void DispMenuFuncRight()
  71          {
  72   1          BarMenuRight();
  73   1      }
  74          
  75          
  76          
  77          
  78          
  79          #ifdef DynamicBar
              
              
              //------------------------------------------------
              #define DataItemSize 8
              U8 DataItem[DispMax][DataItemSize]=
              {
              {"DataX  "},
              {"DataX  "},
              {"DataX  "},
              };
              
              
              U8 *_CONST_ DataItem_p[]=
              {
              DataItem[0],
              DataItem[1],
              DataItem[2]
              };
              
              
              U8 DynamicItem;
              U8 MaxDynamicItem = 0;
              
              /*
              实现动态数据显示的最简单的方式设定一定大小的缓冲,而后填充数据,但这样把可以显示的项限制了。这个方法对于维
             -护来说是最为简单的
              2006/08/27
              如何利用有限缓冲来实现动态数据的条项层显示?
              比如仅仅缓冲液晶可以显示的条项数目,然后发现上/下越界了,就刷新缓冲?
              但这样就要重新另外写类似BarMenuLeft等函数来维护显示
              */
              /*
              这里使用一个仅仅跟LCD显示条项数目一致的缓冲区来缓冲动态生成的条项
              当实际条项数目MaxDynamicItem<=DispMax时 函数BarMenuLeft BarMenuRight工作正常
              而当MaxDynamicItem>DispMax时,我们设ItemNum = DispMax,在原本的代码中,这意味着LCD刚刚能显示所有的项
              于是一旦到了顶部上翻时就反显底部,到了底部下翻时就反显顶部 但是事实上的项的数目不是ItemNum!而是MaxDynamicI
             -tem
C51 COMPILER V7.06   MENUFUNC                                                              04/16/2008 17:32:02 PAGE 3   

              我们期望的行为是顶部上翻时,修改底部的项为新的项的数据,屏幕整个刷新(底部下翻类似)
              做法是设ItemNum = DispMax 并让上下翻的行为跟 ItemNum > DispMax时的行为一致,跟踪位置动态修改显示内容
              */
              void DispMenuDataInit(void)
              {
                  U8 Menu_j;          //计数变量
                  U8 *ChangeDispItem; //项显示内容指针
              //----------------------
                  GUI_Clear();
              //--------------------
                  GUI_Delay(100);
              //    do{
              //        MaxDynamicItem = InputNum(4,4,9);//要求输入一个动态菜单的值,我们根据这个值生成菜单
                      MaxDynamicItem = 8;
              //        if(MaxDynamicItem == 0xFF){//退出
              //            Jump2Menu(SelfMenuIndex,FlashMode_AutoInit);
              // //           ReFlash = true;
              //            return;
              //        }
              //    }while(MaxDynamicItem ==0x00);//大于0才有效
              
              //    GUI_Clear();
                  DynamicItem = 0;
              
                  if(MaxDynamicItem >DispMax){//需要显示的项数比液晶可以显示的多
                      ItemNum = DispMax;
                      //08/29
                      BarDataMode = DynamicData;//通知BarMenuLeft和BarMenuRight函数现在的数据是动态数据
                      //当ItemNum == DispMax时,默认的显示方式是到头了直接跳到尾部的(到尾部了直接跳到头部的)
                      //但是既然这是动态内容的话,而且实际上的项是MaxDynamicItem不少于DispMax,应当翻滚显示的,通过修正B
             -arDataMode这个标志
                      //通知BarMenuLeft和BarMenuRight
                  } else {
                      ItemNum = MaxDynamicItem;
                  }
              
              
                  for(Menu_j = 0;Menu_j < ItemNum; Menu_j++){//初始化动态内容
                     ChangeDispItem = (U8 *)&DataItem[Menu_j];
                      *(ChangeDispItem + 4) = Menu_j+'0';
              //        *(DataItem_p[Menu_j]+4)       = Menu_j+'0';
                  }
              
              
                  DispItem = (U8 **)DataItem_p;
              
              
                  //显示按键对应的文字提示,2-->"OK"
                  GUI_DispStringAtBar(*(Tip[language].Text+1),0,Enter_PosY,126,GUI_TA_HCENTER);
                  BarMenuInit();
                  Bar(DynamicItem,MaxDynamicItem,MenuBarPosX,MenuBarNumPosX);                  //维护滚动条
              }
              
              void DispMenuDataUp()
              {
                  //没有动作,停留在本层菜单
                  Jump2Menu(SelfMenuIndex,FlashMode_NoAction);
              }
              void DispMenuDataDown()
              {
                  //08/29
                  BarDataMode = FixedData;
C51 COMPILER V7.06   MENUFUNC                                                              04/16/2008 17:32:02 PAGE 4   

                  POP();
              }
              
              void DispMenuDataLeft()
              {
                  U8 *ChangeDispItem; //项显示内容指针
                  U8 ItemBackup;
                  if(DynamicItem == 0){//
                      DynamicItem = MaxDynamicItem-1;
                  } else {
                      DynamicItem--;
                  }
              
                  if(Where == 0){//顶部上移,需要修改数据
                      if (Item == 0) {//获得Item
                          ItemBackup = ItemNum-1;
                      } else {
                          ItemBackup = Item-1;
                      }
                      ChangeDispItem = (U8*)&DataItem[ItemBackup];
                      *(ChangeDispItem + 4) = DynamicItem+'0';
                  }
                  BarMenuLeft();//
              
                  Bar(DynamicItem,MaxDynamicItem,MenuBarPosX,MenuBarNumPosX);                  //维护滚动条
              }
              void DispMenuDataRight()
              {
                  U8 *ChangeDispItem; //项显示内容指针
                  U8 ItemBackup;
                  if(DynamicItem == MaxDynamicItem-1){//维护实际的Item值
                      DynamicItem = 0;
                  } else {
                      DynamicItem++;
                  }
              
                  if(Where == (DispMin-1)){//底部下移,需要修改数据
                      if (Item == (ItemNum-1)) {//获得Item
                          ItemBackup = 0;
                      } else {
                          ItemBackup = Item + 1;
                      }
                      ChangeDispItem = (U8*)&DataItem[ItemBackup];//获得修改位置
                      *(ChangeDispItem + 4) = DynamicItem+'0';
                  }
                  BarMenuRight();
                  Bar(DynamicItem,MaxDynamicItem,MenuBarPosX,MenuBarNumPosX);                  //维护滚动条
              }
              #endif
 225          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    155    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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