购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第11章
LED数码管动态驱动芯片

为了能够顺利使用单片机控制MAX7219,我们先来看看怎么样与它进行通信,相应的时序如图11.1所示。

图11.1 MAX7219通信时序

MAX7219需要的控制信号分别为串行时钟(Serial Clock Input,CLK)、串行数据(Serial Data Input,DIN)、加载数据(Load-Data Input,LOAD),它们均为输入引脚。当每个CLK的 上升沿 (因为 t DS t DH 分别标注在CLK上升沿左右两侧)到来时,DIN将被移入到MAX7219的内部 16位 移位寄存器,而当LOAD 上升沿 到来时,移位寄存器的数据将会被载入到锁存器。虽然时序告诉我们,在进行数据移位时需要先将LOAD拉低,但对于MAX7219而言并不是必须的,可以在数据移位完成后再产生LOAD上升沿进行数据载入,但为了兼容其他芯片(例如,MAX7221必须在移位时将 拉低,它同时也作为片选的功能而存在),我们还是严格按照时序图进行代码编写。另外,串行数据输出(Serial Data Output,DOUT)引脚输出16位移位寄存器的移出数据,DIN引脚的数据将在16.5(下降沿锁存)个时钟周期后成为DOUT,它与下一片MAX7219的DIN引脚连接可以用于扩展。

有心的读者可能会想:MAX7219的控制时序好像与74HC595非常相似呀!没错!MAX7219与74HC595的控制引脚定义是相同的,只不过引脚名称不同而已。MAX7219通信时序与74HC595主要有两点不同:其一,LOAD信号是 边沿触发 的,而ST_CP是 电平触发 的;其二,MAX7219 需要一次性载入16位数据(而不是8位) ,但我们前面已经写过这种函数了,所以拿过来修改一下就可以使用了。

现在的问题是: 怎么样控制MAX7219驱动数码管显示需要的数据呢? 首先我们得知道,通过串行接口写入到MAX7219的16位数据都代表着什么。这并不难理解,就像在清单10.1所示源代码中往74HC595写入的16位数据一样,我们知道它代表的是合并的字形码与位选通,它与往MAX7219写入的16位数据没有本质的区别,只不过数据的定义可能会有所不同而已。表11.1为数据手册中标注的串行数据格式(Serial Data Format)。

表11.1 串行数据格式

表11.1告诉我们,在写入MAX7219的16位数据中,低8位(D 7 ~D 0 )是数据,高8位中低4位(D 11 ~D 8 )为地址,其他标记为“X”的数据位没有意义。那这里的“地址”又代表着什么对象的地址呢?MAX7129芯片内部定义了一些寄存器,见表11.2所示。

表11.2 寄存器地址映射表

表11.2传达的信息与图2.4是一样的:MAX7219中定义了一些寄存器及其所在的地址,这样就可以凭借地址来访问相应的寄存器。从表中可以看到,MAX7219内部定义了14个寄存器,它们都各自对应一个地址,所以给MAX7219发送的串行数据中的地址部分占4位就足够了。每一个地址都分别对应着一个8位寄存器,向某个地址写入数据,就意味着正在修改相应的寄存器数据。例如,地址0x1~0x8分别保存着DIG 0 ~DIG 7 选通位对应的数码管段驱动数据,向地址0x01写入数据,就意味着正在修改DIG 0 位选通对应的段驱动数据。同样,向地址0x09写数据,就意味着正在修改译码模式。

MAX7219在正式显示数据前通常需要进行初始化,这与我们对74HC595芯片进行初始化的意义是完全一样的。从表11.2可以看到,除DIG 0 ~DIG 7 对应的显示数据寄存器外,还可以控制译码模式(Decode Mode)、亮度(Intensity)、扫描限制(Scan Limit)、关闭模式(Shutdown)、显示测试(Display test)。为方便后续描述,在这里约定地址0x1~0x8对应为 数据寄存器 ,而其他地址对应 控制寄存器

先来看看一下译码模式。前面已经提过,往 数据寄存器 任意写入一个数据,对应位选通的数码管就会有相应的显示,那么 数据寄存器 中的8位数据分别对应数码管的哪些段呢?数据手册中肯定会提供这个信息,见表11.3。

表11.3 译码表

表11.3从硬件实现层面就相当于存储了字型码的只读存储器(ROM),它的输入地址就是 数据寄存器 中的数据。例如,我们往地址0x01的 数据寄存器 写入0x3,当MAX7219扫描DIG 0 位对应的数码管时,就会在段驱动引脚G~A输出对应的共阴字型码0x4F(注意顺序)。也就是说,只要往 数据寄存器 中写入4位BCD码,数码管就可以显示相应的数字,很方便吧!

但是请稍微等一下,通过“往 数据寄存器 中写入4位BCD码”控制显示字符的前提是: 你已经开启了译码模式 。这样MAX7219就会使用表11.3所示的译码规则对 数据寄存器 进行译码,此时 数据寄存器 中的8位数据只有5位是有效的,低4位就是对应的BCD码,而最高位用来单独控制小数点(写1表示亮,写0表示不亮)。

虽然译码模式很方便,但是它只能驱动数码管显示有限的字符,如果需要显示一些自定义的字型码(或下一章将要提到的LED点阵),就不能选择译码模式了,此时 数据寄存器 中的每一位都对应驱动数码管的每一段,见表11.4。

表11.4 寄存器数据与数码管发光单元的对应关系

从表中可以看到, 数据寄存器 与段驱动的对应关系与表4.1恰好是相反的(最高位是段A),这意味着表4.1所示的字型码不能直接使用,这一点在写入数据时特别要注意,而“是否开启对 数据寄存器 的译码模式”取决于译码模式寄存器,其中每一位都对应一个 数据寄存器 的译码开关,换句话说,每一个 数据寄存器 的译码模式可以单独控制,见表11.5。

表11.5 译码模式寄存器(地址=0xX9)

表11.5传达了这样的信息:如果想对某一个 数据寄存器 进行译码,就应把相应的位置1,否则应置0。例如,向译码模式寄存器中写入0x01,就表示打开了第0位(DIG 0 )数据寄存器的译码模式,那么向地址0x01中写入的应该是BCD码,而往其他位 数据寄存器 写入的应该是字型码。

需要注意的是,表11.5只是举了4个应用例子说明怎么设置它,并不是说只有这4种情况。例如,可以向译码模式寄存器中写入0x07,表示打开了DIG 0 ~DIG 2 对应 数据寄存器 的译码模式。 MAX7219上电后均处于非译码模式,我们使用8位数码管只是为了显示一些数字,为方便起见就打开了所有数字寄存器的译码模式,写入译码模式寄存器的数据应为“0xFF”,完整发送的16位串行数据应为“0x09FF” (最高4位无效,所以0x19FF、0x29FF、0x39FF等都可以)。

MAX7219也是以动态扫描的方式驱动数码管,只不过内部已经使用硬件实现扫描时序,我们只需要往 数据寄存器 写入数据即可。虽然MAX7219可以驱动最多8位数码管,但如果在实际应用中并没有连接那么多位,则可以通过 扫描限制寄存器 设置一下扫描位数,具体信息见表11.6。

表11.6 扫描限制寄存器(地址=0xXB)

例如,只连接了4位数码管,那么可以将扫描位数限制为4。当然,在硬件层面必须将这4位数码管的位选通与DIG 0 ~DIG 3 连接,如果连到DIG 4 ~DIG 7 ,那就无法使数码管点亮。 MAX7219上电后仅显示DIG 0 位,我们驱动8位数码管则必须写入“0xX 7” (仅低4位有效,所以0x17、0x27、0x37等都可以)。

有人可能会说:按照动态扫描的驱动原理,我不限制扫描位数(也就是全部显示)也应该可以正常显示4位数码管吧?答案当然是肯定的!但是在相同的硬件电路条件下,限制扫描位数的设置会影响发光单元的亮度,这不得不提及另一个与亮度相关的寄存器。

前面已经提过,在帧率不变的前提下,控制每一位数码管的点亮时长可以调整数码管的显示亮度,它是通过PWM调节驱动信号的占空比。MAX7219中的亮度寄存器允许设置占空比,见表11.7。

表11.7 亮度寄存器(地址为0xXA)

例如,往亮度寄存器写入0x09,表示将占空比设置为19/32。设置占空比越大,相应的数码管就会越亮,当然,消耗的电流也会越大。 MAX7219上电后默认的亮度为最小(占空比最小),所以也必须对其进行初始化。

有人可能会问:为什么占空比的分母是32?它代表什么呢?问得好!在硬件实现层面,如果要产生一个32级可调的PWM时钟信号,这意味着我们需要一个比PWM信号频率至少高32倍的时钟源。例如,现在着手产生一个频率为100Hz且占空比32级可调的PWM信号,那么时钟源频率至少为32×100Hz=3.2kHz。时钟源的频率比我们需要的PWM信号频率越高,那么可以细分的占空比就会越多,如图11.2所示。

PWM信号的生成电路本质上就是计数器与比较器的结合。例如,我们要从时钟源1中获得占空比为8/32的PWM信号,就可以利用一个计数器对时钟源脉冲进行计数,当脉冲数不大于8时输出高电平,当脉冲数大于8且不大于32时就输出低电平,而当脉冲数大于32时就将计数器清零重新计数,这就是PWM信号产生的基本原理。

图11.2 不同占空比的PWM信号

PWM信号频率相同 的条件下,时钟源频率越小则相应可调的占空比就会越少。例如,时钟源2比时钟源1的频率小4倍,那么从时钟源2可以得到最多8级可调的PWM信号。

MAX7219的时钟源频率是多少呢?我们看看表11.8所示的数据手册标注的电气参数。

表11.8 电气参数(部分)

产品数据手册标注的显示扫描速率(Display Scan Rate, f OSC )典型值为800Hz,它是在8位数码管显示条件下的扫描帧率,即1s内扫描了6400位数码管,所以6.4kHz就是PWM信号的频率。从表11.7可知占空比的最大调整级数为32,所以芯片内部振荡电路产生时钟源频率(至少)为6400×32=204.8kHz。每一级占空比调整的时间为1/204.8kHz≈4.9μs,换句话说,当占空比设置为31/32时,每一位数码管的显示时长约为31×4.9μs=151.9μs,扫描一帧(8位)所需要的时间为32×4.9μs×8≈1.25ms。

假设现在连接4位数码管,且限制扫描位数为4,因为PWM信号频率是不变的,所以帧率提升了1倍。也就是说,单位时间内流过数码管发光单元的平均电流就上升了,从而提升了发光亮度。前面我们提过,调整限流电阻可以调整流过数码管的工作电流,也可以达到调节亮度的目的,由于减小扫描位数会使平均亮度提升,如果要保持相同的亮度,得将限流电阻的阻值加大一些。

MAX7129还可以进入低功耗关闭模式,此时内部时钟源处于挂起状态,所有段驱动引脚都下拉到地,所有位选通引脚都上拉到电源,数码管将不会显示,芯片消耗的最大电流约为150μA,并且已经写入的数据不会受到影响。也就是说,如果从关闭模式退出进入到正常工作模式,显示的内容与进入关闭模式前并没有什么不同,见表11.9。

表11.9 关闭模式寄存器(地址为0xXC)

表11.9的意义是:如果对功耗有较高的要求,可以在适当的时候将 关闭模式寄存器 的最低位置0即可,而将最低位置1则可进入正常工作模式。 在显示时应该将其设置在正常工作模式,写入的数据应为“0x1”

需要特别注意的是, MAX7219上电后即处于低功耗模式 ,可以先对其他寄存器进行初始化,然后再进入正常工作模式即可,清单10.2所示源代码就是这么做的。

最后还有一个显示测试模式,它的作用与74LS47的试灯输入相似,相应的寄存器格式见表11.10。

表11.10 显示测试模式(地址为0xXF)

在显示测试模式中,所有数码管的段都会点亮,而且8位数码管都会以最大亮度(最大占空比)显示。如果需要正常显示数据, 应该往显示测试寄存器中写入“0x0”。

MAX7219的内部功能框图有助于我们宏观了解芯片内部硬件结构,如图11.3所示。

图11.3 MAX7219功能框图

从芯片设计层面,可以将数字逻辑分为两大块:其一,通过地址寄存器译码将16串行移位数据中的低8位数据载入不同的寄存器(8×8双端口RAM表示8个8位数据寄存器);其二,对各个寄存器中的数据进行相应的功能设计,包括PWM亮度调节、扫描时序、字型码ROM,使用FPGA(Field Programmable Gate Array,现场可编程逻辑门阵列)或CPLD(Complex Programming Logic Device,复杂可编程逻辑器件)能够很容易实现它们。当然,段驱动模块是一种 恒流源 模拟电路,可以通过比例型镜像电流源来实现,我们将会在第46章详细讨论。

VisualCom软件平台也有基于MAX7219的8位共阴数码管显示模组,数码管的连接线路与图10.2完全一样,相应的仿真效果如图11.4所示。

图11.4 仿真效果

对于预置数据格式稍微复杂一些(例如需要对寄存器地址进行访问、包含指令与数据等)的仿真器件,“输出”窗口的信息栏会实时显示每一条预置数据的处理结果,如果预置的数据与分析出来的结果不一致,说明对如何正确控制该器件的理解并不到位。

预置的数据如图11.5所示。

图11.5 预置数据

该仿真器件的预置数据位序定义与表11.1完全一致,12位有效数据中的高4位为寄存器地址,低8位为具体的数据。我们的预置数据与清单10.2源代码中给MAX7219写入的数据是完全一样的。值得一提的是,当每次执行“单步运行”后,“内存窗口”中会实时显示MAX7219中所有寄存器的状态。 h2NvMqJHzJNR3XvDaNAQtFiExedg3h/G/ej1VEMJSEZPbAcsnIFluuwROd1/Tsyn

点击中间区域
呼出菜单
上一章
目录
下一章
×