浅谈单片机程序设计中的“分层思想”,并不是什么神秘的东西,事实上很多做项目的工程师本身自己也会在用。看了不少帖子都发现没有提及这个东西,然而分层结构确是很有用的东西,参透后会有一种恍然大悟的感觉。如果说我不懂LCD怎么驱动,那好办,看一下datasheet,参考一下别人的程序,很快就可以做出来。但是如果不懂程序设计的思想的话,会给你做项目的过程中带来很多很多的困惑。
   参考了市面上各种各样的嵌入式书籍,MCS-51,AVR ,ARM 等都有看过,但是没有发现有哪本是介绍设计思想的,就算有也是凤毛麟角。写程序不难,但是程序怎么样才能写的好,写的快,那是需要点经验积累的。结构化模块化的程序设计的思想,是最基本的要求。然而怎么将这个抽象的概念运用到工程实践当中呢?那需要在做项目的过程中经历磨难,将一些东西总结出来,抽象升华为理论,对经验的积累和技术的传播都大有裨益。所以在下出来献丑一下,总结一些东西。就我个人的经验而谈,有两个设计思想是非常重要的。
   一个就是“时间片轮的设计思想”,这个对实际中解决多任务问题非常有用,通常可以用这个东西来判断一个人是单片机学习者,还是一个单片机工程师。这个必须掌握。由于网上介绍这个的帖子也不少,所以这里就不多说了。
   第二个就是我今天想说的主题“分层屏蔽的设计思想”。下面用扫描键盘程序例子作为引子,引出今天说的东西。
   问题的提出 :单片机学习板一般为了简单起见,将按键分配的很好,例如整个 4*4 的键盘矩阵分配到P1口上面,8条控制线,刚好。这样的话程序也非常好写。只需要简单的
KEY_DAT = P1;
端口的数据就读进来了。诚然,现实中没有这么好的事情。在实际的项目应用当中,单片机引脚的复用相当厉害,这跟那些所谓的单片机学习板就有很大的差别了。
   另外一个原因,一般设计来说,是“软件配合硬件”的设计流程,简单点说就是,先确定好硬件原理图,硬件布线,最后才是软件的开发,因为硬件修改起来比较麻烦,相对来说软件修改的时候比较好改。这个就是中国传统的阴阳平衡哲学原理。硬件设计和软件设计本来就是鱼和熊掌的关系,两者不可兼得。方便了硬件设计,很可能给写软件带来很大的麻烦。反过来说,方便了软件设计,硬件设计也会相当的麻烦。如果硬件设计和软件设计同时方便了,那只有两种可能,一是这个设计方案非常简单,二是设计师已经达到了一个非常高的境界。我们不考虑那么多情况,单纯从常用的实际应用的角度来看问题。 硬件为了布线的方便,很多时候会可能将IO口分配到不同的端口上面,例如上面说的4*4键盘,8根线分别分配到 P0 P1 P2 P3 上面去了。那么,开发板的那些扫描键盘程序可以去见鬼了。怎么扫按键?我想起了我刚开始学习的时候,分成3段非常相似的程序,一个一个按键的扫描的经历...... 或许有人不甘心,“那些东西我花了很长时间学习的,也用的好好的,怎么能说一句不用就不用?”虽然有点残忍,但是我还是想说“兄弟,接受现实吧,现实是残酷的......”
   不过,人区别于低等动物的差别,是人会创造,在碰到困难的时候会想办法解决,于是我们开始了沉思...... 后我们引入初中数学学的“映射”的概念来解决问题。基本思想就是,将不同端口的按键映射到相同端口上面。
这样按键扫描程序就分成3个层次了。
   1)最底层的是硬件层,完成端口扫描,20ms延时消抖,将端口的数据映射到一个KEY_DAT寄存器上面,KEY_DAT作为对上层驱动层的一个接口。
   2)中间的一层是驱动层,驱动层只对 KEY_DAT 寄存器的数值进行操作。简单点说,我们无论底层的硬件是怎么接线的,在驱动层都不需要关心,只需要关心 KEY_DAT 这个寄存器的数值是什么就可以了。这样出来的间接效果就是“屏蔽了底层硬件的差异”,所以驱动层写的程序就可以通用了。驱动层的另外一个功能是为了上层提供消息接口。我们用了类似window程序的消息的概念。这里可以提供一些按键消息,例如:按下消息,松开消息,长按键消息,长按键的时候的步进消息,等等。
   3)应用层。这里就是根据项目的不同分别写按键功能程序,属于最上层的程序。它使用的是驱动层提供的消息接口。在应用层写程序的思想就是,我不管下层是怎么工作的,我只关心按键消息。有按键消息来的时候我就执行功能,没有消息来的时候,我就什么也不做。
   下面用一个简单的常用的例子,说明我们这个设计思想的用法。秒表调整时间的时候,要求按着某个按键不放,时间能连续的向上增加。这个东西很实用,实际的家电中用途很广泛。在看下面的东西之前,大家可以想一下,这东西难吗?相信大家都会很响亮的回答,“不难!!”,然而我再问:“这东西麻烦吗?”我相信很多人肯定会说“很麻烦!!” 这不禁让我想起开始学单片机的时候写这种按键的那程序,乱七八糟的结构。如果不相信的话,可以自己用51写一下哦,那样就更加能体会本文说的分层结构的优越性。
   项目要求:两个按键,分别分配在P10 和P20,分别是“加”“减”按键,要求长按键的时候实现连续加和连续减的功能。
   实战:假设:按键上拉,没有按键的时候高电平,有按键的时候低电平,另外,为了突出问题,这里没有将延时消抖的程序写上去,在实际项目中应该加上。C语言函数参数的传递多种多样,这里作为例子,用了最简单的全局变量来传递参数,当然你也可以用 unsigned char ReadPort(void) 返回一个读键结果,甚至还可以 void ReadPort(unsigned char *pt) 用一个指针变量传递地址而达到直接修改变量的目的。方法是多种多样的,这个决定于每个人的程序风格。
1)开始写硬件层程序,完成映射
#define KYE_MIN 0X01
#define KEY_PLUS 0X01
unsigned char KeyDat;
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 按下,反则亦然。
不需要想的很神秘,映射就是这么一回事。如果还有其他按键的话,用同样办法,将他们全部映射到 KeyDat 上面。
2)驱动层程序编写
如果将 KeyDat想象成 P1 口,那么这个跟学习板那标准的扫描程序不就是一样了吗?对的,这个就是底层映射的目的了。
3)应用层程序编写
根据消息,硬件层是必须分离出来,然而驱动层和应用层的要求就不那么严格了,事实上一些简单的项目没有必要将这两层分离开来,根据实际应用灵活应对就可以了。其实这样写程序是很方便移植的,根据板子的不同而适当的修改一下硬件层那个 ReadPort 函数就完成了,驱动层和应用层很多代码可以不经过修改直接用,很能提高开发效率的。当然这个按键程序会存在一定的问题,特别是遇到常闭按键和点触按键的混合使用的场合。这个留给大家自己去想了,反正问题总是能找到解决办法的,尽管方法有好有坏。
结束语
以按键为媒介,介绍了程序设计当中的“分层屏蔽”的思想的原理和应用,按键只是一个例子,其实分层的思想普遍存在着程序设计当中。细心留意一下的话发现其实window,linux,网络的tcp/ip 结构全部都是分层的。这东西不是绣花枕头,而是实际用在工程上面的,只是平时不多见帖子介绍,或者没有人特意这样来总结,又或者是有经验的工程师作为藏在心中的法宝吧,这个就不得而知。不过好东西应该共享,菜鸟应该共勉,一起来学飞吧.

浅谈单片机程序设计中的“分层思想”!相关推荐

  1. 浅谈单片机程序设计中的“分层思想”

    "分层思想"并不是什么神秘的东西,事实上很多做项目的工程师本身自己也会在用.看了不少帖子都发现没有提及这个东西,然而分层结构确是很有用的东西,参透后会有一种恍然大悟的感觉.如果说我 ...

  2. 浅谈网络爬虫中广度优先算法和代码实现

    前几天给大家分享了网络爬虫中深度优先算法的介绍及其代码实现过程,没来得及上车的小伙伴们可以戳这篇文章--浅谈网络爬虫中深度优先算法和简单代码实现.今天小编给大家分享网络爬虫中广度优先算法的介绍及其代码 ...

  3. 计算机创业创新浅谈,浅谈计算机教学中如何渗透创业教育

    <浅谈计算机教学中如何渗透创业教育>由会员分享,可在线阅读,更多相关<浅谈计算机教学中如何渗透创业教育(5页珍藏版)>请在人人文库网上搜索. 1.浅谈计算机教学中如何渗透创业教 ...

  4. 浅谈V8引擎中的垃圾回收机制

    浅谈V8引擎中的垃圾回收机制 这篇文章的所有内容均来自 朴灵的<深入浅出Node.js>及A tour of V8:Garbage Collection,后者还有中文翻译版V8 之旅: 垃 ...

  5. c程序语言的常量变量和标识符,浅谈C语言中的常量与变量.pdf

    课程教育研究 CourseEducationResearch 2014年4月 上旬刊 教学.信息 浅谈C语言中的常量与变量 刘 星 (青 岛工学院商学院 山东 青岛 266300) [摘要]在任何一种 ...

  6. 虚拟化构建二分图(BZOJ2080 题解+浅谈几道双栈排序思想的题)

    虚拟化构建二分图 ------BZOJ2080 题解+浅谈几道双栈排序思想的题 本题的题解在最下面↓↓↓ 不得不说,第一次接触类似于双栈排序的这种题,是在BZOJ的五月月赛上. [BZOJ4881][ ...

  7. 浅谈单片机低功耗处理

    浅谈单片机低功耗处理 一.什么是低功耗处理 我们在研发电子产品的时候,经常会涉及到功耗的问题.因为电子产品肯定是要供电的,供电的方式最常用的几种是:220V交流直插供电.用直流适配器供电和电池供电.无 ...

  8. 浅谈 Linux 系统中的 SNMP Trap 【转】

    文章来源:浅谈 Linux 系统中的 SNMP Trap 简介 本文讲解 SNMP Trap,在介绍 Trap 概念之前,首先认识一下 SNMP 吧. 简单网络管理协议(Simple Network ...

  9. 管理经济学计算机会成本,浅谈管理经济学教学中机会成本运用.doc

    浅谈管理经济学教学中机会成本运用 浅谈<管理经济学>教学中机会成本运用 摘要:本文就<管理经济学>教学难点之一的机会成本的运用做了简要的介绍,主要涉及机会成本的定义.使用条件. ...

最新文章

  1. GeneratorSqlMapCustom(mybatis逆向工程)
  2. Hypercolumns笔记
  3. TouTiao开源项目 分析笔记10 实现通用普通文章片段页面
  4. 京东发力金融AI,欲再招50位金融AI顶级科学家 转载 2017年12月04日 00:00:00 42 12月1日,京东金融AI实验室在美国硅谷正式投入运营。亦在同一天,京东金融宣布,美国伊利诺伊大
  5. 连续写博客2个月之后,我感觉自己的心态有了一些变化
  6. 33. Search in Rotated Sorted Array
  7. input type=file 实现上传、预览、删除等功能
  8. python杨辉三角函数公式大全_python-1-杨辉三角算法总结
  9. UINavigationController的简单使用
  10. 消息队列面试 - 如何保证消息队列的高可用?
  11. mysql %3e -u -r_mysql基础
  12. 洛谷 1541 乌龟棋——dp
  13. org.mybatis.caches.ehcache.LoggingEhcache
  14. 查PHP代码有哪些软件,成语查询系统PHP
  15. 俞敏洪:梦想需要行动(转)
  16. Shell脚本编程实战
  17. 微信公众号js-sdk定位 获取经纬度和详细位置
  18. python 累乘函数_python之函数(二)
  19. Linux内核安装后reboot选择,Linux内核配置选项 参考(3)
  20. 运动控制卡的函数库与Linux,运动控制卡应用开发教程之ROS(下)

热门文章

  1. 第十五届全国大学生智能车竞赛线上竞赛方案(草案)
  2. 基于STM8H1K08的ISP HUB控制器
  3. php flock 死锁了,php – 防止由flock引起的死锁
  4. .net 连mysql代码_.net连接常用的数据库代码
  5. java+c#+json+时间_C#与Json时间的转换
  6. mysql embed_html中object和embed标签的区别
  7. 计算机CAI应用实例,运用CAI课件辅助实验的实例分析
  8. laravel mysql like_Laravel数据库查询中对 like 的值进行转义
  9. HDLBits 系列(44)状态机补录
  10. HDLBits 系列(35)Lemmings Game