标题: [分享]单片机+LCD显示菜单(C源程序+proteus仿真) [打印本页]
作者: zcllom 时间: 2008-12-12 13:22 标题: [分享]单片机+LCD显示菜单(C源程序+proteus仿真)
图片附件: [[分享]单片机+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 |