单片机程序设计当中的“分层屏蔽”思想原理和应用_第1页
单片机程序设计当中的“分层屏蔽”思想原理和应用_第2页
单片机程序设计当中的“分层屏蔽”思想原理和应用_第3页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、本文格式为Word版,下载可任意编辑单片机程序设计当中的“分层屏蔽”思想原理和应用 分层的思想,并不是什么神奇的东西,事实上许多做项目的工程师本身自己也会在用。看了不少帖子都发觉没有提及这个东西,然而分层结构确是很有用的东西,参透后会有一种恍然大悟的感觉。假如说我不懂LCD怎么驱动,那好办,看一下datasheet,参考一下别人的程序,很快就可以做出来。但是假如不懂程序设计的思想的话,会给你做项目的过程中带来许多许多的困惑。 参考了市面上各种各样的嵌入式书籍,MCS-51,AVR,ARM等都有看过,但是没有发觉有哪本是介绍设计思想的,就算有也是凤毛麟角。写程序不难,但是程序怎么样才能写的好,写

2、的快,那是需要点阅历积累的。结构化模块化的程序设计的思想,使最基本的要求。然而这么将这个抽象的概念运用到工程实践当中恩?那需要在做项目的过程中经受磨难,将一些东西总结出来,抽象升华为理论,对阅历的积累和技术的传播都大有裨益。所以在下出来献丑一下,总结一些东西。 就我个人的阅历而谈,有两个设计思想是特别重要的。 一个就是“时间片轮的设计思想”,这个对实际中解决多任务问题特别有用,通常可以用这个东西来推断一个人是单片机学习者,还是一个单片机工程师。这个必需把握。由于网上介绍这个的帖子也不少,所以这里就不多说了。 其次个就是我今日想说的主题“分层屏蔽的设计思想”。下面用扫描键盘程序例子作为引子,引出

3、今日说的东西。 问题的提出 单片机学习板一般为了简洁起见,将按键安排的很好,例如整个4*4的键盘矩阵安排到P1口上面,8条掌握线,刚好。这样的话程序也特别好写。只需要简洁的 KEY_DAT = P1; 端口的数据就读进来了。 诚然,现实中没有这么好的事情。在实际的项目应用当中,单片机引脚的复用相当厉害,这跟那些所谓的单片机学习板就有很大的差别了。 另外一个缘由,一般设计来说,是“软件协作硬件”的设计流程,简洁点说就是,先确定好硬件原理图,硬件布线,最终才是软件的开发,由于硬件修改起来比较麻烦,相对来说软件修改的时候比较好改。这个就是中国传统的阴阳平衡哲学原理。硬件设计和软件设计原来就是鱼和熊掌

4、的关系,两者不行兼得。便利了硬件设计,很可能给写软件带来很大的麻烦。反过来说,便利了软件设计,硬件设计也会相当的麻烦。假如硬件设计和软件设计同时便利了,那只有两种可能,一是这个设计方案特别简洁,二是设计师已经达到了一个特别高的境界。我们不考虑那么多状况,单纯从常用的实际应用的角度来看问题。 硬件为了布线的便利,许多时候会可能将IO口安排到不同的端口上面,例如上面说的4*4键盘,8根线分别安排到P0 P1 P2 P3上面去了。那么,开发板的那些扫描键盘程序可以去见鬼了。怎么扫按键?我想起了我刚开头学习的时候,分成3段特别相像的程序,一个一个按键的扫描的经受 或许有人不甘心,“那些东西我花了很长时

5、间学习的,也用的好好的,怎么能说一句不用就不用?”虽然有点残忍,但是我还是想说“兄弟,接受现实吧,现实是残酷的” 不过,人区分于低等动物的差别,是人会制造,在遇到困难的时候会想方法解决,于是我们开头了深思 最终我们引入学校数学学的“映射”的概念来解决问题。基本思想就是,将不同端口的按键映射到相同端口上面。 这样按键扫描程序就分成3个层次了。 1)最底层的是硬件层,完成端口扫描,20ms延时消抖,将端口的数据映射到一个KEY_DAT寄存器上面,KEY_DAT作为对上层驱动层的一个接口。 2)中间的一层是驱动层,驱动层只对KEY_DAT寄存器的数值进行操作。简洁点说,我们无论底层的硬件是怎么接线的

6、,在驱动层都不需要关怀,只需要关怀KEY_DAT这个寄存器的数值是什么就可以了。这样出来的间接效果就是“屏蔽了底层硬件的差异”,所以驱动层写的程序就可以通用了。 驱动层的另外一个功能是为了上层供应消息接口。我们用了类似window程序的消息的概念。这里可以供应一些按键消息,例如:按下消息,松开消息,长按键消息,长按键的时候的步进消息,等等。 3)应用层。这里就是依据项目的不同分别写按键功能程序,属于最上层的程序。它使用的是驱动层供应的消息接口。在应用层写程序的思想就是,我不管下层是怎么工作的,我只关怀按键消息。有按键消息来的时候我就执行功能,没有消息来的时候,我就什么也不做。 下面用一个简洁的

7、常用的例子,说明我们这个设计思想的用法。 秒表调整时间的时候,要求按着某个按键不放,时间能连续的向上增加。这个东西很有用,实际的家电中用途很广泛。 在看下面的东西之前,大家可以想一下,这东西难吗?信任大家都会很洪亮的回答,“不难!”,然而我再问:“这东西麻烦吗?”我信任许多人确定会说“很麻烦!”这不禁让我想起开头学单片机的时候写这种按键的那程序,乱七八糟的结构。假如不信任的话,可以自己用51写一下哦,那样就更加能体会本文说的分层结构的优越性。 项目要求: 两个按键,分别安排在P10和P20,分别是“加”“减”按键,要求长按键的时候实现连续加和连续减的功能。 实战: 假设: 按键上拉,没有按键的

8、时候高电平,有按键的时候低电平,另外,为了突出问题,这里没有将延时消抖的程序写上去,在实际项目中应当加上。C语言函数参数的传递多种多样,这里作为例子,用了最简洁的全局变量来传递参数,当然你也可以用unsigned char ReadPort(void)返回一个读键结果,甚至还可以void ReadPort(unsigned char *pt)用一个指针变量传递地址而达到直接修转变量的目的。方法是多种多样的,这个打算于每个人的程序风格。 1)开头写硬件层程序,完成映射 #define KYE_MIN 0X01 #define KEY_PLUS 0X01 unsigned char KeyDat;

9、 void ReadPort(void) if (P1 KEY_PLUS = 0 ) KeyDat |= 0x01 ; if (P2 KEY_MIN = 0 ) KeyDat |= 0x02 ; C语言应当很简单看懂吧?假如KEY_PLUS按下,P10口读到低电平,则P1 KEY_PLUS的结果为0,满意if的条件,进入KeyDat |= 0x01是将KeyDat的bit0置一,也就是说,将KEY_PLUS映射到KeyDat的bit0 KEY_MIN是同样的道理映射到KeyDat的bit1 假如KeyDat的bit0为1,则说明KEY_PLUS按下,反则亦然。 不需要想的很神奇,映射就是这么一

10、回事。假如还有其他按键的话,用同样方法,将他们全部映射到KeyDat上面。 2)驱动层程序编写 假如将KeyDat想象成P1口,那么这个跟学习板那标准的扫描程序不就是一样了吗?对的,这个就是底层映射的目的了。 3)应用层程序编写 依据消息 硬件层是必需分别出来,然而驱动层和应用层的要求就不那么严格了,事实上一些简洁的项目没有必要将这两层分别开来,依据实际应用敏捷应对就可以了。其实这样写程序是很便利移植的,依据板子的不同而适当的修改一下硬件层那个ReadPort函数就完成了,驱动层和应用层许多代码可以不经过修改直接用,很能提高开发效率的。当然这个按键程序会存在肯定的问题,特殊是遇到常闭按键和点触按键的混合使用的场合。这个留给大家自己去想了,反正问题总是能找到解决方法的,尽管方法有好有坏。 结束语 以按键为媒介,介绍了程序设计当中的“分层屏蔽”的思想的原理和应用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论