搜索
bottom↓
回复: 3

傻孩子菜单结构无法进入子菜单,烦请指教。

[复制链接]

出0入0汤圆

发表于 2018-7-9 22:46:36 | 显示全部楼层 |阅读模式
本帖最后由 lzm2010 于 2018-7-9 22:48 编辑

如题,在使用傻孩子菜单架构的时候,如下程序能正常切换上下菜单,但是无法进入子菜单,不知道问题出在哪里?请坛友指点,感谢。

  1. #ifndef        _Menu_H_
  2. #define _Menu_H_

  3. #include "T32.h"
  4. #include "T32_board.h"
  5. #include "TFT_Driver.h"
  6. #include "stdio.h"

  7. #define keydown  GPIO_ReadInBit(T32_GPIOC,GPIO_PIN_10)
  8. #define keyup    GPIO_ReadInBit(T32_GPIOC,GPIO_PIN_9)

  9. #define keyenter GPIO_ReadInBit(T32_GPIOC,GPIO_PIN_11)
  10. #define keyreturn GPIO_ReadInBit(T32_GPIOC,GPIO_PIN_8)

  11. #define        LCD1602MaxDisplaYLinE        5          //

  12. #define        UP          1                                   //                                          
  13. #define Down  2                            //
  14. #define        Enter 3
  15. #define Esc   4

  16. static unsigned int  func_index=0;

  17. void NullSubs(void)                                            //
  18. {                                   }

  19. struct         MenuItem         SysTemSet[5];      //
  20. struct         MenuItem         BaudRatE[7];           //
  21. struct         MenuItem         EquipmenT[4];           //

  22. //*------------------------------------------------------------------------------
  23. //*
  24. //*------------------------------------------------------------------------------
  25. struct         MenuItem                           //
  26. {                 unsigned char         MenuCount;         //
  27.             unsigned char         *DisplayString;    //
  28.             unsigned char         (*Subs)();         //
  29.             struct MenuItem         *ChildrenMenus;//
  30.             struct MenuItem         *ParentMenus;  //
  31. }menu;

  32. struct        MenuItem          MainMenu[4] =      //
  33. {       
  34.                 {4,"1.SysTem Set    ",NullSubs,SysTemSet,NULL},
  35.                 {4,"2.EquipmenT ID  ",NullSubs,EquipmenT,NULL},
  36.                 {4,"3.BaudRatE      ",NullSubs,BaudRatE, NULL},
  37.                 {4,"4.System Infor  ",NullSubs,NULL,          NULL},
  38. };

  39. struct         MenuItem         SysTemSet[5] =           //
  40. {
  41.                 {5,"1.DatA  Set     ",NullSubs,NULL,MainMenu},
  42.                 {5,"2.TimE  Set     ",NullSubs,NULL,MainMenu},
  43.                 {5,"3.AlarM Set     ",NullSubs,NULL,MainMenu},
  44.                 {5,"4.BacKLed  Set  ",NullSubs,NULL,MainMenu},
  45.                 {5,"5.Password Set  ",NullSubs,NULL,   NULL},
  46. };

  47. struct         MenuItem         BaudRatE[7] =           //
  48. {
  49.                 {7,"1.2400          ",NullSubs,NULL,MainMenu},
  50.                 {7,"2.4800          ",NullSubs,NULL,MainMenu},
  51.                 {7,"3.9600          ",NullSubs,NULL,MainMenu},
  52.                 {7,"4.19200         ",NullSubs,NULL,MainMenu},
  53.                 {7,"5.38400         ",NullSubs,NULL,MainMenu},
  54.                 {7,"6.57600         ",NullSubs,NULL,MainMenu},
  55.                 {7,"7.115200        ",NullSubs,NULL,MainMenu},
  56. };

  57. struct         MenuItem         EquipmenT[4] =           //
  58. {
  59.                 {4,"1.No.01         ",NullSubs,NULL,MainMenu},
  60.                 {4,"2.No.02         ",NullSubs,NULL,MainMenu},
  61.                 {4,"3.NO.03         ",NullSubs,NULL,MainMenu},
  62.                 {4,"4.No.04         ",NullSubs,NULL,MainMenu},
  63. };

  64. struct         MenuItem (*MenuPoint) = MainMenu;
  65. unsigned char        DisplayStart  = 0;                                //
  66. unsigned char         UserChoose    = 0;                                    //
  67. unsigned char         DisplayPoint  = 0;                                    //
  68. unsigned char         MaxItems      = 0;                             //
  69. unsigned char         Option                  = 0;                 //
  70. unsigned char   ShowCount=2;

  71. //*------------------------------------------------------------------------------
  72. //*
  73. //*------------------------------------------------------------------------------
  74. void        ShowMenu(void)
  75. {
  76.                 unsigned char i = 0;
  77.                 MaxItems = MenuPoint[0].MenuCount;        //
  78.                 DisplayPoint = DisplayStart;
  79.                 if (MaxItems > LCD1602MaxDisplaYLinE){          //
  80.                         for (i = 1;i < LCD1602MaxDisplaYLinE;i++){
  81.                                         display_string_5x8_1(i,8,MenuPoint[DisplayPoint].DisplayString);
  82.                                         if ((DisplayPoint) == (UserChoose)){
  83.                                                         display_string_5x8_1(1,1,">");   //
  84.                                                 }
  85.                                         else{
  86.                                                         display_string_5x8_1(i,1," ");          //
  87.                                                 }
  88.                                         DisplayPoint += 1;   //
  89.                                         if ((DisplayPoint) >= (MaxItems)){
  90.                                                         DisplayPoint = 0;
  91.                                                     
  92.                                                     
  93.                                                 }       
  94.                                 }
  95.                         }
  96.                 else{
  97.                         for (i = 1;i < LCD1602MaxDisplaYLinE;i++){
  98.                                           display_string_5x8_1(i,8,MenuPoint[DisplayPoint].DisplayString);
  99.                                         if ((DisplayPoint) == (UserChoose)){
  100.                                                         display_string_5x8_1(1,1,">");          //
  101.                                                 }
  102.                                         else{
  103.                                                         display_string_5x8_1(i,1," ");    //
  104.                                                 }
  105.                                         DisplayPoint += 1;        //
  106.                                         if ((DisplayPoint) >= (MaxItems)){
  107.                                                         DisplayPoint = 0;
  108.                                                     
  109.                                                 }
  110.                                 }
  111.                         }
  112. }

  113. //void ShowMenu(void)
  114. //{
  115. //        unsigned char n;
  116. //        MaxItems = MenuPoint[0].MenuCount;//
  117. //        DisplayPoint = DisplayStart;
  118. //        for(n=0;DisplayPoint<MaxItems&&n<ShowCount;n++)
  119. //          {
  120. //                  if(DisplayPoint==UserChoose)
  121. //              //LCD_write_string(0,n,"->");
  122. //                  display_string_5x8_1(1,n,">");       
  123. //             // LCD_write_string(2,n,MenuPoint[DisplayPoint++].DisplayString);
  124. //              display_string_5x8_1(n,8,MenuPoint[DisplayPoint].DisplayString);
  125. //         }

  126. //}


  127. void __Delay(u32 count)
  128. {
  129.   volatile u32 i=0,j=0;
  130.   for(i=0;i<count;i++)
  131.         for(j=0;j<1200;j++)
  132.         {
  133.                 __NOP(); // Prevent delay loop be optimized
  134.     }

  135. }

  136. unsigned int KEY_Scan(void)
  137. {
  138.                 if((keyup==0)||(keydown==0)||(keyenter==0)||(keyreturn==0))
  139.                 {
  140.                         __Delay(50);//
  141.                         if(keyup==0)
  142.                         {
  143.                                 func_index=1;    //
  144.                                 while(!keyup);//
  145.                         }
  146.                         if(keydown==0)
  147.                         {
  148.                                 func_index=2;    //
  149.                                 while(!keydown);
  150.                         }
  151.                         if(keyenter==0)
  152.                         {
  153.                                 func_index=3;    //
  154.                                 while(!keyenter);
  155.                         }
  156.                         if(keyreturn==0)
  157.                         {
  158.                                 func_index=4;    //
  159.                                 while(!keyreturn);
  160.                         }
  161.                                
  162.                 }
  163.         else
  164.                 {
  165.                          func_index=5;   
  166.                 }                       
  167.                 return func_index;
  168. }
  169. //*------------------------------------------------------------------------------
  170. //*
  171. //*------------------------------------------------------------------------------
  172. void        ChangeMenu(void)
  173. {                unsigned char GetKeyNum;
  174.                 GetKeyNum = KEY_Scan();
  175.                 if (GetKeyNum != 5){                 //
  176.                         ShowMenu();                                                //
  177.                         switch (GetKeyNum){
  178.                                 case UP:
  179.                                         UserChoose--;                        //
  180.                                         if (UserChoose == 0){
  181.                                                 UserChoose = MaxItems - 1;
  182.                                         }
  183.                                         break;
  184.                                 case Down:
  185.                                         UserChoose++;
  186.                                         if (UserChoose >= MaxItems){
  187.                                                 UserChoose = 0;
  188.                                         }
  189.                                         break;
  190.                                 case Enter:
  191.                                         if ((MenuPoint[UserChoose].Subs) != NullSubs){
  192.                                 (*MenuPoint[UserChoose].Subs)();
  193.                             }
  194.                             if (MenuPoint[UserChoose].ChildrenMenus != NULL){
  195.                                 MenuPoint          = MenuPoint[UserChoose].ChildrenMenus;  //
  196.                                                 Option                 = UserChoose;
  197.                                 UserChoose          = 0;
  198.                                 DisplayStart = 0;
  199.                             }
  200.                          break;
  201.                                 case Esc:
  202.                             if (MenuPoint[0].ParentMenus != NULL){                                  
  203.                                     MenuPoint          = MenuPoint[0].ParentMenus;                          //

  204.                                                 UserChoose   = Option;        //
  205.                                             UserChoose          = 0;
  206.                                     DisplayStart = 0;
  207.                             }
  208.                          break;                                
  209.                         }
  210.                         //*--------------------------------------------------------------------
  211.                         //*
  212.                         if ((UserChoose <= DisplayStart) || (UserChoose >= (DisplayStart + 1 ))){
  213.                             DisplayStart = UserChoose;
  214.                     }  
  215.                         //*--------------------------------------------------------------------
  216.                 //        LCD1602CLEARDisplaY();
  217.                         //clear_screen();
  218.                     ShowMenu();               
  219.                         //GetKeyNum=0;
  220.                 }
  221. }

  222. #endif


复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入296汤圆

发表于 2018-7-10 21:54:39 | 显示全部楼层
你单步试过了么?特别是代码215行这里,你在这里切换完菜单以后,立即ShowMenu跟踪下。

另外,推荐你看下我写的新的文章:

https://www.amobbs.com/thread-5688720-1-1.html

出0入0汤圆

 楼主| 发表于 2018-7-10 22:55:31 | 显示全部楼层
Gorgon_Meducer 发表于 2018-7-10 21:54
你单步试过了么?特别是代码215行这里,你在这里切换完菜单以后,立即ShowMenu跟踪下。

另外,推荐你看下 ...

感谢回复,刚进去debug了一下,发现是TB山寨杜邦线害死人啊,没想到进入子菜单的杜邦线是断路的,坑爹,换线后程序能正常工作,您的新帖我再琢磨琢磨。

出0入296汤圆

发表于 2018-7-10 23:37:07 | 显示全部楼层
lzm2010 发表于 2018-7-10 22:55
感谢回复,刚进去debug了一下,发现是TB山寨杜邦线害死人啊,没想到进入子菜单的杜邦线是断路的,坑爹, ...

哈哈。问题解决就好。建议你早日转换到新结构上。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-18 11:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表