[共享]LCD1602键盘显示模块实例——电子设计大赛F题启动菜单
2007年电子设计大赛结束了,我幸运的自2005年以来第二次赴京参加SONY杯的争夺,虽然未能如愿,但也算是公费旅游了一把。从2005年第一次使用LCD1602键盘显示模块以来,我的程序风格日渐稳定,形成了一系列函数模块。这次电子设计大赛,软件构架的形成,总共只用了1个小时,从数据采集、缓冲、通讯指令、到LCD驱动用户菜单的编写,都使用了现成的模块,不修改任何代码,直接拼装而成。
在这里,我首先将键盘显示模块的所有源代码公布出来,算是炫耀一下,希望大家多多拍砖。
后面我将会把F题的完整源代码公布。
点击此处下载ourdev_175041.rar(文件大小:312K) 关于这些函数和构架的编写思路和方法,我会在1月份出版的 AVR书籍中为大家详细讲解。
过一段时间,我会将该书的DEMO电子版上传到Ouravr上。 傻孩子也出书了,强! lz真牛! lz竟然能参加两次电赛,太强了,我知道时都是大二了 楼上,我也可以参加两次电设比赛哦,现在大二,07年参加过一次了,做的好烂啊,期待大三的那次,现在51用的比较溜了,开始学AVR,哈哈,傻孩子是我的偶像!!!和傻孩子一样喜欢偶尔出来臭美一下,偶尔臭美一下,不要拍砖哦./emotion/em163.gif 羡慕 顶 傻孩子真牛啊!哈哈! 07年我也是大二暑假,要参加2次不就是大一暑假就去参加了?
我运气不好,05年入校的,下一次是大四了,没机会了,有且仅能参加一次!
这样看来SONY杯倒不是很公平! 偶数年入学的才有两次机会……
SONY杯里面大有文章啊……如果没有“充足”的准备,是很难有机会看到SONY杯真容的。 一小群老师带着一群研究生代替三个本科生做电子大赛的项目 在规定时间内外加一周的时间 居然还流产了
狂晕 to 【10楼】 zx5111030 虫大小虫
哎……虽然我很想说这是个别现象……但是到北京交流的时候发现……可能不是个别现象…… 感觉这电赛含金量有点低,真是一群老师在旁边叽叽喳喳的叫个不停,我们比赛那个房间有几个组老师在弄,学生在旁边打下手,狂晕,还好我们院的几个队老师一概不管,我们都是靠自己实力来作,最后成绩都还不错…… 再猛的人遇到零时任务也容易流产的。
就当训练研究生了。。。至少有人收益了。
本科项目训练研究生,,研究生项目训练博士。。。以此类推。。。
值少不是啥都没效果。 牛人 未知这位傻孩子全国赛到底得几名? 2005年全国二等奖
2007年全国一等奖。
^_^ 你是做哪个题?F? 大四了你?呵呵,在此希望四川的同胞兄弟们早日走出阴霾!重建家园 2005年悬挂绘图系统
2007年跷跷板小车 呵呵,悬挂运动系统我也做过 呵呵,军哥也来这了 标记一下 傻孩子是牛人!目前正在看他的书《深入浅出AVR》是本好书嘿! 电子设计大赛F题启动菜单 偶像!!!!!!!!!!!! 回复【11楼】Gorgon Meducer 傻孩子
-----------------------------------------------------------------------
偷偷的顶一下下,你们不要告诉别人啊。 厉害LZ 。 大家都是牛人啊我也要努力 回复【楼主位】Gorgon Meducer 傻孩子
-----------------------------------------------------------------------
dddddddddddd 找资料中。。。学习^ ^ 标记下哈 mark 回复【楼主位】Gorgon Meducer 傻孩子
-----------------------------------------------------------------------
看了你的架构,可是按键的功能函数该怎样写呢,比方说 “设置时间” ,你文章里好像没有涉及, 设置时间需要用状态机,你可以参考一下如果用FPGA如何实现,然后把结构保留下来,
但是过程简化下,就可以了。 那比赛题目使用单片机做的吗? Gorgon Meducer 傻孩子大侠 :
我一直在琢磨你写的菜单结构,看你用的是结构体,里面把数据和处理数据的函数放在一个结构体里面,我百看也不能理解是怎么实现的? 这个好像是面向对象的程序设计了吧!? 可是我没有学过C++, 对面向对象的程序设计方法不理解? 你能不能详细的指导指导我们一下啊!?不胜感激!!!!!!!!!!! Gorgon Meducer 傻孩子:
傻孩子大侠,我很高兴把你的菜单结构弄懂了,非常非常的感谢你无私的帮助!是你让我从无知到有知!从迷惘到开明,再次表示衷心的感谢!
但是我碰到的一个问题是:我想实现一个3、4级或者更多级的菜单,不知道该怎么写!这个问题困扰了我很久也没办法解决!穷途之中再次想起了你!尽管很不好意思打扰大侠!不知道大侠能不能再在百忙之中抽出一点指点一二呀!多多感谢!!!! Gorgon Meducer 傻孩子:
大侠这么快就回复我了, 真是太感谢了,其实我也知道你菜单的意思了,多级的话就是再增加几个菜单结构型数组,也就是把这个链表作长一点 但是我我感觉那样的话,内存用起来就很可观了,然后我又仔细看了《一个占用内存极小的菜单实现》的那个例子,他用查索引号找对应的函数的方法,这样的话, 内存是少了, 但是改动就又很大。更何况我只是能看懂两位大侠的意思,照搬还可以,要我自己想又想不出好的办法来解决这个问题, 再三厚着脸皮来了,不知道大侠还能指点一二么?多多谢谢!!! 回复【楼主位】Gorgon Meducer傻孩子
-----------------------------------------------------------------------
厉害啊……加油 回复【楼主位】Gorgon Meducer 傻孩子
-----------------------------------------------------------------------
mark MARK 太好了呀,顶 "这次电子设计大赛,软件构架的形成,总共只用了1个小时,从数据采集、缓冲、通讯指令、到LCD驱动用户菜单的编写,都使用了现成的模块,不修改任何代码,直接拼装而成。"
看到楼主07年发表的帖子,不知道你现在对软件构架有什么新的见解没有.
我觉得,软件构架不是"形成了一系列函数模块",而是实现一种平台,让使用此平台的人能够快速的建立自己的应用.
我把整个工程分为 底层驱动,操作系统,中间件,上层应用 几层,除了"上层应用"外,其他几层的合集就构成了一个软件平台.在这个平台上使用的一些交换方式和处理才形成一定的软件构架,至于怎样编写软件平台来实现一个好的软件构架就是我现在遇到的问题了. 今年参加国赛的来看看学习一下下 楼主牛! MARK look MARK 楼主厉害啊,仰视中... 回复【1楼】Gorgon Meducer 傻孩子
-----------------------------------------------------------------------
深入浅出 avr 哪一章?谢谢!回复【1楼】Gorgon Meducer 傻孩子
关于这些函数和构架的编写思路和方法,我会在1月份出版的 avr书籍中为大家详细讲解。
过一段时间,我会将该书的demo电子版上传到ouravr上。
-----------------------------------------------------------------------
深入浅出 avr 哪一章?谢谢! to 【44楼】 zhu1982lin
没错,软件构架这个定义本身就不是Library,而是一个多层的框架(Framework)。一些基础的思想我在《〈深入浅出AVR单片机〉精要》里面有较为详细地阐述。你可以参考一下。http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3239709&bbs_page_no=1&bbs_id=3039
to 【51楼】 jupitermu
请参考同样的书。 回复【52楼】Gorgon Meducer 傻孩子
-----------------------------------------------------------------------
下载链接已经失效:)
留下我的信箱 muqingwei@126.com,呵呵有劳 LZ啦
洗洗去睡了。。。 to 【53楼】 jupitermu
联结没有失效阿。你在论坛里面下载《〈深入浅出AVR单片机〉精要》就可以了。 回复【54楼】Gorgon Meducer 傻孩子
to 【53楼】 jupitermu
联结没有失效阿。你在论坛里面下载《〈深入浅出avr单片机〉精要》就可以了。
-----------------------------------------------------------------------
多谢 已下载 虽然速度慢 mark MARK mark mark 很想问问键盘的设计思路{:biggrin:} willianlong 发表于 2011-5-29 16:54 static/image/common/back.gif
回复【楼主位】Gorgon Meducer 傻孩子
---------------------------------------------------------------- ...
版主,跟我们这些菜鸟讲讲你这个键盘模块的编程思想吧。代码看得头大了{:cry:} myyule1 发表于 2012-8-15 19:16 static/image/common/back.gif
版主,跟我们这些菜鸟讲讲你这个键盘模块的编程思想吧。代码看得头大了...
2007年的时候,我关于工程构架的概念还比较基础,写出来的东西层次感并不是很清晰,说起来我自己现在看都有点头晕。
简单说一下吧,你顺着
硬件抽象层:
HD_Support.c
HD_Support.h
EX_Support.c
EX_Support.h
系统服务层:
目录引擎
Menu_Config.c
Menu_Config.h
Menu_Implement.c
Menu_Implement.h
------------以上是目录引擎的代码,以下是具体目录功能的实现-----------------------------
Menu_Functions.c
Menu_Functions.h
通讯服务层
抽象数据类型:消息地图
RD_ADT_MSGMap.c
RD_ADT_MSGMap.h
该服务提供了一个自定义的的消息地图数据类型
串行通讯双缓冲
RD_UseSerialBuff.c
RD_UserSerialBuff.h
通讯协议引擎
RD_UseSerialFrame_PROC.c
RD_UseSerialFrame_PROC.h
这是一个系统调度器任务,串口数据通过硬件中断加入到缓冲区里面;通讯协议引擎在主循环
里面通过硬件调度器调度,当数据帧解析成功以后,就去查询消息地图,从而找到对应的指令
并执行指令的处理程序。
剩下的都是系统服务程序了,比如调度器之类。
Gorgon_Meducer 发表于 2012-8-16 11:22 static/image/common/back.gif
2007年的时候,我关于工程构架的概念还比较基础,写出来的东西层次感并不是很清晰,说起来我自己现在看都 ...
谢谢版主的回复,很感动。
还是要说下,可能我的意思没表达清楚,我不是对你的整个工程的架构不理解,而只是对这个键盘有关的代码编程思想不解。或者这么讲吧,很多人用马潮老师那本书中的键盘扫描的状态机来编程,而我就是没读懂你的编程思想。不理解你的编程思路时就只能生搬硬套你这个程序代码,都不会修改,更谈不上活学活用了。不知道版主能给出示意性的代码(中文)吗?或者把RD_UseKey.c中的代码后面加点注释。谢谢! myyule1 发表于 2012-8-16 11:41 static/image/common/back.gif
谢谢版主的回复,很感动。
还是要说下,可能我的意思没表达清楚,我不是对你的整个工程的架构不理解,而 ...
整个键盘扫描实际上是由三个部分组成
1、前端扫描函数,简单的返回一个按键值而不用做任何去抖操作
2、RD_UseKey.c 是一个通用的按键状态处理的状态机,负责从前端获取按键值(包括表示无按键的空键值)然后处理成短按键或者长按键
3、键盘缓冲区,当短按键或者长按键被识别出来后就直接放到键盘缓冲区里面可供别的任务调用。
本帖最后由 myyule1 于 2012-8-17 09:48 编辑
Gorgon_Meducer 发表于 2012-8-16 12:28 static/image/common/back.gif
整个键盘扫描实际上是由三个部分组成
1、前端扫描函数,简单的返回一个按键值而不用做任何去抖操作
2、RD ...
多谢,这个明白了。我厚着脸皮再问下,O(∩_∩)O哈哈~
/***********************************************************
* 函数说明:按键扫描码处理函数 *
* 输入: 无 *
* 输出: 无 *
* 调用函数:_USE_KEY_PRESS_SCAN_FUNC_INTERFACE() *
* -------------------------------------------------------- *
* [说 明] *
* 按下一个键以后,1s以内松开返回短按键键值 *
* 1s以上返回长按键键值。键值只保存一个周期 *
***********************************************************/
static void _Key_Scan(void)
{
static unsigned char OldKeyCode = KEY_NULL;
static unsigned char IfLongKeyPress = FALSE;
static unsigned intLongPressAcceleration = 0;
unsigned char NowKeyCode = _USE_KEY_PRESS_SCAN_FUNC_INTERFACE();
s_cKeyNum = KEY_NULL;
if ((OldKeyCode != NowKeyCode) && (g_wKeyPressDelayCounter == 0)) //怎么理解?
{
g_wKeyPressTimeCounter = 0;
LongPressAcceleration = 0x03ff;
if ((NowKeyCode == KEY_NULL) && (IfLongKeyPress == FALSE)) //程序进来时,OldKeyCode就被赋值为KEY_NULL了,"OldKeyCode = KEY_NULL",那这个IF语句什么情况为真 ,外面这层IF语句为真时 OldKeyCode != NowKeyCode
{
s_cKeyNum = OldKeyCode;
}
g_wKeyPressDelayCounter = KEY_PRESS_DELAY;
OldKeyCode = NowKeyCode;
IfLongKeyPress = FALSE;
}
else //又怎么理解呢?
{
s_cKeyNum = KEY_NULL;
if ((g_wKeyPressTimeCounter > _USE_KEY_LONG_PRESS_DELAY_TIME) && (IfLongKeyPress == FALSE))
{
#ifdef _USE_KEY_LONG_PRESS_REPEAT
if (LongPressAcceleration > _USE_KEY_LONG_PRESS_FASTEST_SPEED)
{
LongPressAcceleration >>= 1;
}
#endif
s_cLongKeyPressNum = NowKeyCode;
IfLongKeyPress = TRUE;
}
else
{
#ifdef _USE_KEY_LONG_PRESS_REPEAT
if (!(g_wKeyPressTimeCounter & LongPressAcceleration))
{
IfLongKeyPress = FALSE;
}
else
{
s_cLongKeyPressNum = KEY_NULL;
}
#else
s_cLongKeyPressNum = KEY_NULL;
#endif
}
}
}
myyule1 发表于 2012-8-17 09:44 static/image/common/back.gif
多谢,这个明白了。我厚着脸皮再问下,O(∩_∩)O哈哈~
你似乎未注意到OldKeyCode是静态局部变量,静态局部变量的那句初始化操作在执行main函数之
前就执行过了。在函数被调用的时候,那句话初始化操作是会被跳过的。 Gorgon_Meducer 发表于 2007-10-1 17:28 static/image/common/back.gif
关于这些函数和构架的编写思路和方法,我会在1月份出版的 AVR书籍中为大家详细讲解。
过一段时间,我会将该 ...
弱弱的问一下,这是所说的“AVR书籍”,具体是指哪本书?谢谢傻孩子哈。 向你学习哦 cumt_123456 发表于 2012-12-24 08:55 static/image/common/back.gif
弱弱的问一下,这是所说的“AVR书籍”,具体是指哪本书?谢谢傻孩子哈。 ...
看53楼。在精要的最后一章。虽然和现在我实际用的结构略微不同,但思想是类似的。 膜拜到痛哭流涕{:smile:} feixiang1990 发表于 2013-1-29 19:21 static/image/common/back.gif
膜拜到痛哭流涕
感动到无以复加~ 被代码震到了。。。。。。 收藏一下。很受教 学习,谢谢!!! 我来学习的,虽然帖子很老。 下来学习,感谢楼主... 学习了,前辈 学习!!!!!!!!!!!!!!11 崇拜加膜拜,大神厉害了 好吧,我也下载学习学习 非常好的资料学习一下,说好的F题完整源代码呢?
页:
[1]