liandao 发表于 2007-9-5 00:23:21

一个占用内存极少的菜单系统的实现

演示+文档+源代码

目录:

一些手机界面的分析                                          

图标层代码实现分析                                             

条项层代码实现分析                                                

菜单框架的代码实现                                             

模版代码讲解                                                   

动态内容层菜单                                                

动态生成条项菜单内容                                          

数字快捷方式的实现                                             

菜单函数调用图                                                

问答FAQ                                                            

这个东西哪来的?                                                

能在51这种低速CPU上跑不?                                       

我担心我的CPU速度不够快,能用这个菜单不?                        

这个菜单框架的内存耗损大不不大?                                 

怎么移植?                                                      

关于移植的建议                                                   

杂项                        

开机直接执行某些功能

如何实现中断中使用LCD?

数字建快捷方式

关于多国语言切换:

关于内存耗损:

关于更多的改进:

关于快捷方式:

关于如何实现在线帮助提示

如何快速创建一个条项层菜单?

在FramBuffer型LCD上直接使用这份代码                           

为什么公布这份代码,使用的话需要授权什么的么?                  



文件目录:

1. MenuSampleCode目录是代码这份代码我在我的硬件上测试过。

2.说明文档是:一个占用内存极少的菜单系统的实现.pdf

3.menu.gif是一个演示

4.目录说明

MenuSampleCode\SI    Source Insight 3.5 的工程文件

MenuSampleCode\Menu.Uv2Keil 的工程

MenuSampleCode\Src   源代码

MenuSampleCode\Obj   目标文件

MenuSampleCode\Lst   列表文件

可以看MenuSampleCode\Lst\menu.m51最后编译的结果:

代码状况:



Program Size: data=9.0 xdata=110 code=15731

creating hex file from ".\Obj\menu"...

".\Obj\menu" - 0 Error(s), 0 Warning(s).

这是打开动态条项生成功能时的结果。



Program Size: data=9.0 xdata=79 code=15155

creating hex file from ".\Obj\menu"...

".\Obj\menu" - 0 Error(s), 0 Warning(s).

这是关闭动态条项生成功能时的结果。



菜单深度均为4层深度。

25+4*3 = 37Byte 可见占用内存还是挺小的。

源文件说明

CPU.H      CPU相关定义

Main.C       主函数

Ks0108.C   LCD驱动

ASCII.c      8x8 8x16 英文字模

KeyScan.C    键盘扫描

MenuPara.C   菜单函数使用模版

MenuTop.C    顶层菜单和菜单核心代码

MenuFSM.C    菜单核心和FSM代码

MenuFunc.C   功能菜单和动态条项生成代码

MenuLanguage.C   语言切换代码

MenuMeasure.C    空例子

PIC.C            图标

MenuMain.C       菜单主循环

KeyScan.H      

Ks0108.H   

Menu.H

Menu.C         main函数

Chinese.txt      用到的中文

Chinese.C      中文字模



Simulation.exe是uCGUI上移植的演示。

可以通过你的键盘控制菜单:

你的PC键盘的四个方向键:

向上键:确定

向下键:ESC

向左键:向左

向右键:向右

默认语言是英文,你可以进入设置成中文。

PS:不提供这个的代码。请不要问我要。其实Src的源代码的效果也就是这个的运行效果。

包括动态条项生成功能。

自己下载吧。

点击此处下载armok01169568.rar

http://cache.amobbs.com/bbs_upload782111/files_8/armok01169569.gif

jsjh 发表于 2007-9-5 07:34:53

精品

lanshuitianxia 发表于 2007-9-5 07:48:18

谢谢阿

hxke 发表于 2007-9-5 08:13:42

ku

my_avr 发表于 2007-9-5 08:20:30

早上发现好东西!

chendaon 发表于 2007-9-5 08:22:37

留个记号

xiejun 发表于 2007-9-5 08:43:29

好东西。

soulmate 发表于 2007-9-5 08:48:38

cool~谢谢~先收下,仔细研究研究~

atommann 发表于 2007-9-5 09:00:00

谢谢! 这样的文档很少见(不过 PDF 中有些字符是乱码的)

xuepeng2000 发表于 2007-9-5 09:04:53

我想有用的东西,自己一个人放着在电脑里,N年以后也可能变成占空间的垃圾文件,或者别人用的上这份代码呢

我不得不佩服楼主的想法,如果都像楼主这样,中国的技术还能落后吗?

现在我觉得搞技术的都套在自己的套子里,每一次开发,都是一个新的过程

不如像楼主说的:或者别人用的上这份代码呢

soulmate 发表于 2007-9-5 09:06:04

搂主,能不能把原理图也公布一下呢?

1181zjf 发表于 2007-9-5 09:29:50

不顶都不行啊!

强烈建议加酷!!!

Erike 发表于 2007-9-5 09:40:56

确实是一个很好的教程。这次可以增加自已的见识了

binglin 发表于 2007-9-5 09:46:51

先收下,有时间慢慢看,谢谢.

oldkey 发表于 2007-9-5 10:09:55

先收下,有时间慢慢看,谢谢.

hiberhe 发表于 2007-9-5 10:18:25

挺不错的!

jasern 发表于 2007-9-5 10:38:13

cool

liandao 发表于 2007-9-5 10:57:10

原理图就不必了吧,从CPU.H里面就能看出硬件连接的呀。
包括液晶,包括键盘,可况你们的硬件的底层连接根本没有必要跟这个一致的,一个新硬件上就修改这些底层接口就好了。这也是需要你们搞定的部分。

有人说PDF 中有些字符是乱码,请告诉我哪一页哪段文字,我检查一下。
如果代码,文档有BUG,看到后,请写Email告诉我,谢谢

elec2000 发表于 2007-9-5 10:59:14

ding!!!!!!!!

aleyn 发表于 2007-9-5 11:00:07

好东西不顶不行

ljy99731 发表于 2007-9-5 11:14:47

顶啊

jiangjx 发表于 2007-9-5 11:33:44

qianwei 发表于 2007-9-5 11:43:46

好东西,看看

avrbird 发表于 2007-9-5 11:57:47

精品,赞一下楼主的无私!大家都要学习啊

wwwhongj 发表于 2007-9-5 12:26:34

真是好东西啊
找了好久,真是可遇不可求啊!!!
楼主大好人!!!!!

plc_avr 发表于 2007-9-5 12:37:09

多谢分享!!!

1181zjf 发表于 2007-9-5 13:26:45

pdf文档没问题

lansedongtian 发表于 2007-9-5 13:53:05

好东西,只能顶.

rube 发表于 2007-9-5 14:26:52

绝对好人!

ngwang 发表于 2007-9-5 14:46:14

爽.....

diannaoza 发表于 2007-9-5 14:54:52

谢谢!支持这样的共享精神。
"中国的技术还能落后吗?"
这种精神的人多了,绝不落后。

hiberhe 发表于 2007-9-5 15:22:28

ucGUI模拟部分可不可以也开放了?

ntkz 发表于 2007-9-5 15:27:58

多谢楼主!!

grpmcu 发表于 2007-9-5 17:35:33

好要收藏,无私呀

liandao 发表于 2007-9-5 18:28:33

--------Menu Porting On uCGUI---------
PS:假定你有一份uCGUI的VC工程代码,并保证这份代码你原来已经编译,并测试过是可用的。
那么如何把《一个占用内存极少的菜单系统的实现.pdf》的代码移植到uCGUI?

1.由于Ks0108的代码编写的时候,学习了uCGUI的函数风格,因此几乎所有的函数都跟UCGUI
的同等功能函数同名,所以如果直接难道uCGUI下,必然会因函数重复定义而冲突,因此需要把菜
单系统的所有”GUI_“这前缀的函数--不管是定义还是调用还是声明,都统统替换成别的名字。
"GUI_"---->"MenuGUI_"
2.屏蔽CPU.H当中跟51单片机的任何定义,比如接口的sbit定义等,还有51相关的头文件。
3。修改Ks0108的驱动,改写Display_Locate函数,屏蔽,跟硬件有关的函数,或者改写成
有效的函数,比如Display_Locate用uCGUI的LCD_DrawPixel来实现,屏蔽
KS0108_DisplayOn这样的函数。
4.改写键盘扫描函数,用uCGUI的函数实现。留意键值返回可能也要修改
5。uCGUI的VC工程中加入:
Ks0108.C   LCD驱动
KeyScan.C    键盘扫描
MenuPara.C   菜单函数使用模版
MenuTop.C    顶层菜单和菜单核心代码
MenuFSM.C    菜单核心和FSM代码
MenuFunc.C   功能菜单和动态条项生成代码
MenuLanguage.C   语言切换代码
MenuMeasure.C    空例子
MenuMain.C       菜单主循环
Menu.C         menu的内容
所有文件在同一个目录下。
6。重新写一个main.C,里面实现main函数如下:

#include "gui.h"
#include "sim.h"

#include <stddef.h>

void MenuMainLoop(void);

void main(void) {
GUI_Init();
GUI_SetBkColor(GUI_LIGHTGRAY);
GUI_Clear();
MenuMainLoop();//Menu Loop
while(1){
}
}

7。把CPU.H的常量定义修改为#define _CONST_const 原来51上是code
8.把两个字库文件的code也改成_CONST_
9.确认uCGUI的LCDConf.H定义了LCD的大小和控制器:
#define LCD_XSIZE      (320)   /* X-resolution of LCD, Logical coor. */
#define LCD_YSIZE      (240)   /* Y-resolution of LCD, Logical coor. */

#define LCD_BITSPERPIXEL (8)

#define LCD_CONTROLLER 1375

9.编译代码,可能有这样的警告:
menulanguage.c(37) : warning C4090: '=' : different 'const' qualifiers
ks0108.c(1582) : warning C4761: integral size mismatch in argument; conversion supplied
可以不管,只要没有Err依然可以试试运行。
10.做的改动大概就这么多,如果需要了解细节,自己看附件中我已经移植后的代码。
                        2007-09-05
                        liandao
                        lycld@163.com
PS:不提供uCGUI的代码,请不必来信问关于UCGUI源代码的问题,谢谢。
                        
源代码在附件中。
点击此处下载armok01169808.rar

adongliu 发表于 2007-9-5 19:52:04

一个问题,这个菜单的实现是没有问题,但具体的参数更改怎么实现,例如:有一个参数的范围是0-255,使用+ - 键修改,怎么实现?????期待中........

adongliu 发表于 2007-9-5 19:55:56

我做的占内存135byte 就是不知道怎么改参数

fugeone 发表于 2007-9-5 21:43:59

很好,我正好有个项目要借鉴

dvhome 发表于 2007-9-5 23:38:48

非常感谢楼主

avruser 发表于 2007-9-6 00:01:31

单看楼主的文档列表就很佩服!

junsi 发表于 2007-9-6 00:22:20

很好!!

lixun00 发表于 2007-9-6 01:05:40

顶一下

liandao 发表于 2007-9-6 08:20:03

35楼】 adongliu
        一个问题,这个菜单的实现是没有问题,但具体的参数更改怎么实现,例如:有一个参数的范围是0-255,使用+ - 键修改,怎么实现?????期待中........
    猜测你说的问题是动态生成条项的部分代码,也猜测你还没有认真读完文档,既然是动态生成条项菜单,那么就跟具体应用有关,应当由具体函数来实现MaxDynamicItem 的赋值。
    当然也包括后面初始化动态内容部分、以及Left Right函数的内容修改部分了。因为需要显示的内容由你的函数决定的。

//    do{
//      MaxDynamicItem = InputNum(4,4,9);//要求输入一个动态菜单的值,我们根据这个值生成菜单
      MaxDynamicItem = 8;
//      if(MaxDynamicItem == 0xFF){//退出
//            Jump2Menu(SelfMenuIndex,FlashMode_AutoInit);
// //         ReFlash = true;
//            return;
//      }
//    }while(MaxDynamicItem ==0x00);//大于0才有效

//    GUI_Clear();
      上面代码中是期望能通过键盘以函数InputNum得到一个动态值,然后代码根据该值生成要求的条项菜单,这是验证代码,后期移植时,我把问题简单成:编译时人工设定一个值      MaxDynamicItem = 8;你修改这个值,那么编译后是8个条项,而修改成其它,就是其它的值咯。明白否?
   以短信收件箱为例,短信收件箱里面以短信发送人的名字作为条项显示的,而有多少条项就是根据收件箱里面有多少条短信了。既然短信是可以收到(也就是增加了条项项数),也可以删除(减少项数),而且收到的短信的发送人不是编写代码时就知道的(但可以通过函数调用动态得知)。因此这就是要求动态生成条项的。
   而动态生成条项的概念是相对于通常那些菜单是编写代码时就知道内容的菜单而言的。之中差异你们慢慢体会。
程序中几乎所有的参数都在Menu.C Menu.H CPU.H中,如果你确实用到这份代码,那么多看看代码,在硬件上试试,也就知道怎么用了,如果只是看代码的看,那么难于体会这些参数具体意义--何况有的参数跟具体硬件有关,是移植者要替代实现的。具体问题具体讨论,到时可以再有问题可以Email讨论。

joson 发表于 2007-9-6 08:39:47

真是好人啊,顶!

adongliu 发表于 2007-9-6 18:19:15

引用------>猜测你说的问题是动态生成条项的部分代码,也猜测你还没有认真读完文档,既然是动态生成条项菜单,那么就跟具体应用有关,应当由具体函数来实现MaxDynamicItem 的赋值


不是动态条目,是一个数值,假如说是一个int型的,不可能做65535个动态条目吧,通过左右移动选择个十百....来更改0-9的数值

whoami 发表于 2007-9-6 19:35:57

非常好的东西 顶下先。

xiaotanlan 发表于 2007-9-6 20:21:07

好东西,先收藏了,感谢楼主!

liandao 发表于 2007-9-6 21:58:01

adongliu:

        引用------>猜测你说的问题是动态生成条项的部分代码,也猜测你还没有认真读完文档,既然是动态生成条项菜单,那么就跟具体应用有关,应当由具体函数来实现MaxDynamicItem 的赋值


adongliu说:不是动态条目,是一个数值,假如说是一个int型的,不可能做65535个动态条目吧,通过左右移动选择个十百....来更改0-9的数值
我的回答:
    的确不能,的确有限制,看看Menu.H的菜单的变量的定义就知道了,那里面那个不是用unsigned char 来定义的?因此即便是普通的固定式菜单也不能大于256个,不过.....好像没有人会做这么长的菜单吧,呵呵。当然了,要做也是可以的,自己改代码把数据宽度加大呗。
    PS:原谅我胡乱的猜测。不该那么说。(就是:“猜测你说的问题是动态生成条项的部分代码,也猜测你还没有认真读完文档”)。
 

adongliu 发表于 2007-9-6 23:01:49

我说的不是菜单 是某个菜单项目的参数,例如 料的长度设定为0-6666mm,那这个数值需要用+ -键输入,我不知道该怎么做,原先我是定义一个全局变量,当菜单的条目里的+ -键要转到的菜单ID为255的时候修改这个全局变量,但是不是很理想.那位有比较好的方法没有.

lrzxc 发表于 2007-9-7 07:06:18

好的,占个位子先

mmlyy2001 发表于 2007-9-7 08:21:09

好的,占个位子先

colinh 发表于 2007-9-7 08:57:05

一大早先顶以下

hollypower 发表于 2007-9-7 10:09:20

赞赏

whoami 发表于 2007-9-7 17:31:19

请教楼主,我将代码移植到ADS下遇到一个问题
U8 _CONST_ * TopItemEN[]=
{
{"Function"},
{"Parameter"},
{"Measure"},
{"Language"},
{"Test"},
};
就是编译以上类似的代码时,编译不通过。当然在ADS下_CONST_是const的意思。
如果将_CONST_放到*也是编译不通过,提示如下:
Error   : C3028E: '=': implicit cast of pointer to non-equal pointer
Menu.C line 82
请楼主指点一下,非常感谢。

whoami 发表于 2007-9-7 17:33:59

放到*之后也是编译不通过。*前后都写上也是编译不通过。不知楼主有没有遇到过类似的情况?

whoami 发表于 2007-9-11 10:57:46

这么快就沉帖了。

由于ADS编译器的不同,移植时会出现以下几个问题:


1.ADS对代码要求严格,因此:
U8 _CONST_ * _CONST_ FuncItemCN[]=
{
(unsigned char *)"读出数据",
(unsigned char *)"背光控制",
(unsigned char *)"出厂设置",
(unsigned char *)"修改密码",
};
字符串前需要强制转换(unsigned char *)。


2.需将_CONST_ struct Menu MenuFunc[]的 _CONST_ 字去掉
--------------------------------------------------------------------------------
//菜单资源指针
struct Menu * BarMenu;

--------------------------------------------------------------------------------
struct Menu MenuFunc[] =
{
MenuWhat(FuncItemCN),
MenuWhat(FuncItemEN),
};
--------------------------------------------------------------------------------
BarMenu = &MenuFunc;
ItemNum = (*BarMenu).TextNum;
DispItem = (*BarMenu).Text;

--------------------------------------------------------------------------------
这样就解决了BarMenu指针类型不匹配的问题。

3.修正了以上两点,还有一些警告,问题就出在下面函数的写法上,
void DispMenuParaDown()
{
    POP();
}
将其改成如下,警告消失。
void DispMenuParaDown(void)
{
    POP();
}
一般我们都写成如上的形式。如无入口参数时,则写void,避免编译警告。


--------------------------------------------------------------------------------
大概就这些。

lansedongtian 发表于 2007-9-11 17:30:46

研究中^^^^^^^^^^^^6

txyuseing 发表于 2007-9-12 15:05:33

ding

Tomcat 发表于 2007-9-12 15:36:47

顶起

zeclmj 发表于 2007-9-13 08:53:50

好东西要顶上去。

liguangqang 发表于 2007-9-14 15:15:24

这个真是个人机界面的好例子,真的不错啊,做个LIB 文件以后用得找,好好好...

jianlming 发表于 2007-9-14 18:29:39

頂。。。。
站個位置先。。。。

tomhe666 发表于 2007-9-14 19:45:03

看看

Bird 发表于 2007-9-14 20:14:17

好好东东,正愁没参考资料

muzi 发表于 2007-9-15 15:36:53

多谢楼主!!!

canking 发表于 2007-9-19 13:55:42

多谢楼主啊,

binbin2002 发表于 2007-9-19 16:12:24

请问有没有移植到Mega64上去的啊?我移植过程中出现了一个问题

Error: a value of type "Menu __flash *" cannot be assigned to an entity of type "Menu *" J:\AVR__LCD\AVR_LCD\LCD\MenuPara.C 25
就是那个指向结构体的FLASH指针要怎么样来定义

binbin2002 发表于 2007-9-20 14:08:27

我按whoami 说的去改了还是不行啊?有没有人知道怎么样改啊?我用的是IAR

binbin2002 发表于 2007-9-20 14:34:48

有没有人移植到AVR下去的,用IAR编译器,有的话交流一下,现在有一个问题,就是这个程序编译不通过

BarMenu = &(MenuPara);


编译结果
Error: a value of type "Menu __flash *" cannot be assigned to an entity of type "Menu *" J:\AVR__LCD\AVR_LCD\LCD\MenuPara.C 25

binbin2002 发表于 2007-9-20 14:35:28

本人的邮箱是zgw169@163.com

lsh152003 发表于 2007-9-20 14:37:18

不顶对不起自己,这么好的东西!

whoami 发表于 2007-9-20 15:01:08

我按whoami 说的去改了还是不行啊?有没有人知道怎么样改啊?我用的是IAR
---------------------------------------------------------
我用的是ADS,可能各个编译器的具体参数和设置不一样。才会导致报出很多错误。
大家耐心点,一定会发现问题所在的。

lsh152003 发表于 2007-9-20 15:18:18

liandao:
         你好!
  pdf文挡我怎么解压缩有问题呀?如下:
!   D:\mp3\armok01169568.rar: 一个占用内存极少的菜单系统的实现\一个占用内存极少的菜单系统的实现.pdf CRC 失败。文件被破坏
!   D:\mp3\armok01169568.rar: 不可预料的压缩文件末端
能不能将pdf直接发送到我的邮箱:
           lsh152003@163.com

binbin2002 发表于 2007-9-20 16:20:33

liandao

有没有移植到AVR上去的,编译器为IAR4.11A,现在我移植过程中有一个问题一直没有解决
就是指针类型的问题

BarMenu = &MenuPara;

Error: a value of type "Menu __flash *" cannot be assigned to an entity of type "Menu *" J:\AVR__LCD\AVR_LCD\LCD\MenuPara.C 25

whoami 发表于 2007-9-21 09:34:49

多品位下源代码。心别急,相信自己会搞出来的。

zhuzi1441 发表于 2007-9-21 21:29:29

好东西呀,不顶都不行。

orange123 发表于 2007-9-22 21:05:41

好东西,顶一个。

binbin2002 发表于 2007-9-25 15:59:16

本人已经移植到了IAR下的M64运行了

sunli_suzhou 发表于 2007-9-25 16:19:03

好东东,谢楼主无私奉献!都像楼主这样咱大中国的梦想很快会实现了!

ba_wang_mao 发表于 2007-9-25 16:43:44

太棒啦,专业化编程思路,谢谢!

koy-917 发表于 2007-9-25 17:07:14

太强了,ram才用了100不到
我自己写的ram起码400

SunnyTrip 发表于 2007-9-25 17:10:12

好东西,太有用了~

wzhscj 发表于 2007-9-25 19:07:46

真的太有用了!!1

sunli_suzhou 发表于 2007-9-26 09:11:08

再顶一下!真是好东西!

liandao 发表于 2007-9-26 12:42:06

To:binbin2002
1.可否详细写写你是如何处理指针的问题的?
2.可否写写移植要点和关键点,这样对于别人更有益处.
-----------------------------------------
binbin2002原来的提问:

有没有移植到AVR上去的,编译器为IAR4.11A,现在我移植过程中有一个问题一直没有解决
就是指针类型的问题

BarMenu = &MenuPara;

Error: a value of type "Menu __flash *" cannot be assigned to an entity of type "Menu *" J:\AVR__LCD\AVR_LCD\LCD\MenuPara.C 25
 

lansedongtian 发表于 2007-9-26 13:59:17

我发过一个UCGUI的源码和学习交流帖子,也是COOL贴,大家可以找找.

lansedongtian 发表于 2007-9-26 14:00:10

补充:如果大家要UCGUI的源码的话!!!
看楼上

whoami 发表于 2007-9-27 10:34:16

To:binbin2002
1.可否详细写写你是如何处理指针的问题的?
2.可否写写移植要点和关键点,这样对于别人更有益处.
-----------------------------------------
binbin2002原来的提问:

有没有移植到AVR上去的,编译器为IAR4.11A,现在我移植过程中有一个问题一直没有解决
就是指针类型的问题

BarMenu = &MenuPara;

Error: a value of type "Menu __flash *" cannot be assigned to an entity of type "Menu *" J:\AVR__LCD\AVR_LCD\LCD\MenuPara.C 25

----------------------------------------------
支持下楼主!

btjlp 发表于 2007-9-30 13:10:50

好东西

sunke9 发表于 2007-10-4 15:52:38

先收下,有时间慢慢看

hjgqx 发表于 2007-10-5 12:55:47

不顶不行,好东西

dy008 发表于 2007-10-9 22:49:42

乖乖,不得不顶呀,liandao同学的共享精神让人肃然起敬!更可贵的是文档写得清楚!

dong7758 发表于 2007-10-10 19:43:12

谢谢!

lzlym182 发表于 2007-10-12 16:37:49

太专业了.楼主简直不是人

yulutong 发表于 2008-1-25 15:39:58

楼主分数不高,身手不凡啊。看文档最后,你说是07年毕业的,好强大啊。
这么好的帖子打家都来看!

HZZCL 发表于 2008-1-25 16:54:39

不顶不行,好东西

D138138 发表于 2008-1-26 12:27:58

非常不错,特别是能够耐心的把文档写完.楼主了不起.

lixiangwen 发表于 2008-1-26 13:18:11

(*^__^*) 嘻嘻……~~ 不错!!!

gdqhik 发表于 2008-1-26 14:31:16

不错,收藏

PaulDE 发表于 2008-1-26 14:52:02

收藏
页: [1] 2 3 4 5 6 7 8
查看完整版本: 一个占用内存极少的菜单系统的实现