刚刚编写的菜单,在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++;
}
}
} 期待效果 也在期待效果 期待楼主效果。 上图了,大家看下, 不错,顶一下 代码写的很不错!照片也拍得很好! 不知道楼主用这个屏做过图片的运动没?我也是用51控制这个屏,想让图片从边上慢慢移动出来,最后定格在中间,但是出来的效果却是刚开始出来一堆乱七八糟的东西,图片好像被风吹烂似的,但到最后却慢慢组成一个完整的图形! to:【7楼】 micropower 流浪的飘云
不好意思啊,运动的图片没有做过, 不灵活~对于动态修改的变量显示无能为力~ TO:【9楼】 soulmate
呵呵,确实只能显示固定的,请问下如何才能动态修改的变量显示?小弟才刚刚开始写菜单。 好东西!正想做菜单,留个记号。 不知道高手的字库怎么搞的。我以前上大学自己做字5×7,感觉有点难看啊。 发一个给你:
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, 牛人,是在NOKIA5110上做的吧!谢谢分享! 强人啊 正要用,参考一下,先谢过了。 顶一个! 我觉得7楼的设计可以实现,而且设计出来后的显示效果应该不错!
我们一起努力做一下。 学习了!!感谢1
对你这个挺感兴趣,看着很羡慕,能否把几个子函数传一下,见识一下!
lcd_display_b (*menu_dis_p++); //反显选中条目
lcd_write (0x00);
lcd_display (*menu_dis_p++); //正常显示菜单
lcd_post (0,circle_temp); //写好显示位置 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);
} 呵呵,其实这个东西的电路图没什么价值的,有用的是菜单的编写方法。
电路很简单,大家随便看下吧。
点击此处打开ourdev_232656.pdf(文件大小:21K) 程序写的很工整,不错~ 感谢cddyy! 好东西! 谢谢楼主 不错。我也正在学习做个多级菜单。谢谢楼主了。 好贴啊,谢谢 黑白的屏没多大意思。。。彩色的手机屏还是有点贵,,,手上有个Nokia6610,又不想拆了,呵呵。 好东西!!! 路过,留点脚印 多层菜单
最好用到实际才好 写得很好,不过没有我的方法简单,
这是以前做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 路过,就要顶! 很不错 good 编译时出错 menu_1 没有定义,NULL也没有定义 怎么办? 好东东 不错 楼主用了反选 好像在51上不太适合 可能会刷慢吧 不错,简单好用 好 多层菜单 正在学习中 mark mark 最近也用51做菜单,很有参考价值 mark 参考下 mark mark 好东西,值得收藏 mark 马克 液晶菜单,学习啦 MARK 好,mark 标记下 mark 不错 LZ 师大的 能有这水平在你们同届中算很不错了
你QQ多少啊
加我QQ17805352 记号 学习 进来支持下 正想做呢,参考一下! 学习了~~~~~~~~ mark mark mark 留个脚印 不错 mark 顶
把结构做大些,层可以做多,不过注意自己的变量 mark 学习了···· 楼主,我用你的思路实现了多级菜单,非常感谢。我想请教个问题,不知道楼主用的是什么显示器件,响应速度怎么样,我用的是st7920的128*64
每次清屏都要用很长时间,响应速度根本跟不上,但我又没有跟好的方法,还望赐教。 mark mark 占位学习 马克! 谢谢啊,顶 mark一个 关注 MARK 谢谢了 东西不错的,就是还不能修改参数 真不错,思路很清晰~ THKS MARK,, DING ... 好~~~~ mark 不错!!!!!!! 学习了~~~~~~~~ 学习了。MARK 看看。 标记一下~~~ mark mark mark 我也做过,感觉差不多 我也做过,感觉差不多 mark 做个记号 找时间仔细看看