单片机程序设计中颇为重要的“分层思想”
东西很实用,实际的家电中用途很广泛。
在看下面的东西之前,大家可以想一下,这东西难吗?相信大家都会很响亮的回答,"不难!!",然而我再问:"这东西麻烦吗?"我相信很多人肯定会说"很麻烦!!"这不禁让我想起开始学单片机的时候写这种按键的那程序,乱七八糟的结构。如果不相信的话,可以自己用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结构全部都是分层的。这东西不是绣花枕头,而是实际用在工程上面的,只是平时不多见帖子介绍,或者没有人特意这样来总结,又或者是有经验的工程师作为藏在心中的法宝吧,这个就不得而知。
单片机 相关文章:
- 单片机在电源设计中的应用(06-07)
- 基于单片机的锅炉液位控制装置设计(07-22)
- 基于SPWM的交流稳压电源设计方案(09-15)
- 基于单片机的电池保护电路系统设计(02-24)
- 晶闸管三相全控桥式整流电路的直流电源设计(02-08)
- 智能充电设备控制系统的硬件设计方案(02-14)