显示器件应用分析精粹:从芯片架构到驱动程序设计
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第4章 LED数码管静态驱动原理

如果你觉得实现LED闪烁功能没什么挑战,那就试试LED数码管(segment display,下文简称数码管)吧!它是将多个LED发光单元制作成一定的形状,并按特定位置排列封装在一起的显示器件。最常用的数码管是“8”字型的,相应的一位数码管引脚定义通常如图4.1所示。

图4.1 一位数码管的引脚定义

一位数码管通常有两种引脚排列方式,图4.1b所示排列方式一般存在于尺寸比较小的数码管中(例如9mm),这样可以使引脚的间距不会那么紧张(因为数码管的宽度比较小)。这里所说的9mm指的是数码管“8”字的高度,换算成英制单位就是0.36in(英寸),如图4.2所示。

图4.2 0.36in数码管

英寸是电子工程师对数码管大小的通俗称谓,其他常用的还有0.4英寸、0.56英寸等。为了方便对数码管进行显示控制,我们使用字母对每个LED发光单元进行了标记,也称为“段(Segment)”。“8”字型数码管按段的数量通常可分为七段与八段,后者比前者多了右下方那一个小数点(dp)发光单元。需要注意的是,不同厂家数码管的引脚分布可能不是完全一致的,对于图4.1a所示数码管,左下角引脚号为1,其对应为e段,然后逆时针分别为引脚2,其对应为d段,其他依此类推。

LED数码管按内部LED发光单元的具体连接方式可分为共阳(Common Anode,CA)与共阴(Common Cathnode,CC)两类,共阳八段LED数码管的内部电路如图4.3所示。

图4.3 共阳八段LED数码管内部电路

从图中可以看到,八个段对应的LED阳极都是连接在一起的,所以才称其为共阳极,而这个公共阳极引脚也经常会标记为COM。在实际应用时,共阳数码管的COM引脚应该与高电平(通常是正电源)连接,此时如果将某个LED的阴极设置为低电平“0”,相应的字段就会被点亮,而将某个LED的阴极设置为高电平“1”时,相应的字段就不会被点亮。例如,显示数字“6”时对应各段的状态如图4.4所示。

图4.4 共阳数码管的输入电平相应的显示状态

还有一种共阴极类型的LED数码管,它将所有LED的阴极连接到一起并引出一个公共阴极(COM)。与共阳数码管恰好相反,在实际应用时,COM引脚应该接低电平(通常是公共地),相应的内部电路如图4.5所示。

图4.5 八段LED共阴数码管内部电路示意

图4.1中引脚名A(C)就表示“共阳(共阴)”,这也意味着同一型号数码管的引脚是完全兼容的。为了方便后续使用单片机控制数码管显示需要的字符,这里总结了显示各种字符时各段对应的输入电平状态。共阴数码管的显示字符与相应的驱动电平信号见表4.1所示。

表4.1 共阴数码管显示字符及相应的驱动电平信号

所有段驱动电平的十六进制码称为字型码(注意各段对应字型码的位顺序,低位为段a,高位为段g),将共阴数码管的字型码取反就可以直接驱动共阳数码管。例如,共阳数码管需要显示字符“6”时,将共阴数码管显示字符“6”所需的字型码0x7D(0b111_1101,下划线为位分隔符,无实际意义,当位数比较多时有助于阅读)全部取反(非逻辑)得到0x02(0b000_0010)即可。

在使用单片机产生控制电平时,一般不使用引脚直接驱动数码管,因为需要的控制引脚数量比较多,单片机消耗的总电流可能会比较大,容易引起发热而导致系统不稳定。最常用的方法就是使用三极管间接驱动,共阴数码管的驱动方案仿真电路如图4.6所示。

图4.6 单片机间接驱动共阴数码管

在硬件电路设计方面,需要特别注意数码管段引脚与单片机P1控制引脚之间的对应关系。Proteus软件平台中一位数码管引脚定义从左至右依次为a、b、c、d、e、f、g、dp(未使用),我们将P1口的最低位P1.0与段a对应,将P1.6与段g对应,这意味着表4.1中的共阴字型码可以直接使用。

下面来实现数码管循环显示数字0~9的功能,其相应的源代码如清单4.1所示。

清单4.1 驱动共阴数码管源代码

首先定义了一个display_char数组,并且使用表4.1所示共阴数码管的字型码进行初始化,数组索引0所在位置保存数字0的字型码,数组索引1所在位置保存数字1的字型码,其他依此类推。这样我们就可以直接通过查表的方式获得数字0~9对应的字型码。

接下来发生的事情就很容易预料到了,在main函数中,我们定义了一个变量i保存将要显示的数字,同时将其初始化为0,表示将要从0开始显示。然后在while语句中利用变量i从display_char数组中查到数字0对应的字型码赋给P1口,也就能够将数码管显示数字0。紧接着我们延时约1秒后再对变量i进行累加,变量i每变化一次就能够使数码管显示相应的数字。当变量i累加后的值大于8(也就是当前显示数字为9)时置0,然后循环执行上述过程即可。

需要注意的是,我们在将字型码推送到P1口之前将其进行了位取反(运算符“~”),这是为了抵消PNP型三极管本身就是反相逻辑的事实。另外,图4.6所示电路在仿真时有些显示数字会出现乱码,这是由于数码管的仿真模型导致的,实际器件搭建的电路不会出现这种问题。

下面同样来看看共阳数码管的驱动方案,如图4.7所示。

图4.7 单片机间接驱动共阳数码管

图4.7所示电路的仿真结果完全无效(使用实际元器件搭建的电路是可以正常工作的),总是显示数字8(图4.6所示电路的仿真结果虽然有些乱码,但还是可以看得出显示数字的变化)。这是因为Proteus软件平台中数码管的显示行为是由软件模拟的,它将所有段引脚都定义为输入(Input),当三极管因基极输入为低电平而处于截止状态时,理论上相应的段引脚上出现的是高电平(而使发光单元熄灭),但是LED数码管仿真器件可不像实际的LED那样:给阳极施加正电压就会从阴极出现稍小一些的正电压。换句话说,此时所有三极管都工作在开集(Open Collector,OC)输出状态(三极管的集电极是开路的),它们不具备输出高电平而让数码管熄灭的能力。为了让其显示正常,我们需要在每个三极管的集电极与电源之间连接一个上拉电阻(例如1kΩ),代码可以直接使用清单4.1,但要取消给P1赋值前的取反操作。

可以看到,使用三极管驱动LED数码管需要的元器件还是有点多,为了进一步简化电路,也可以使用ULN2003A芯片来驱动,如图4.8所示。

图4.8 使用ULN2003A芯片驱动共阳数码管

ULN2003A内部包含7路反相器,它发挥的功能与图4.7所示电路中的NPN型三极管完全一样(即输入端为高电平时输出端为低电平,输入端为低电平时输出端为高电平),只不过每个反相器都是由高耐压、大电流的复合管组成,可以用来驱动高达500mA的电流,用来驱动LED数码管自然也不在话下。

ULN2003A内部每一路反相器的电路结构如图4.9所示。

图4.9 ULN2003A内部反相器

由于输入已经集成了一个2.7kΩ的基极电阻,所以可以省略三极管基极的限流电阻,3kΩ的电阻可以将VT1的部分穿透电流分流到地,防止进一步被VT2放大引起热失控现象。另外,每一路反相器的输出都与一个二极管的阳极连接,在驱动诸如继电器、电动机等感性负载时,二极管的阴极(COM引脚)必须与电源连接,该二极管反相并联在感性负载两端,当负载回路断开时能够为电感提供续流回路(也因此而称为续流二极管),以防止电感两端产生高压击穿三极管。很明显,ULN2003A也是OC输出结构,所以我们在仿真电路中加入了7个上拉电阻才能使结果正确,这些上拉电阻在实际元器件搭建的电路中也是不需要的。

还有一种“米”字形数码管,其内部结构与“8”字形数码管完全一样,只不过具有更多的发光段而已,在此我们仅给出两种“米”字形数码管的常用段定义,如图4.10所示。

图4.10 “米”字形数码管段定义

对于不愿进行代码的烦琐编写但又想体验数码管显示控制的读者,可以使用更方便的VisualCom软件平台,它所包含的显示仿真器件比Proteus软件平台更丰富。先来看看单步运行状态下的一位共阴数码管显示仿真效果,如图4.11所示。

VisualCom软件平台有一个非常方便的功能就是“数据预置”,可以给从器件库调出的器件预置一个或多个数据或命令,并实时观察相应的显示状态及内部寄存器或内存数据(如果器件有的话,详见后述)。为了得到图4.11所示仿真效果,先从“元器件库”中调入相应的仿真器件,然后用鼠标右键单击该器件,在弹出的快捷菜单中选择“数据预置”项(或单击工具栏上“数据预置”按钮),即可弹出“数据预置”对话框,预置的数据如图4.12所示。

图4.11 一位共阴数码管仿真效果

图4.12 预置的数据

“预置数据”对话框中有一个表格,可以插入想要的数据行。其中,“类型”栏中可以是数据命令,对于数码管这类简单的显示器件而言没有意义。“附加”栏是扩展项,仅对特殊的器件有效。“十进制”与“十六进制”栏表示插入的具体数据或命令,两栏的数据完全一样,当向“十进制”栏输入“63”,“十六进制”栏中就会显示“3F”,反之亦然,这可以方便不同的进制数据输入的场合。“自定义备注”栏可以为插入的行做注释。

为了插入数据或命令行,可以选择左下角的“插入数据”或“插入命令”按钮,这会在表格的结尾插入行,也可以用鼠标右键单击某行后在弹出的快捷菜单中选择相应的选项,这可以在点击的某行上方插入一行。当然,也可以对数据行进行移动、删除等操作,此处不再赘述,详情可参考VisualCom软件平台的帮助文档。

该数码管的段引脚定义与表4.1完全一样,而且还包含了小数点(dp)与冒号(colon),预置数据与段的对应关系如图4.13所示。

图4.13 预置数据与段的对应关系

图4.13中的预置数据为0b0_0110_1111(0x6F),也就是数字“9”的共阴字型码。如果还需要同时点亮小数点与冒号,则相应的预置数据应为0b1_1110_1111(0x1EF)。我们在图4.12中预置了表4.1所示数字0~9的字型码,单击“确定”按钮后返回主窗口,每执行一次“单步运行”就会执行一条预置数据,多次执行“单步仿真”即可观察到数码管依次显示数字0~9,“接口数据”窗口中会显示当前处理的预置数据。另外,VisualCom软件平台也有“米”字形数码管,有兴趣的读者可自行仿真,此处不再赘述。

注1:在后续讨论显示器件的过程中,如果Proteus软件平台并不存在对应的仿真器件,或者驱动源代码大部分是类似的(例如控制时序完全相同,只是发送的数据有些差别),为节省篇幅,我们都会借助VisualCom软件平台进行仿真与分析。

注2:有关开集、热失控、续流二极管等内容的详细讨论,可参考系列图书《三极管应用分析精粹》。