cddyy 发表于 2008-3-13 17:09:59

刚刚编写的菜单,在51上通过

电路很简单,大家随便看下吧。

点击此处打开ourdev_232656.pdf(文件大小:21K)

1http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_230235.JPG

2http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_230236.JPG

3http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_230237.JPG

4http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_230238.JPG

只做了3级菜单,

菜单结构:
struct menustruct                     //定义菜单结构
{
uchar *menu_name;                     //菜单名字
uchar menu_items;                     //菜单的项目数
struct menustruct *child_menu;      //子菜单
uchar (*menu_function) (viod);      //功能函数
};

typedef struct menustruct menu_struct;

如:
#define MAIN_MENU_ITEMS 6                  //主菜单条目数
menu_struct code main_menu[]=               //主菜单结构
{
        {"menu_1",MAIN_MENU_ITEMS,menu_1,NULL},
        {"menu_2",MAIN_MENU_ITEMS,menu_2,NULL},
        {"menu_3",MAIN_MENU_ITEMS,menu_3,NULL},
        {"menu_4",MAIN_MENU_ITEMS,menu_4,NULL},
        {"menu_5",MAIN_MENU_ITEMS,menu_5,NULL},
        {"menu_6",MAIN_MENU_ITEMS,menu_6,NULL}
};

菜单保存的结构:
typedef struct                        //菜单保存结构
{
menu_struct *menu_save_item;          //菜单保存前所显示项目
uchar menu_save_display;            //菜单保存前显示条目
uchar menu_save_where;                //菜单保存前显示位置
}menu_save;

menu_save menu_save_store[]=            //支持保存4级菜单
{
{main_menu,0,0},
{main_menu,0,0},
{main_menu,0,0},
{main_menu,0,0},
};

extern uchar idata menu_denpth=0;      //菜单深度值
extern uchar idata menu_updata_flag=1; //菜单更新标志

菜单显示程序:
//菜单显示程序,
void menu_display ()
{
uint num=504;

uchar *menu_dis_p;             //菜单字符显示地址指针
uchar menu_dis_item,menu_dis_where,menu_max_item; //要显示的条目,位置,本菜单的条目数
uchar num_temp,circle_temp,circle_temp_b;

menu_struct *menu_struct_p;    //菜单显示

if (menu_updata_flag){
menu_struct_p=(menu_save_store+menu_denpth)->menu_save_item;//得到要显示的当级菜单
menu_dis_item=(menu_save_store+menu_denpth)->menu_save_display;
menu_dis_where=(menu_save_store+menu_denpth)->menu_save_where;

menu_max_item=menu_struct_p->menu_items;

while (num--)    //清屏
    lcd_write (0x00);

num_temp=menu_dis_item-menu_dis_where;       //计算出起始显示条目
       
if (menu_max_item>lcd_max_display)          //确定屏幕显示条目数
    circle_temp_b=lcd_max_display;
else
    circle_temp_b=menu_max_item;

for (circle_temp=0;circle_temp<circle_temp_b;circle_temp++)//开始整屏显示
   {
    lcd_post (0,circle_temp);               //写好显示位置
    menu_dis_p=(menu_struct_p+num_temp)->menu_name;
    if (num_temp==menu_dis_item)            
   {
      while (*menu_dis_p)
      lcd_display_b (*menu_dis_p++);      //反显选中条目
   }
    else                                    
   {
      while (*menu_dis_p)                  
      lcd_display (*menu_dis_p++);          //正常显示菜单
   }
        num_temp++;
   }
   menu_updata_flag--;
}
}

菜单按键处理,改变菜单深度:
void menu_key (uchar menu_key_value)
{
   uchar menu_dis_item,menu_dis_where,menu_max_item; //要显示的条目,位置,本菜单的条目数
   menu_struct *menu_struct_p;

   menu_struct_p=(menu_save_store+menu_denpth)->menu_save_item;//得到当级菜单
   menu_dis_item=(menu_save_store+menu_denpth)->menu_save_display;
   menu_dis_where=(menu_save_store+menu_denpth)->menu_save_where;

   menu_max_item=menu_struct_p->menu_items;
   menu_max_item--;

   if (menu_key_value==up_key)                                 
   {
       if (menu_dis_item>0)
         {
         menu_dis_item--;
         if (menu_dis_where>0)
             menu_dis_where--;
                   (menu_save_store+menu_denpth)->menu_save_display=menu_dis_item;
                   (menu_save_store+menu_denpth)->menu_save_where=menu_dis_where;
                   menu_updata_flag++;
         }
   }
   else if (menu_key_value==down_key)
   {
       if (menu_dis_item<menu_max_item)
         {
         menu_dis_item++;
         if ((menu_dis_where<(lcd_max_display-1)))    //lcd_max_display=6
             menu_dis_where++;
                   (menu_save_store+menu_denpth)->menu_save_display=menu_dis_item;
                   (menu_save_store+menu_denpth)->menu_save_where=menu_dis_where;
                   menu_updata_flag++;
         }
   }
   else if (menu_key_value==esc_key)      
   {
           if (menu_denpth>0)
      {
          menu_denpth--;                     //菜单级数减一
                  menu_updata_flag++;
                }
       }
   else if (menu_key_value==enter_key)
   {
           if (((menu_struct_p+menu_dis_item)->child_menu)!=NULL)   //有子菜单
      {
                  menu_denpth++;                  //菜单级数加一
                  (menu_save_store+menu_denpth)->menu_save_item=(menu_struct_p+menu_dis_item)->child_menu;//保存此级菜单开始位置
                  (menu_save_store+menu_denpth)->menu_save_display=0;   //初始化菜单显示项目
                  (menu_save_store+menu_denpth)->menu_save_where=0;   //初始化菜单显示位置
                  menu_updata_flag++;
                }
       }
}

YQSH 发表于 2008-3-13 17:47:58

期待效果

wsnpy88 发表于 2008-3-13 17:58:59

也在期待效果

asktutu 发表于 2008-3-13 18:39:39

期待楼主效果。

cddyy 发表于 2008-3-13 20:14:06

上图了,大家看下,

Feeling_MCU 发表于 2008-3-13 21:07:02

不错,顶一下

benladn911 发表于 2008-3-13 21:16:25

代码写的很不错!照片也拍得很好!

micropower 发表于 2008-3-14 01:17:30

不知道楼主用这个屏做过图片的运动没?我也是用51控制这个屏,想让图片从边上慢慢移动出来,最后定格在中间,但是出来的效果却是刚开始出来一堆乱七八糟的东西,图片好像被风吹烂似的,但到最后却慢慢组成一个完整的图形!

cddyy 发表于 2008-3-14 10:55:43

to:【7楼】 micropower 流浪的飘云
不好意思啊,运动的图片没有做过,

soulmate 发表于 2008-3-14 11:09:54

不灵活~对于动态修改的变量显示无能为力~

cddyy 发表于 2008-3-14 12:01:32

TO:【9楼】 soulmate
呵呵,确实只能显示固定的,请问下如何才能动态修改的变量显示?小弟才刚刚开始写菜单。

csg0203 发表于 2008-3-14 12:41:20

好东西!正想做菜单,留个记号。

zhiwei 发表于 2008-3-14 12:56:19

不知道高手的字库怎么搞的。我以前上大学自己做字5×7,感觉有点难看啊。

cddyy 发表于 2008-3-14 14:46:10

发一个给你:
uchar code ziku[]={
0x00, 0x00, 0x00, 0x00, 0x00,// sp
0x00, 0x00, 0x2f, 0x00, 0x00,// !
0x00, 0x07, 0x00, 0x07, 0x00,// "
0x14, 0x7f, 0x14, 0x7f, 0x14,// #
0x24, 0x2a, 0x7f, 0x2a, 0x12,// $
0x62, 0x64, 0x08, 0x13, 0x23,// %
0x36, 0x49, 0x55, 0x22, 0x50,// &
0x00, 0x05, 0x03, 0x00, 0x00,// ’
0x00, 0x1c, 0x22, 0x41, 0x00,// (
0x00, 0x41, 0x22, 0x1c, 0x00,// )
0x14, 0x08, 0x3E, 0x08, 0x14,// *
0x08, 0x08, 0x3E, 0x08, 0x08,// +
0x00, 0x00, 0xA0, 0x60, 0x00,// ,
0x08, 0x08, 0x08, 0x08, 0x08,// -
0x00, 0x60, 0x60, 0x00, 0x00,// .
0x20, 0x10, 0x08, 0x04, 0x02,// /
0x3E, 0x51, 0x49, 0x45, 0x3E,// 0
0x00, 0x42, 0x7F, 0x40, 0x00,// 1
0x42, 0x61, 0x51, 0x49, 0x46,// 2
0x21, 0x41, 0x45, 0x4B, 0x31,// 3
0x18, 0x14, 0x12, 0x7F, 0x10,// 4
0x27, 0x45, 0x45, 0x45, 0x39,// 5
0x3C, 0x4A, 0x49, 0x49, 0x30,// 6
0x01, 0x71, 0x09, 0x05, 0x03,// 7
0x36, 0x49, 0x49, 0x49, 0x36,// 8
0x06, 0x49, 0x49, 0x29, 0x1E,// 9
0x00, 0x36, 0x36, 0x00, 0x00,// :
0x00, 0x56, 0x36, 0x00, 0x00,// ;
0x08, 0x14, 0x22, 0x41, 0x00,// <
0x14, 0x14, 0x14, 0x14, 0x14,// =
0x00, 0x41, 0x22, 0x14, 0x08,// >
0x02, 0x01, 0x51, 0x09, 0x06,// ?
0x32, 0x49, 0x59, 0x51, 0x3E,// @
0x7C, 0x12, 0x11, 0x12, 0x7C,// A
0x7F, 0x49, 0x49, 0x49, 0x36,// B
0x3E, 0x41, 0x41, 0x41, 0x22,// C
0x7F, 0x41, 0x41, 0x22, 0x1C,// D
0x7F, 0x49, 0x49, 0x49, 0x41,// E
0x7F, 0x09, 0x09, 0x09, 0x01,// F
0x3E, 0x41, 0x49, 0x49, 0x7A,// G
0x7F, 0x08, 0x08, 0x08, 0x7F,// H
0x00, 0x41, 0x7F, 0x41, 0x00,// I
0x20, 0x40, 0x41, 0x3F, 0x01,// J
0x7F, 0x08, 0x14, 0x22, 0x41,// K
0x7F, 0x40, 0x40, 0x40, 0x40,// L
0x7F, 0x02, 0x0C, 0x02, 0x7F,// M
0x7F, 0x04, 0x08, 0x10, 0x7F,// N
0x3E, 0x41, 0x41, 0x41, 0x3E,// O
0x7F, 0x09, 0x09, 0x09, 0x06,// P
0x3E, 0x41, 0x51, 0x21, 0x5E,// Q
0x7F, 0x09, 0x19, 0x29, 0x46,// R
0x46, 0x49, 0x49, 0x49, 0x31,// S
0x01, 0x01, 0x7F, 0x01, 0x01,// T
0x3F, 0x40, 0x40, 0x40, 0x3F,// U
0x1F, 0x20, 0x40, 0x20, 0x1F,// V
0x3F, 0x40, 0x38, 0x40, 0x3F,// W
0x63, 0x14, 0x08, 0x14, 0x63,// X
0x07, 0x08, 0x70, 0x08, 0x07,// Y
0x61, 0x51, 0x49, 0x45, 0x43,// Z
0x00, 0x7F, 0x41, 0x41, 0x00,// [
0x55, 0x2A, 0x55, 0x2A, 0x55,// 55
0x00, 0x41, 0x41, 0x7F, 0x00,// ]
0x04, 0x02, 0x01, 0x02, 0x04,// ^
0x40, 0x40, 0x40, 0x40, 0x40,// _
0x00, 0x01, 0x02, 0x04, 0x00,// ’
0x20, 0x54, 0x54, 0x54, 0x78,// a
0x7F, 0x48, 0x44, 0x44, 0x38,// b
0x38, 0x44, 0x44, 0x44, 0x20,// c
0x38, 0x44, 0x44, 0x48, 0x7F,// d
0x38, 0x54, 0x54, 0x54, 0x18,// e
0x08, 0x7E, 0x09, 0x01, 0x02,// f
0x18, 0xA4, 0xA4, 0xA4, 0x7C,// g
0x7F, 0x08, 0x04, 0x04, 0x78,// h
0x00, 0x44, 0x7D, 0x40, 0x00,// i
0x40, 0x80, 0x84, 0x7D, 0x00,// j
0x7F, 0x10, 0x28, 0x44, 0x00,// k
0x00, 0x41, 0x7F, 0x40, 0x00,// l
0x7C, 0x04, 0x18, 0x04, 0x78,// m
0x7C, 0x08, 0x04, 0x04, 0x78,// n
0x38, 0x44, 0x44, 0x44, 0x38,// o
0xFC, 0x24, 0x24, 0x24, 0x18,// p
0x18, 0x24, 0x24, 0x18, 0xFC,// q
0x7C, 0x08, 0x04, 0x04, 0x08,// r
0x48, 0x54, 0x54, 0x54, 0x20,// s
0x04, 0x3F, 0x44, 0x40, 0x20,// t
0x3C, 0x40, 0x40, 0x20, 0x7C,// u
0x1C, 0x20, 0x40, 0x20, 0x1C,// v
0x3C, 0x40, 0x30, 0x40, 0x3C,// w
0x44, 0x28, 0x10, 0x28, 0x44,// x
0x1C, 0xA0, 0xA0, 0xA0, 0x7C,// y
0x44, 0x64, 0x54, 0x4C, 0x44,// z
0x00, 0x08, 0x36, 0x41, 0x00,// {
0x00, 0x00, 0x7F, 0x00, 0x00,// |
0x00, 0x41, 0x36, 0x08, 0x00,// }
0x08, 0x10, 0x08, 0x04, 0x08    // ~
};
写完了记得加个0x00,

haizaolan 发表于 2008-3-15 10:28:02

牛人,是在NOKIA5110上做的吧!谢谢分享!

jizzll 发表于 2008-3-15 11:04:41

强人啊

liqu 发表于 2008-3-15 12:34:58

正要用,参考一下,先谢过了。

bjj9217 发表于 2008-3-15 17:00:18

顶一个!

haizaolan 发表于 2008-3-17 19:29:08

我觉得7楼的设计可以实现,而且设计出来后的显示效果应该不错!
我们一起努力做一下。

haizaolan 发表于 2008-3-17 19:39:08

学习了!!感谢1
对你这个挺感兴趣,看着很羡慕,能否把几个子函数传一下,见识一下!
lcd_display_b (*menu_dis_p++);      //反显选中条目   
lcd_write (0x00);
lcd_display (*menu_dis_p++);          //正常显示菜单
lcd_post (0,circle_temp);               //写好显示位置

cddyy 发表于 2008-3-17 20:39:25

TO:【19楼】 haizaolan,实际上就是5110LCD的操作函数呢~

//5510 LCD初始化
void lcd_init ()
{
   lcd_rst=0;
   lcd_rst=1;
   lcd_command (0x21);
   lcd_command (0x80);
   lcd_command (0x06);
   lcd_command (0x13);
   lcd_command (0x20);
   lcd_command (0x0c);
   lcd_command (0x40);
   lcd_command (0x80);

   lcd_clear ();    //清屏
}

//5110 LCD清屏
void lcd_clear (void)
{
   uint num=504;

   while (num--)
    lcd_write (0x00);
}
//5110 LCD命令写入
void lcd_command (uchar a)
{
   uchar num=8;

   lcd_cs=0;
   lcd_dc=0;
   while (num--)
    {
          lcd_clk=0;
          if (a&0x80)
          lcd_din=1;
          else lcd_din=0;
          lcd_clk=1;
          a<<=1;
        }
   lcd_cs=1;
}

//5110 LCD数据写入
void lcd_write (uchar b)
{
   uchar num=8;

   lcd_cs=0;
   lcd_dc=1;
   while (num--)
    {
          lcd_clk=0;
          if (b&0x80)
          lcd_din=1;
          else lcd_din=0;
          lcd_clk=1;
          b<<=1;
        }
   lcd_cs=1;
}

//5110 LCD显示位置定位,0-x-13,0-y-5
void lcd_post (uchar x,uchar y)
{
   x*=6;
   lcd_command (0x40|y);
   lcd_command (0x80|x);
}

//5110 LCD显示字符,ASCII码
void lcd_display (uchar c)
{
   uchar *p,num=5;

   c=c-0x20;
   p=ziku+c*5;
   while (num--)
    lcd_write (*p++);
   lcd_write (0x00);
}

//5110 LCD反显示字符,ASCII码
void lcd_display_b (uchar d)
{
   uchar *p,num=5;

   d=d-0x20;
   p=ziku+d*5;
   while (num--)
    lcd_write (~(*p++));
   lcd_write (0xff);
}

cddyy 发表于 2008-3-17 20:44:58

呵呵,其实这个东西的电路图没什么价值的,有用的是菜单的编写方法。
电路很简单,大家随便看下吧。

点击此处打开ourdev_232656.pdf(文件大小:21K)

makesoft 发表于 2008-3-18 07:31:37

程序写的很工整,不错~

haizaolan 发表于 2008-3-18 08:54:37

感谢cddyy!

my2jia 发表于 2008-3-18 10:55:27

好东西!

qianc1983 发表于 2008-3-18 16:30:34

谢谢楼主

zldiy 发表于 2008-3-18 17:14:04

不错。我也正在学习做个多级菜单。谢谢楼主了。

gwh1128 发表于 2008-4-12 11:55:39

好贴啊,谢谢

wkman 发表于 2008-4-12 21:50:15

黑白的屏没多大意思。。。彩色的手机屏还是有点贵,,,手上有个Nokia6610,又不想拆了,呵呵。

fjh120 发表于 2008-4-12 22:13:48

好东西!!!

ddcour 发表于 2008-4-12 22:38:13

路过,留点脚印

xingzhang 发表于 2008-4-13 02:05:51

多层菜单

最好用到实际才好

thinkok 发表于 2008-4-15 19:22:20

写得很好,不过没有我的方法简单,
这是以前做MP3时写的仿手机式的菜单,能显示图片,也可以显示动态变量,大家可以看看
http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=931228&bbs_page_no=1&search_mode=1&search_text=mp3&bbs_id=1000

coole 发表于 2008-4-17 10:11:01

路过,就要顶!

lovecsu 发表于 2008-4-17 18:12:02

很不错

duqinglin 发表于 2008-4-18 08:41:42

good

yulutong 发表于 2008-5-8 07:52:32

编译时出错 menu_1 没有定义,NULL也没有定义 怎么办?

yzlyear 发表于 2008-5-8 08:02:29

好东东

weiwgml 发表于 2008-5-12 23:24:21

不错

laoliu2008 发表于 2008-5-12 23:31:06

楼主用了反选 好像在51上不太适合 可能会刷慢吧

zjybest 发表于 2008-5-13 09:48:24

不错,简单好用

cskl 发表于 2008-5-28 09:09:45

a2066858 发表于 2009-10-22 22:34:51

多层菜单 正在学习中

jerkoh 发表于 2009-10-22 23:00:30

mark

agengood 发表于 2009-10-23 08:41:15

mark

lv998127 发表于 2009-10-23 09:16:04

最近也用51做菜单,很有参考价值

ldj7501 发表于 2009-10-23 09:32:31

mark

ksniper 发表于 2009-10-23 09:40:09

参考下

gxy508 发表于 2009-10-23 12:11:13

mark

sange 发表于 2009-10-23 14:25:11

mark

yu_studio 发表于 2009-10-23 14:48:57

好东西,值得收藏

longjunyi 发表于 2009-10-23 22:38:01

mark

fg121 发表于 2009-10-26 16:35:37

马克

dwrszgq 发表于 2009-11-3 21:05:14

液晶菜单,学习啦

DIDADI 发表于 2009-12-4 00:30:34

MARK

chinamanzhong 发表于 2009-12-9 22:09:09

好,mark

yunqian09 发表于 2009-12-10 00:15:49

标记下

stefgq 发表于 2009-12-10 07:57:13

mark

psocfans 发表于 2009-12-10 09:13:41

不错

dujuan8693 发表于 2009-12-18 22:05:00

LZ 师大的 能有这水平在你们同届中算很不错了

你QQ多少啊

加我QQ17805352

xlshaoscu 发表于 2009-12-29 11:45:28

记号 学习

lv998127 发表于 2009-12-29 12:43:03

进来支持下

weilan2200 发表于 2009-12-29 14:41:11

正想做呢,参考一下!

l503iu 发表于 2010-1-7 14:00:33

学习了~~~~~~~~

cuikai12345 发表于 2010-1-7 21:31:00

mark

gz_dailin 发表于 2010-1-7 22:06:57

mark

tianyuwei 发表于 2010-1-7 22:48:57

mark

cgbabc 发表于 2010-1-8 08:07:24

留个脚印

cmyldd 发表于 2010-1-8 09:55:10

不错

qwe7277 发表于 2010-1-8 10:06:43

mark

yours777 发表于 2010-1-8 10:30:00


把结构做大些,层可以做多,不过注意自己的变量

zywy 发表于 2010-1-8 15:48:03

mark

xicanlin 发表于 2010-1-8 15:56:26

学习了····

xlshaoscu 发表于 2010-1-8 16:18:16

楼主,我用你的思路实现了多级菜单,非常感谢。我想请教个问题,不知道楼主用的是什么显示器件,响应速度怎么样,我用的是st7920的128*64
每次清屏都要用很长时间,响应速度根本跟不上,但我又没有跟好的方法,还望赐教。

liumaojun_cn 发表于 2010-1-8 17:01:47

mark

majia123 发表于 2010-1-8 19:16:49

mark

gan1211 发表于 2010-1-8 20:45:14

占位学习

jjj206 发表于 2010-1-8 21:22:51

马克!

sitongwl 发表于 2010-1-10 21:19:51

谢谢啊,顶

ajin505 发表于 2010-1-10 23:02:33

mark一个 关注

wuxinping 发表于 2010-2-17 11:34:54

MARK

xiaoge 发表于 2010-3-3 16:15:23

谢谢了

zenboys 发表于 2010-3-18 14:37:29

东西不错的,就是还不能修改参数

stoneke 发表于 2010-3-18 18:36:04

真不错,思路很清晰~

wukaka 发表于 2010-3-20 12:13:38

THKS

pish 发表于 2010-3-20 13:54:52

MARK,, DING ...

chenfzg 发表于 2010-3-23 08:50:02

好~~~~

guhenggao 发表于 2010-3-23 11:55:19

mark

hpdell 发表于 2010-4-23 12:40:28

不错!!!!!!!

zlj2008 发表于 2010-4-23 13:55:45

学习了~~~~~~~~

jack_yu 发表于 2010-4-23 14:31:22

学习了。MARK

AIHHLI 发表于 2010-4-23 14:35:29

看看。

yusufu 发表于 2010-4-23 16:59:49

标记一下~~~

pengliang983 发表于 2010-4-23 21:29:27

mark

number007cool 发表于 2010-5-2 16:07:14

mark

ldj7501 发表于 2010-6-8 11:28:56

mark

sleet1986 发表于 2010-6-8 14:26:07

我也做过,感觉差不多

sleet1986 发表于 2010-6-8 14:27:06

我也做过,感觉差不多

liguohx 发表于 2010-9-7 09:08:57

mark

CHENXIAOTIAN 发表于 2010-9-7 13:30:17

做个记号 找时间仔细看看
页: [1] 2 3
查看完整版本: 刚刚编写的菜单,在51上通过