搜索
bottom↓
回复: 68

移植傻孩子大侠的菜单成功了(51+1602),需要的参考下。

  [复制链接]

出0入0汤圆

发表于 2012-4-4 18:33:13 | 显示全部楼层 |阅读模式



还有些功能想加上去,不知道咋加了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

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

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

出0入0汤圆

发表于 2012-4-4 20:53:27 | 显示全部楼层
恭喜下,最近也在研究菜单

出0入0汤圆

发表于 2012-4-4 20:55:15 | 显示全部楼层
不好意思,我一不小心看成了:移植大傻的……

出0入0汤圆

发表于 2012-4-4 21:36:10 | 显示全部楼层
研究下 to Pic

出0入0汤圆

发表于 2012-4-4 22:25:07 | 显示全部楼层
收藏了.谢谢!

出0入0汤圆

发表于 2012-4-4 22:38:21 | 显示全部楼层
大傻做过1602??

出0入0汤圆

发表于 2012-6-2 19:57:03 | 显示全部楼层
想弄个菜单,搜索论坛中

出0入0汤圆

发表于 2012-6-4 00:14:41 | 显示全部楼层
正需要mark

出0入0汤圆

发表于 2012-6-4 16:21:05 | 显示全部楼层
厉害兰州这么快就学会了程序高手的算法

出0入0汤圆

发表于 2012-6-4 16:29:46 | 显示全部楼层
不错,傻孩子高手的程序还是比较通俗易懂的。

出0入0汤圆

发表于 2012-7-23 22:24:26 | 显示全部楼层

出0入0汤圆

发表于 2012-7-23 22:44:16 | 显示全部楼层
呵呵,鼓励一下

出0入0汤圆

发表于 2012-7-23 23:06:12 | 显示全部楼层
我也鼓励学习

出0入0汤圆

发表于 2012-7-25 20:16:13 | 显示全部楼层
也想搞这个

出0入0汤圆

发表于 2012-8-12 14:28:15 | 显示全部楼层
好贴,拿走先研究下,最近一直练写菜单

出0入0汤圆

发表于 2012-9-29 09:34:22 | 显示全部楼层
mark


出0入0汤圆

发表于 2012-10-2 16:15:30 | 显示全部楼层
菜单啊!正在学习。

出0入0汤圆

发表于 2012-10-3 13:46:59 | 显示全部楼层



我去年也做了个...DS1302+DS18B20+TEA5657+24C02..可调LCD1602的背光亮度和暗屏时间....

出0入0汤圆

发表于 2012-10-4 08:32:20 | 显示全部楼层
傻孩子高手的程序还是比较通俗易懂的

出0入0汤圆

发表于 2012-10-8 21:50:33 | 显示全部楼层
来看看     学习学习

出0入0汤圆

 楼主| 发表于 2012-10-8 23:28:33 | 显示全部楼层
delay_year 发表于 2012-10-3 13:46
我去年也做了个...DS1302+DS18B20+TEA5657+24C02..可调LCD1602的背光亮度和暗屏时间.... ...

你用的51还是AVR。我用51,菜单能实现但就是一外壳,
实际操作的功能一旦加上就要死机,因为RAM不够用,就定义在rom区导致这个故障不知道如何解决就没搞了。

出0入0汤圆

发表于 2012-10-8 23:55:12 | 显示全部楼层
用的什么单片机啊

出0入0汤圆

发表于 2012-10-9 14:45:14 | 显示全部楼层
强,顶起!

出0入0汤圆

发表于 2013-3-17 23:03:24 | 显示全部楼层
不错,易学易懂!

出0入0汤圆

发表于 2013-4-16 21:12:34 | 显示全部楼层
弱问一下,楼上下载的程序编译通过,但移植到MDK STM32里就 编译没通过;问题就在于结构体赋值里的“&Null”。“&Null”为结构体类型变量,而函数是“unsigned char         (*Subs)();”类型;类型不一样,是编译不通过,而楼上的程序为什么通过呢?
        再一个问题,结构体里的功能函数应为空函数(NullSubs(void)),为什么是“&Null”?   感谢那位大虾解惑!

出50入0汤圆

发表于 2013-4-16 22:21:34 来自手机 | 显示全部楼层
高手云集啊…

出0入0汤圆

发表于 2013-4-16 22:42:48 | 显示全部楼层
路过。。。

出50入0汤圆

发表于 2013-4-16 23:48:09 来自手机 | 显示全部楼层
祝贺祝贺

出50入0汤圆

发表于 2013-4-17 12:20:42 | 显示全部楼层
多谢分享有

出0入0汤圆

发表于 2013-6-20 11:59:43 | 显示全部楼层

出0入0汤圆

发表于 2013-6-20 19:27:09 来自手机 | 显示全部楼层
不错学习s了

出0入0汤圆

发表于 2013-6-21 10:53:07 | 显示全部楼层
感謝lz分享,!!

出0入0汤圆

发表于 2013-9-29 10:38:07 | 显示全部楼层
MenuPoint[DisplayPoint].DisplayString  这个在我的程序中为什么不识别啊  是结构体有问题吗?还是需要什么设置~~~请高手赐教~~

出0入0汤圆

发表于 2013-9-29 12:30:05 | 显示全部楼层
感谢分享

出0入0汤圆

发表于 2013-9-29 12:45:10 | 显示全部楼层
感谢 楼主                              

出0入0汤圆

发表于 2014-1-4 13:13:28 | 显示全部楼层
sub中的按键如何处理?

出0入0汤圆

发表于 2014-1-5 15:22:08 | 显示全部楼层
下载收藏下,谢谢

出0入0汤圆

发表于 2014-1-5 17:37:39 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2014-2-15 19:51:18 | 显示全部楼层
先看看,谢谢!

出0入0汤圆

发表于 2014-2-15 20:55:38 | 显示全部楼层
mark 收藏了

出0入10汤圆

发表于 2014-7-12 11:08:03 | 显示全部楼层
zhouyan 发表于 2013-4-16 21:12
弱问一下,楼上下载的程序编译通过,但移植到MDK STM32里就 编译没通过;问题就在于结构体赋值里的“&Null ...

他的那个结构体里面一个空结构体,一个是空函数,他结构体定义的时候把这两个搞混了,对应修改就好了。

出0入0汤圆

发表于 2014-8-1 22:01:09 | 显示全部楼层
88888888888888888

出0入0汤圆

 楼主| 发表于 2014-8-1 22:23:39 | 显示全部楼层
10xjzheng 发表于 2014-7-12 11:08
他的那个结构体里面一个空结构体,一个是空函数,他结构体定义的时候把这两个搞混了,对应修改就好了。 ...

感谢斧正。
  1. #include "MENU.h"
  2. #include "LCD1602.h"
  3. #include "UArTTEST.h"

  4. #define  LCDMAX_LINE 2


  5. #define UP    0xf8
  6. #define LEFT  0xd8
  7. #define RIGHT 0xa8
  8. #define DOEN  0x68
  9. #define ENTER 0x88
  10. #define ESC   0x98

  11. struct MenuItem MainMenu[4];
  12. struct MenuItem Baudrate[6];

  13. struct MenuItem
  14. {
  15.     unsigned char menuCount;        //Ŀ¼Ê÷
  16.     unsigned char *displayString;   //ÏÔʾ×Ö·û´®
  17.     void  (*subs)();                //º¯Êý
  18.     struct MenuItem *childernMenus; //¸¸²Ëµ¥
  19.     struct MenuItem *parentMenus;   //×ֲ˵¥
  20. }   MENU_NULL;

  21. void NULL_Function(void)                         //¿Õº¯Êý                  
  22. {                                   
  23.     ;
  24. }

  25. struct MenuItem MainMenu[4] =   
  26. {       
  27.     {4,(unsigned char *)"1.get cpu temp  ",&NULL_Function,&MENU_NULL,&MENU_NULL},
  28.     {4,(unsigned char *)"2.get time      ",&NULL_Function,&MENU_NULL,&MENU_NULL},
  29.     {4,(unsigned char *)"3.baudrate      ",&NULL_Function,Baudrate,&MENU_NULL},
  30.     {4,(unsigned char *)"4.system info   ",&NULL_Function,&MENU_NULL,&MENU_NULL},
  31. };

  32. struct MenuItem Baudrate[6] =   
  33. {       
  34.     {6,(unsigned char *)"1.2400          ",&NULL_Function,&MENU_NULL,MainMenu},
  35.     {6,(unsigned char *)"2.4800          ",&NULL_Function,&MENU_NULL,MainMenu},
  36.     {6,(unsigned char *)"3.9600          ",&NULL_Function,&MENU_NULL,MainMenu},
  37.     {6,(unsigned char *)"4.19200         ",&NULL_Function,&MENU_NULL,MainMenu},
  38.     {6,(unsigned char *)"5.38400         ",&NULL_Function,&MENU_NULL,MainMenu},
  39.     {6,(unsigned char *)"6.57500         ",&NULL_Function,&MENU_NULL,MainMenu},
  40. };

  41. struct MenuItem (*MenuPoint) = MainMenu;
  42. signed char        DisplayStart  = 0;                                   
  43. signed char UserChoose    = 0;                                   
  44. signed char DisplayPoint  = 0;                                   
  45. signed char MaxItems      = 0;                            
  46. signed char Option                  = 0;     

  47. void MenuShow(void)
  48. {
  49.     unsigned char iCount = 0;
  50.    
  51.     MaxItems = MenuPoint[0].menuCount;  //»ñÈ¡µ±Ç°²Ëµ¥µÄÌõÄ¿
  52.     DisplayPoint = DisplayStart;
  53.    
  54.     if (MaxItems > LCDMAX_LINE)
  55.     {
  56.         for (iCount = 0;iCount < LCDMAX_LINE;iCount++)
  57.         {
  58.             LCD1602WriteString(iCount,1,MenuPoint[DisplayPoint].displayString);
  59.             
  60.             if (DisplayPoint == UserChoose)
  61.             {
  62.                 LCD1602WriteOneChar(0,0,0x7e);
  63.             }
  64.             else
  65.             {
  66.                 LCD1602WriteOneChar(iCount,0,' ');
  67.             }
  68.             DisplayPoint += 1;
  69.             
  70.             if (DisplayPoint == MaxItems)
  71.             {
  72.                 DisplayPoint = 0;
  73.             }
  74.         }
  75.     }
  76.     else
  77.     {
  78.         for (iCount = 0;iCount < LCDMAX_LINE;iCount++)
  79.         {
  80.             LCD1602WriteString(iCount,1,MenuPoint[DisplayPoint].displayString);
  81.             
  82.             if (DisplayPoint == UserChoose)
  83.             {
  84.                 LCD1602WriteOneChar(0,0,0x7e);
  85.             }
  86.             else
  87.             {
  88.                 LCD1602WriteOneChar(iCount,0,' ');
  89.             }
  90.             DisplayPoint += 1;
  91.             
  92.             if (DisplayPoint == MaxItems)
  93.             {
  94.                 DisplayPoint = 0;
  95.             }
  96.         }
  97.     }
  98. }

  99. void MenuProcess(unsigned char GetKeyNumber)
  100. {
  101.     if (GetKeyNumber != 0xff)
  102.     {
  103.         switch (GetKeyNumber)
  104.         {
  105.             case UP:
  106.                 UserChoose --;
  107.                 if (UserChoose < 0 )
  108.                 {
  109.                     UserChoose = MaxItems - 1;
  110.                 }
  111.                 break;
  112.             case DOEN:
  113.                 UserChoose ++;
  114.                 if (UserChoose == MaxItems )
  115.                 {
  116.                     UserChoose = 0;
  117.                 }
  118.                 break;
  119.             case ENTER:
  120.                 if ((MenuPoint[UserChoose].subs) != NULL_Function)
  121.                 {
  122.                             (*MenuPoint[UserChoose].subs)();
  123.                 }
  124.                 if (MenuPoint[UserChoose].childernMenus != &MENU_NULL)
  125.                 {
  126.                     MenuPoint          = MenuPoint[UserChoose].childernMenus;  
  127.                     Option                 = UserChoose;
  128.                     UserChoose          = 0;
  129.                     DisplayStart = 0;
  130.                 }
  131.                 break;
  132.              case ESC:
  133.                 if (MenuPoint[0].parentMenus != &MENU_NULL )
  134.                 {                                  
  135.                     MenuPoint          = MenuPoint[0].parentMenus;                        
  136.                     DisplayStart = 0;
  137.                     UserChoose   = Option;       
  138.                 }
  139.                 break;
  140.         }
  141.         if ((UserChoose < DisplayStart) || (UserChoose >= (DisplayStart + 1 )))
  142.         {
  143.                            DisplayStart = UserChoose;
  144.         }
  145.         LCD1602DISPLAY_CLR();
  146.         MenuShow();
  147.     }
  148. }


复制代码


这个MDK上面没有问题的了

出0入0汤圆

发表于 2014-11-9 21:29:29 | 显示全部楼层
学习了。
谢谢分享

出0入0汤圆

发表于 2014-11-10 20:24:49 | 显示全部楼层
显示函数中:显示条目数,大于,一屏可显示条目或小于时;好像没有什么区别?不明白。
//*------------------------------------------------------------------------------
//*显示函数
//*------------------------------------------------------------------------------
void        ShowMenu(void)
{
                unsigned char i = 0;
                MaxItems = MenuPoint[0].MenuCount;        //获取当前菜单的条目数
                DisplayPoint = DisplayStart;
                if (MaxItems > LCD1602MaxDisplaYLinE){          //如果大于能显示的菜单数做处理
                        for (i = 0;i < LCD1602MaxDisplaYLinE;i++){
                                        LCD1602wRITESTring(i,1,MenuPoint[DisplayPoint].DisplayString);
                                        if ((DisplayPoint) == (UserChoose)){
                                                        LCD1602SetWZ(0,0,0x7e);   //写小箭头
                                                }
                                        else{
                                                        LCD1602SetWZ(i,0,' ');          //写空格
                                                }
                                        DisplayPoint += 1;   //字符串偏移量+1
                                        if ((DisplayPoint) == (MaxItems)){
                                                        DisplayPoint = 0;
                                                }       
                                }
                        }
                else{
                        for (i = 0;i < LCD1602MaxDisplaYLinE;i++){
                                          LCD1602wRITESTring(i,1,MenuPoint[DisplayPoint].DisplayString);
                                        if ((DisplayPoint) == (UserChoose)){
                                                        LCD1602SetWZ(0,0,0x7e);          //写小箭头
                                                }
                                        else{
                                                        LCD1602SetWZ(i,0,' ');    //写空格
                                                }
                                        DisplayPoint += 1;        //字符串偏移量+1
                                        if ((DisplayPoint) == (MaxItems)){
                                                        DisplayPoint = 0;
                                                }
                                }
                        }
}

出0入0汤圆

 楼主| 发表于 2014-11-14 11:39:04 | 显示全部楼层
mafeimafei 发表于 2014-11-10 20:24
显示函数中:显示条目数,大于,一屏可显示条目或小于时;好像没有什么区别?不明白。
//*---------------- ...

我搞忘了,你仔细研究下,我当时记得完全是看懂了,只不过对指针结构体的用法这些搞不清楚,知其然。

出0入0汤圆

发表于 2014-12-21 17:56:38 | 显示全部楼层
mafeimafei 发表于 2014-11-10 20:24
显示函数中:显示条目数,大于,一屏可显示条目或小于时;好像没有什么区别?不明白。
//*---------------- ...

因为最多是4个条目可现实,如果少于最大条目还要依然按照4个来显示的话,就会多运行了,如果多于最大条目,也只能按照4个条目来运行,例如2个条目的时候,只需要刷两个

出0入0汤圆

发表于 2014-12-21 22:42:34 | 显示全部楼层
感谢分享! 学习了

出0入0汤圆

发表于 2014-12-22 15:44:37 | 显示全部楼层
学习一下,谢谢楼主。。。

出0入0汤圆

发表于 2014-12-22 19:56:53 | 显示全部楼层
学习,正准备用1602

出0入0汤圆

发表于 2014-12-22 21:56:37 来自手机 | 显示全部楼层
支持一把了

出0入0汤圆

发表于 2014-12-23 16:40:15 | 显示全部楼层
还是不错了,下载下来研究下

出0入0汤圆

发表于 2014-12-23 19:59:46 | 显示全部楼层
先下了   谢谢楼主!

出0入0汤圆

发表于 2014-12-24 10:09:19 | 显示全部楼层
虚心学习,感谢分享

出0入0汤圆

发表于 2014-12-25 12:10:21 | 显示全部楼层
的确很不错,改天凑几个业余时间焊个
谢谢分享的资料。

出0入0汤圆

发表于 2014-12-27 10:45:58 | 显示全部楼层
感谢分享,学习一下先。

出0入12汤圆

发表于 2015-1-2 17:48:24 | 显示全部楼层
谢谢分享,记号备用

出0入0汤圆

发表于 2015-1-30 10:15:38 | 显示全部楼层
恭喜恭喜

出0入0汤圆

发表于 2015-1-30 22:59:11 | 显示全部楼层
拿来研究一下

出0入0汤圆

发表于 2015-3-4 16:39:55 | 显示全部楼层
我当时也是用傻孩子的移值的,完美实现,回味一下。

出0入0汤圆

发表于 2015-3-17 10:39:01 | 显示全部楼层
正在学习。。。。。

出0入0汤圆

发表于 2015-3-17 10:46:12 | 显示全部楼层
好流弊的感觉

出0入0汤圆

发表于 2015-3-17 15:41:51 | 显示全部楼层
首先谢谢楼主分享,厉害但是有两个问题,我指出仅仅是为了帮助学习的人能更快的理解

1.显示函数的if else执行的是一样的程序,没有区别
2.该工程适用菜单只有2级的情况,如果超过,option则会被覆盖,导致不能正常返回

不过有了这个模版,我也可以自己在继续添加了,谢谢。

出0入0汤圆

 楼主| 发表于 2015-3-24 22:57:58 | 显示全部楼层
Me、小丁丁 发表于 2015-3-17 15:41
首先谢谢楼主分享,厉害但是有两个问题,我指出仅仅是为了帮助学习的人能更快的理解

1.显示函数的if else ...

1.那个if————else有点不一样
2.那是个问题,源程序是直接返回打菜单第一项,我认为应该是哪里进去,就返回到哪里,做了修改,没考虑那么多

不过话说,悄悄的看就是了,

出0入0汤圆

发表于 2015-5-13 15:24:58 | 显示全部楼层
温故而知新

出0入0汤圆

发表于 2015-5-13 17:45:39 | 显示全部楼层
学习一下!玩儿玩儿!!

出0入0汤圆

发表于 2015-5-13 18:12:07 | 显示全部楼层
第一次见结构体的。。。学学先

出0入0汤圆

 楼主| 发表于 2015-5-13 22:07:14 | 显示全部楼层
没想到3年了。草。

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-23 21:52

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

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