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