第1页共13页编号:时间:2021年x月x日书山有路勤为径,学海无涯苦作舟页码:第1页共13页“从单片机初学者迈向单片机工程师”之LED主题讨论周第五章--多任务环境下的数码管编程设计数码管在实际应用中非常广泛,尤其是在某些对成本有限制的场合。编写一个好用的LED程序并不是那么的简单。曾经有人这样说过,如果用数码管和按键,做一个简易的可以调整的时钟出来,那么你的单片机就算入门了60%了。此话我深信不疑。我遇到过很多单片机的爱好者,他们问我说单片机我已经掌握了,该如何进一步的学习下去呢?我并不急于回答他们的问题,而是问他们:会编写数码管的驱动程序了吧?“嗯”。会编写按键程序了吧?“嗯”。好,我给你出一个小题目,你做一下。用按键和数码管以及单片机定时器实现一个简易的可以调整的时钟,要求如下:8位数码管显示,显示格式如下时-分-秒XX-XX-XX要求:系统有四个按键,功能分别是调整,加,减,确定。在按下调整键时候,显示时的两位数码管以1Hz频率闪烁。如果再次按下调整键,则分开始闪烁,时恢复正常显示,依次循环,直到按下确定键,恢复正常的显示。在数码管闪烁的时候,按下加或者减键可以调整相应的显示内容。按键支持短按,和长按,即短按时,修改的内容每次增加一或者减小一,长按时候以一定速率连续增加或者减少。结果很多人,很多爱好者一下子都理不清楚思路。其实问题的根源在于没有以工程化的角度去思考程序的编写。很多人在学习数码管编程的时候,都是照着书上或者网上的例子来进行试验。殊不知,这些例子代码仅仅只是具有一个演示性的作用,拿到实际中是很难用的。举一个简单的例子。下面这段程序是在网上随便搜索到的:while(1){for(num=0;num<9;num++){P0=table[num];P2=code[num];第2页共13页第1页共13页编号:时间:2021年x月x日书山有路勤为径,学海无涯苦作舟页码:第2页共13页delayms(2);}}看出什么问题来了没有,如果没有看出来请仔细想一下,如果还没有想出来,请回过头去,认真再看一遍“学会释放CPU”这一章的内容。这个程序作为演示程序是没有什么问题的,但是实际应用的时候,数码管显示的内容经常变化,而且还有很多其它任务需要执行,因此这样的程序在实际中是根本就无法用的,更何况,它这里也调用了delayms(2)这个函数来延时2ms这更是令我们深恶痛绝本章的内容正是探讨如何解决多任务环境下(不带OS)的数码管程序设计的编写问题。理解了其中的思想,无论要求我们显示的形式怎么变化(如数码管闪烁,移位等),我们都可以很方便的解决问题。数码管的显示分为动态显示和静态显示两种。静态显示是每一位数码管都用一片独立的驱动芯片进行驱动。比较常见的有74LS164,74HC595等。利用这类芯片的好处就是可以级联,留给单片机的接口只需要时钟线,数据线,因此比较节省I/O口。如下图所示:利用74LS164级联驱动8个单独的数码管静态显示的优点是程序编写简单。但是由于涉及到的驱动芯片数量比较多,同时考虑到PCB的布线等等因素,在低成本要求的开发环第3页共13页第2页共13页编号:时间:2021年x月x日书山有路勤为径,学海无涯苦作舟页码:第3页共13页境下,单纯的静态驱动并不合适。这个时候就可以考虑到动态驱动了。动态驱动的图如下所示(以EE21开发板为例)由上图可以看出。8个数码管的段码由一个单独的74HC573驱动。同时每一个数码管的公共端连接在另外一个74HC573的输出上。当送出第一位数码管的段码内容时候,同时选通第一位数码管的位选,此时,第一位数码管就显示出相应的内容了。一段时间之后,送出第二位数码管段码的内容,选通第二位数码管的位选,这时显示的内容就变成第二位数码管的内容了……依次循环下去,就可以看到了所有数码管同时显示了。事实上,任意时刻,只有一位数码管是被点亮的。由于人眼的视觉暂留效应以及数码管的余辉效应,当数码管扫描的频率非常快的时候,人眼已经无法分辨出数码管的变化了,看起来就是同时点亮的。我们假设数码管的扫描频率为50Hz,则完成一轮扫描的时间就是1/50=20ms。我们的系统共有8位数码管,则每一位数码管在一轮扫描周期中点亮的时间为20/8=2.5ms。动态扫描对时间要求有一点点...