Board logo

标题: [分享]单片机+LCD显示菜单(C源程序+proteus仿真) [打印本页]

作者: zcllom    时间: 2008-12-12 13:22     标题: [分享]单片机+LCD显示菜单(C源程序+proteus仿真)

aytYISc4.jpg


图片附件: [[分享]单片机+LCD显示菜单(C源程序+proteus仿真)] aytYISc4.jpg (2008-12-12 13:02, 58.03 KB) / 下载次数 1663
http://bbs.eccn.com/attachment.php?aid=5834&k=77b1a36d09badd99b810307a4cb1fa3d&t=1732774657&sid=8Iy1SY


作者: zcllom    时间: 2008-12-12 13:23

主要程序:
CODE:

#define Null 0


/***********************
* 函数声明 *
***********************/
void ShowMenu(void);
void Menu_Change(unsigned char KeyNum);

/***********************
* 按键功能键宏定义 *
***********************/
#define UP '3'
#define Down '7'
#define Esc 'B'
#define Enter 'F'
#define Reset '0'


/**********************
* 目录结构体定义 *
**********************/
struct MenuItem
{
unsigned char MenuCount; //当前层节点数
unsigned char *DisplayString; //菜单标题
void (*Subs)(); //节点函数
struct MenuItem *ChildrenMenus; //子节点
struct MenuItem *ParentMenus; //父节点
};

/***********************
* 调用子函数区 *
***********************/
void NullSubs(void)
{
}
//----------------------以下为例子,请根据实际情况修改---------------------------

void TimeSet(void)
{
put_s("TimeSet");
}

void DateSet(void)
{
put_s("DateSet");
}

void AlertSet (void)
{
put_s("AlertSet");
}
//------------------------------------------------------------------------------

作者: zcllom    时间: 2008-12-12 13:24

CODE:

/***********************
* 结构体区 *
***********************/
//----------------------以下为例子,请根据实际情况修改---------------------------
struct MenuItem TimeMenu[4];
struct MenuItem FlashMenu[5];
struct MenuItem VoiceMenu[5];
struct MenuItem RobotMenu[5];
struct MenuItem MainMenu[5];

struct MenuItem TimeMenu[4]=
{ //MenuCount DisplayString Subs ChildrenMenus ParentMenus
{4, "1.Time Set", TimeSet, Null, MainMenu},
{4, "2.Date Set", DateSet, Null, MainMenu},
{4, "3.AlertSet", AlertSet, Null, MainMenu},
{4, "4.Back", NullSubs, MainMenu, MainMenu},
};

struct MenuItem FlashMenu[5]=
{ //MenuCount DisplayString Subs ChildrenMenus ParentMenus
{5, "1.Flash Record", NullSubs, Null, MainMenu},
{5, "2.Play", NullSubs, Null, MainMenu},
{5, "3.Pause", NullSubs, Null, MainMenu},
{5, "4.Flash Delete", NullSubs, Null, MainMenu},
{5, "5.Back", NullSubs, MainMenu, MainMenu},
};

struct MenuItem VoiceMenu[5]=
{ //MenuCount DisplayString Subs ChildrenMenus ParentMenus
{5, "1.Voice Record" , NullSubs, Null, MainMenu},
{5, "2.Play", NullSubs, Null, MainMenu},
{5, "3.Pause", NullSubs, Null, MainMenu},
{5, "4.Voice Delete", NullSubs, Null, MainMenu},
{5, "5.Back", NullSubs, MainMenu, MainMenu},
};

struct MenuItem RobotMenu[5]=
{ //MenuCount DisplayString Subs ChildrenMenus ParentMenus
{5, "1.Turn Left", NullSubs, Null, MainMenu},
{5, "2.Turn Right", NullSubs, Null, MainMenu},
{5, "3.Go Ahead", NullSubs, Null, MainMenu},
{5, "4.Go Back", NullSubs, Null, MainMenu},
{5, "5.Back", NullSubs, MainMenu, MainMenu},
};


struct MenuItem MainMenu[5]=
{ //MenuCount DisplayString Subs ChildrenMenus ParentMenus
{5, "1.Time Set" , NullSubs, TimeMenu, Null},
{5, "2.Voice Center", NullSubs, VoiceMenu, Null},
{5, "3.Robot Control", NullSubs, RobotMenu, Null},
{5, "4.Flash Option", NullSubs, FlashMenu, Null},
{5, "5.Back", NullSubs, MainMenu, MainMenu},
};
//------------------------------------------------------------------------------

作者: zcllom    时间: 2008-12-12 13:24

CODE:


/***********************
* 全局变量声明区 *
***********************/
struct MenuItem (*MenuPoint) = MainMenu; //结构体指针,指向结构体后由内部函数指针指向功能函数
unsigned char DisplayStart = 0; //显示时的第一个菜单项
unsigned char UserChoose = 0; //用户所选菜单项
unsigned char DisplayPoint = 0; //显示指针
unsigned MaxItems; //同级最大菜单数
unsigned char ShowCount=2; //同屏显示菜单数


/***********************
*显示函数区 *
***********************/
void ShowMenu(void)
{
unsigned char n;
MaxItems = MenuPoint[0].MenuCount;//定义最大同级菜单
DisplayPoint = DisplayStart;
for(n=0;DisplayPoint<MaxItems&&n<ShowCount;n++)
{if(DisplayPoint==UserChoose)
LCD_write_string(0,n,"->");
LCD_write_string(2,n,MenuPoint[DisplayPoint++].DisplayString);

}

}

void Menu_Change(unsigned char KeyNum)
{
if(KeyNum)
{
switch(KeyNum)
{
case UP:
UserChoose --;
if (UserChoose ==255)
{
UserChoose = 0;//上翻截至,如果要回滚赋值MaxItems-1
}
break;
case Esc:
if (MenuPoint[UserChoose].ParentMenus != Null)
{
MenuPoint = MenuPoint[UserChoose].ParentMenus;
UserChoose = 0;
DisplayStart = 0;
}
break;
case Down:
UserChoose ++;
if (UserChoose == MaxItems)
{
UserChoose = MaxItems-1;//下翻截至,如要回滚赋值为0
}
break;
case Enter:
if (MenuPoint[UserChoose].Subs != NullSubs)
{
(*MenuPoint[UserChoose].Subs)();
}
else if (MenuPoint[UserChoose].ChildrenMenus != Null)
{
MenuPoint = MenuPoint[UserChoose].ChildrenMenus;
UserChoose = 0;
DisplayStart = 0;
}
break;
case Reset:
MenuPoint = MainMenu;
UserChoose = 0;
DisplayStart = 0;
break;
default:break;
}
if (UserChoose%ShowCount==0) //一屏只能显示ShowCount行
DisplayStart = UserChoose;
else if(UserChoose==1||UserChoose== 3)
DisplayStart = UserChoose-1; //实现滚屏的关键
LCD_write_command(0x01); //液晶清屏,根据不同液晶函数自行修改
delay_nms(5); //液晶为慢速器件
ShowMenu();
}
}

作者: zcllom    时间: 2008-12-12 13:28

[Point=5]

C语言源代码+proteus仿真文件

需要的就回复,回复之后刷新本页!即可见下载地址:

本帖隐藏的内容需要回复才可以浏览
[/Point]

[此贴子已经被作者于2009-6-3 21:37:21编辑过]



附件: [[分享]单片机+LCD显示菜单(C源程序+proteus仿真)] LtSYulDO.rar (2008-12-12 13:08, 97.17 KB) / 下载次数 2238
http://bbs.eccn.com/attachment.php?aid=5835&k=561c6240034e60bcb4f3403f0a60daf8&t=1732774657&sid=8Iy1SY
作者: zcllom    时间: 2008-12-12 13:30

工程里的KEY.H有逻辑错误,需要修改

unsigned char get_key(void)
{
unsigned char i;
static unsigned char j;//按键记录

i=key_read();
if(i==0x00) //无有效按键按下
{
j=0x00; //清除按键记录
return 0x00; //程序退出
}
if(j==0) //为新按键!!!!这个地方需要改动,见下面改动
{
j=i; //保存本次结果
delay_nms(10); //延时去抖动
i=key_read();
if(i==j)
return i;
}
return 0x00;
}

修改一下

unsigned char get_key(void)
{
unsigned char i;
static unsigned char j;//按键记录

i=key_read();
if(i==0x00) //无有效按键按下
{
j=0x00; //清除按键记录
return 0x00; //程序退出
}
if(j!=i) //为新按键!!!!!改动之后!!!!
{
j=i; //保存本次结果
delay_nms(10); //延时去抖动
i=key_read();
if(i==j)
return i;
}
return 0x00;
}

这样就行了


作者: zcllom    时间: 2008-12-12 13:34

可能在有的C编译器里面,一个指针没有办法设为空指针,一个函数指针也没法设置为空。

在那样的编译器中就没办法实现啦。


作者: lhzw2001    时间: 2008-12-13 15:42

tks
作者: lqx999888    时间: 2008-12-16 13:07

我最近也在弄一个菜单程序,就是一直结构型数组怎样进参数传递的,可以讲讲吗?谢谢


作者: zcllom    时间: 2008-12-16 15:12

结构型数组怎样进参数传递的

=========================================

需要再定义一个结构型指针来控制


作者: tongzhijie    时间: 2008-12-20 15:46     标题: 好啊

好啊
作者: linhaiyy    时间: 2009-1-1 14:12

谢谢

[em01]
作者: grant.wen@liteo    时间: 2009-1-13 06:41

Which type LCD can be used ?

I have a YM12864J module , which core chip is the KS0108.


作者: zcllom    时间: 2009-1-13 11:23

grant.wen@liteon.com

Which type LCD can be used ?

I have a YM12864J module , which core chip is the KS0108.

=====================================================

YM12864J module include KS0108


作者: qxbneo    时间: 2009-1-13 16:31

谢谢


作者: kaiguandianyuan    时间: 2009-1-15 10:51

版主的资料太丰富了


作者: kaiguandianyuan    时间: 2009-1-15 10:51

不顶对不住斑竹


作者: lala2008    时间: 2009-2-2 17:13

good!
作者: ZJHTYS    时间: 2009-2-11 11:26

看看
作者: danyuan126    时间: 2009-2-15 04:26

see see


作者: dashu0554    时间: 2009-2-15 11:04

不错,找了很久了
作者: zcllom    时间: 2009-2-15 12:20

dashu0554
不错,找了很久了
==========================
踏破铁鞋无觅处,得来全不费工夫。

作者: Johnny.xia    时间: 2009-2-15 22:45     标题: [原创]

最近在做菜单,不知道怎么下手,参考一下!


作者: aloevera    时间: 2009-2-26 00:35

看看学习学习

[em07]
作者: sdwsh    时间: 2009-3-1 14:18

学习一下!


作者: p4511397    时间: 2009-3-4 09:36

学习学习
作者: sqshining    时间: 2009-3-4 17:02

看看,谢谢版主


作者: hxl861    时间: 2009-3-16 22:01

学习一下
作者: ly7531    时间: 2009-3-22 18:29

%u770B%u770B%uFF01
作者: liujunfa    时间: 2009-4-4 13:00

好,我正需要呢谢谢了
作者: belovedwupeng    时间: 2009-4-11 21:37

hao dongxi


作者: cjcheng    时间: 2009-4-20 18:59

很想看看
作者: giant-panda    时间: 2009-6-3 15:46

以下内容需要积分达到600才可以浏览
唉。。。

作者: zcllom    时间: 2009-6-3 22:54

以下内容需要积分达到600才可以浏览
唉。。。
=====================
哈哈,是我的错,现改为达到5分才可以浏览,多捧捧场。

作者: giant-panda    时间: 2009-6-4 10:41

谢谢楼主,现在可以看了,呵呵~~
作者: 123ddd    时间: 2009-6-6 19:33

非常感谢


作者: nimagebi    时间: 2009-6-7 10:44

kankan[em02]
作者: nimagebi    时间: 2009-6-7 10:46

kanakndsfasf
作者: hoing    时间: 2009-6-22 10:37

谢谢!!


作者: hfgdzt    时间: 2009-8-10 14:46

[em12][em12][em12]
作者: SUNYP    时间: 2009-9-13 00:09

谢谢您的分享!!
作者: weixian_30    时间: 2009-12-31 21:34

谢谢您的分享!!
作者: vivileung    时间: 2010-3-4 16:51

正在做这个东西,学习了
作者: kdlipm    时间: 2010-3-6 09:02

不错,下载一个看看!
作者: 282089463    时间: 2010-3-13 15:19

找好久了,谢谢
作者: afca    时间: 2010-3-19 15:19

ok!!!!!!!!!!!!!!!!!!!!!!!!!!!
作者: jd160311    时间: 2010-4-17 11:25

dingyixia谢谢
作者: zhaogzh0606    时间: 2010-4-21 14:22

谢谢楼主分享,对我很有用,非常感谢!
作者: andypxc    时间: 2010-4-22 08:34

谢谢




谢谢
作者: qqiuer    时间: 2010-4-25 13:44

这么好的帖子,倘若别人看不到,那么不是浪费楼主的心血吗?经过痛苦的思想斗争,我终于下定决心,牺牲小我,奉献大我。我要拿出这帖子奉献给世人赏阅,我要把这个帖子一直往上顶,往上顶!顶到所有人都看到为止!
TL431|6n137|ua741|4N25]
作者: tanglianbtx    时间: 2010-4-28 09:18

需要这个,参考下哈
作者: yajun566    时间: 2010-5-4 21:26

你好,请传个源码
作者: dmyz2004    时间: 2010-5-15 16:13

好啊```我想要`````
作者: aaa2742    时间: 2010-5-18 13:33

5# zcllom
作者: z82914    时间: 2010-5-25 11:28

1# zcllom

学习学习了
作者: humantree2010    时间: 2010-6-7 21:06

参考版主给的菜单程序,我用51做了一个,其它的都没问题,就是那个子函数不知道怎么弄。我用时间的做了一例子,但是最后什么都不显示了,为什么?对了,版主可以把你的那个例子贴出来吗?或是发到我的邮箱里:
284652449@qq.com
作者: humantree2010    时间: 2010-6-7 21:28

最近我也在做这个,谢谢版主提供的资料
作者: humantree2010    时间: 2010-6-7 21:30

好资料,谢谢版主
作者: humantree2010    时间: 2010-6-7 22:09

put_s("DateSet");里的put_s()是什么函数?
作者: liliang9554    时间: 2010-6-9 11:37

移动的话费越来越不值钱了,随便送啊
http://www.21ic.com/invad/invad.htm
作者: gnohyang    时间: 2010-6-21 11:50

I want to go to see
作者: lijuan060219    时间: 2010-7-22 09:23

学习 一下菜单 看了好多程序 还没有很了解
作者: proholy    时间: 2010-8-24 09:48

正是需要的
作者: kfxy    时间: 2010-9-9 16:02

看啊看 看看看看
作者: kfxy    时间: 2010-9-9 16:04

5# zcllom
作者: rookie8711    时间: 2010-9-15 15:14

哦  好东西
作者: jinwang01    时间: 2010-10-6 09:36

谢谢,好东西
作者: yueyunno1    时间: 2010-11-2 16:15

好东西,学习学习
作者: yutl0602    时间: 2010-11-3 21:08

楼主是好人啊!!!
作者: xmzcb    时间: 2010-11-5 14:59

我正在搞菜单设计,请发给我学习一下。谢谢!
作者: zhouaheng    时间: 2010-12-11 18:38

好东西 谢谢分享
作者: tanxuepan1985    时间: 2011-4-1 12:00

看一下嘛,就看一下
作者: lin_k0201    时间: 2011-4-8 15:13

想看看,非常想!
作者: jiuyu2003    时间: 2011-7-15 12:43

5# zcllom
需要谢谢
作者: wuxin2004    时间: 2011-7-16 00:13

氢气球轻轻巧巧轻轻巧巧
作者: yangyang1618    时间: 2011-7-26 10:54

好啊,想学
作者: 2507535985    时间: 2011-7-26 11:50

广西军区医院静脉曲张治疗中心
联系电话:0771-5359717
网址:http://www.995jmqz.com
专家QQ:2206509964
专家邮箱:2206509964@qq.com
地址:广西南宁市桃源路78号
来院路线:琅东站609路,安吉路32路,北大站10路,金桥站802路,茂桥站86路,五一路219路到桃源路中下;江南站29,607,802路,大沙田站802路到教育桃源路口下(桃源饭店旁、商务厅对面、广西军区门诊部四楼——静脉曲张科)。
作者: adamsecond    时间: 2011-10-14 12:59

学习一下  ~~~~~~~~~~~~~~~~~~~~~·········
作者: wcf8822    时间: 2011-12-6 15:09

5# zcllom
作者: lshdng    时间: 2011-12-23 15:56

厉害,在下正想取经。
作者: muyng    时间: 2011-12-31 14:31

谢谢分享。。。。
作者: xiaoxiao201205    时间: 2012-5-23 21:04

5# zcllom


好贴 谢谢
作者: eluanshi    时间: 2012-7-17 14:21

有没有更详细的?
作者: bjjdwx11    时间: 2012-7-17 16:41     标题: 北京装修网 万家乐热水器出水小是什么原因导致的

万家乐热水器出水小是什么原因导致的?
水垢太多导致脏赌或者水压太低是导致万家乐热水器http://www.51whwx.cn出水小的主要原因,维修招标网
水压高低的判断方法:将热水器花洒开到最大,并将混合阀完全扳到冷水端,观察出水量并试验水压,再向热水端旋转,直至完全转向热水端,观察水量与水压的变化情况。如果出水量整体偏小且水压变化不大,开水器销售维修,应初步判定为水压偏低,可考虑安装增压泵。
万家乐热水器出水小的原因和解决方法:
1.家里的自来水水压很低;解决方法:请专业维修人员加一个增压泵
2.热水器长时间使用没有清洗,seo优化培训,造成热水器内部堵塞,应给联系热水器清洗人员清洗机器。
3.花洒脏堵;清理堵塞物或更换花洒http://www.jinyoursqwx.cn
4.热水器进水口的滤网上有许多堵塞物;将滤网上的堵塞物清洗掉就可以了
北京万家乐热水器维修中心提醒您:如果您想对您的热水器有更多的了解,欢迎您拨打万家乐热水器维修服务电话咨询报修,我们会以最快的速度来为您提供最优质的上门检测、维修服务!http://www.wjlwx.com.cn




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0