amobbs.com 阿莫电子技术论坛

标题: 刚刚编写的菜单,在51上通过 [打印本页]

作者: cddyy    时间: 2008-3-13 17:09
标题: 刚刚编写的菜单,在51上通过
电路很简单,大家随便看下吧。

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

1

2

3

4

只做了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
期待效果
作者: wsnpy88    时间: 2008-3-13 17:58
也在期待效果
作者: asktutu    时间: 2008-3-13 18:39
期待楼主效果。
作者: cddyy    时间: 2008-3-13 20:14
上图了,大家看下,
作者: Feeling_MCU    时间: 2008-3-13 21:07
不错,顶一下
作者: benladn911    时间: 2008-3-13 21:16
代码写的很不错!照片也拍得很好!
作者: micropower    时间: 2008-3-14 01:17
不知道楼主用这个屏做过图片的运动没?我也是用51控制这个屏,想让图片从边上慢慢移动出来,最后定格在中间,但是出来的效果却是刚开始出来一堆乱七八糟的东西,图片好像被风吹烂似的,但到最后却慢慢组成一个完整的图形!
作者: cddyy    时间: 2008-3-14 10:55
to:【7楼】 micropower 流浪的飘云
不好意思啊,运动的图片没有做过,
作者: soulmate    时间: 2008-3-14 11:09
不灵活~对于动态修改的变量显示无能为力~
作者: cddyy    时间: 2008-3-14 12:01
TO:【9楼】 soulmate
呵呵,确实只能显示固定的,请问下如何才能动态修改的变量显示?小弟才刚刚开始写菜单。
作者: csg0203    时间: 2008-3-14 12:41
好东西!正想做菜单,留个记号。
作者: zhiwei    时间: 2008-3-14 12:56
不知道高手的字库怎么搞的。我以前上大学自己做字5×7,感觉有点难看啊。
作者: cddyy    时间: 2008-3-14 14:46
发一个给你:
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
牛人,是在NOKIA5110上做的吧!谢谢分享!
作者: jizzll    时间: 2008-3-15 11:04
强人啊
作者: liqu    时间: 2008-3-15 12:34
正要用,参考一下,先谢过了。
作者: bjj9217    时间: 2008-3-15 17:00
顶一个!
作者: haizaolan    时间: 2008-3-17 19:29
我觉得7楼的设计可以实现,而且设计出来后的显示效果应该不错!
我们一起努力做一下。
作者: haizaolan    时间: 2008-3-17 19:39
学习了!!感谢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
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
呵呵,其实这个东西的电路图没什么价值的,有用的是菜单的编写方法。
电路很简单,大家随便看下吧。

点击此处打开ourdev_232656.pdf(文件大小:21K)
作者: makesoft    时间: 2008-3-18 07:31
程序写的很工整,不错~
作者: haizaolan    时间: 2008-3-18 08:54
感谢cddyy!
作者: my2jia    时间: 2008-3-18 10:55
好东西!
作者: qianc1983    时间: 2008-3-18 16:30
谢谢楼主
作者: zldiy    时间: 2008-3-18 17:14
不错。我也正在学习做个多级菜单。谢谢楼主了。
作者: gwh1128    时间: 2008-4-12 11:55
好贴啊,谢谢
作者: wkman    时间: 2008-4-12 21:50
黑白的屏没多大意思。。。彩色的手机屏还是有点贵,,,手上有个Nokia6610,又不想拆了,呵呵。
作者: fjh120    时间: 2008-4-12 22:13
好东西!!!
作者: ddcour    时间: 2008-4-12 22:38
路过,留点脚印
作者: xingzhang    时间: 2008-4-13 02:05
多层菜单

最好用到实际才好
作者: thinkok    时间: 2008-4-15 19:22
写得很好,不过没有我的方法简单,
这是以前做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
路过,就要顶!
作者: lovecsu    时间: 2008-4-17 18:12
很不错
作者: duqinglin    时间: 2008-4-18 08:41
good
作者: yulutong    时间: 2008-5-8 07:52
编译时出错 menu_1 没有定义,NULL也没有定义 怎么办?
作者: yzlyear    时间: 2008-5-8 08:02
好东东
作者: weiwgml    时间: 2008-5-12 23:24
不错
作者: laoliu2008    时间: 2008-5-12 23:31
楼主用了反选 好像在51上不太适合 可能会刷慢吧
作者: zjybest    时间: 2008-5-13 09:48
不错,简单好用
作者: cskl    时间: 2008-5-28 09:09

作者: a2066858    时间: 2009-10-22 22:34
多层菜单 正在学习中
作者: jerkoh    时间: 2009-10-22 23:00
mark
作者: agengood    时间: 2009-10-23 08:41
mark
作者: lv998127    时间: 2009-10-23 09:16
最近也用51做菜单,很有参考价值
作者: ldj7501    时间: 2009-10-23 09:32
mark
作者: ksniper    时间: 2009-10-23 09:40
参考下
作者: gxy508    时间: 2009-10-23 12:11
mark
作者: sange    时间: 2009-10-23 14:25
mark
作者: yu_studio    时间: 2009-10-23 14:48
好东西,值得收藏
作者: longjunyi    时间: 2009-10-23 22:38
mark
作者: fg121    时间: 2009-10-26 16:35
马克
作者: dwrszgq    时间: 2009-11-3 21:05
液晶菜单,学习啦
作者: DIDADI    时间: 2009-12-4 00:30
MARK
作者: chinamanzhong    时间: 2009-12-9 22:09
好,mark
作者: yunqian09    时间: 2009-12-10 00:15
标记下
作者: stefgq    时间: 2009-12-10 07:57
mark
作者: psocfans    时间: 2009-12-10 09:13
不错
作者: dujuan8693    时间: 2009-12-18 22:05
LZ 师大的 能有这水平在你们同届中算很不错了

你QQ多少啊  

加我QQ17805352
作者: xlshaoscu    时间: 2009-12-29 11:45
记号 学习
作者: lv998127    时间: 2009-12-29 12:43
进来支持下
作者: weilan2200    时间: 2009-12-29 14:41
正想做呢,参考一下!
作者: l503iu    时间: 2010-1-7 14:00
学习了~~~~~~~~
作者: cuikai12345    时间: 2010-1-7 21:31
mark
作者: gz_dailin    时间: 2010-1-7 22:06
mark
作者: tianyuwei    时间: 2010-1-7 22:48
mark
作者: cgbabc    时间: 2010-1-8 08:07
留个脚印
作者: cmyldd    时间: 2010-1-8 09:55
不错
作者: qwe7277    时间: 2010-1-8 10:06
mark
作者: yours777    时间: 2010-1-8 10:30

把结构做大些,层可以做多,不过注意自己的变量
作者: zywy    时间: 2010-1-8 15:48
mark
作者: xicanlin    时间: 2010-1-8 15:56
学习了····
作者: xlshaoscu    时间: 2010-1-8 16:18
楼主,我用你的思路实现了多级菜单,非常感谢。我想请教个问题,不知道楼主用的是什么显示器件,响应速度怎么样,我用的是st7920的128*64
每次清屏都要用很长时间,响应速度根本跟不上,但我又没有跟好的方法,还望赐教。
作者: liumaojun_cn    时间: 2010-1-8 17:01
mark
作者: majia123    时间: 2010-1-8 19:16
mark
作者: gan1211    时间: 2010-1-8 20:45
占位学习
作者: jjj206    时间: 2010-1-8 21:22
马克!
作者: sitongwl    时间: 2010-1-10 21:19
谢谢啊,顶
作者: ajin505    时间: 2010-1-10 23:02
mark一个 关注
作者: wuxinping    时间: 2010-2-17 11:34
MARK
作者: xiaoge    时间: 2010-3-3 16:15
谢谢了
作者: zenboys    时间: 2010-3-18 14:37
东西不错的,就是还不能修改参数
作者: stoneke    时间: 2010-3-18 18:36
真不错,思路很清晰~
作者: wukaka    时间: 2010-3-20 12:13
THKS
作者: pish    时间: 2010-3-20 13:54
MARK,, DING ...
作者: chenfzg    时间: 2010-3-23 08:50
好~~~~
作者: guhenggao    时间: 2010-3-23 11:55
mark
作者: hpdell    时间: 2010-4-23 12:40
不错!!!!!!!
作者: zlj2008    时间: 2010-4-23 13:55
学习了~~~~~~~~
作者: jack_yu    时间: 2010-4-23 14:31
学习了。MARK
作者: AIHHLI    时间: 2010-4-23 14:35
看看。
作者: yusufu    时间: 2010-4-23 16:59
标记一下~~~
作者: pengliang983    时间: 2010-4-23 21:29
mark
作者: number007cool    时间: 2010-5-2 16:07
mark
作者: ldj7501    时间: 2010-6-8 11:28
mark
作者: sleet1986    时间: 2010-6-8 14:26
我也做过,感觉差不多
作者: sleet1986    时间: 2010-6-8 14:27
我也做过,感觉差不多
作者: liguohx    时间: 2010-9-7 09:08
mark
作者: CHENXIAOTIAN    时间: 2010-9-7 13:30
做个记号 找时间仔细看看




欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/) Powered by Discuz! X3.4