一文教你全面透彻使用MAX7219驱动8位LED数码管

  Hello,大家好,今天我们来讨论一下老掉牙但应用广泛的MAX7219(咱已然立誓,不是老掉牙的芯片坚决不讨论,哈哈,不要打我),它是一款可以驱动多位LED的芯片,已出版图书《显示器件应用分析精粹:从芯片架构到驱动程序设计》(以下简称“显示器件”)中也有详细介绍,本文主要结合仿真工具以另一种图文方式展现其工作效果,这样即便你并没有购买《显示器件》一书,也有机会窥探其工作原理。当然,图书的组织更讲究体系的完整,涉及的知识面相对较广而深,文章则以形象易读为要,所以图片相对会更多。另外,本文不涉及具体控制时序及代码相关的话题,我想也很少有人会在手机上看那么大段的代码,有兴趣可参考《显示器件》一书。
    MAX7219的硬件连接比较简单,除用于驱动LED的16个引脚外,ISET引脚可以设置LED的驱动电流值(因为MAX7219是恒流驱动形式)。也就是说,你只需要额外添加一个外围电阻即可使MAX7219正常工作,《显示器件》给出的电路类似如下图所示。需要特别注意的是,MAX7219只能驱动共阴(common-cathode)类型的数码管。

 


那怎么样才能让MAX7219驱动数码管显示想要的数据呢?几乎所有LED驱动芯片是相似的,我们肯定需要往芯片的某个存储区域写入一些数据。首先我们来明确单片机是如何控制MAX7219的,它是由时钟(CLK)、数据(DIN)、载入(LOAD)这3个引脚完成的串行通信来实现,每次传输16位数据(高位先行),相应的格式如下图所示。

 


可以看到,给MAX7219发送的16位数据中,低8位是具体的数据(DATA),而高8位为相应的地址(ADDRESS,仅低4位有效),所以其有效的寄存器最多只有16个(8位寄存器),所以我们接下来需要明确这16个寄存器各自的功能是什么。MAX7219内部存在14个寄存器(2个地址无效),总体来说可以分为数据寄存器控制寄存器,前者决定LED数码管可以显示的内容(简单地说,你往里面写什么,LED数码管就会显示什么),后者则决定LED如何显示内容,具体如下图所示。

 


Digit0~~Digit7(地址为0x1~0x8,写成0xX1~0xX8是因为仅低4位有效)这8个寄存器分别对应多位数码管的每一位数字,在上面的仿真电路图中,Digit0对应最左侧位,Digit1对应左侧第二位,其它依此类推,下面为显示数字0~7的仿真效果。

 


现在的问题是:怎么样才能显示出这样的效果呢?往数据寄存器中写入BCD码还是字型码(代表每个段亮灭的数据)呢?这取决于译码模式Decode Mode)寄存器,它的每一位(共8位)可以控制相应数据寄存器的译码模式,具体如下表所示。

 


例如,当设置译码模式寄存器的D0位为1时,表示Digit0数据寄存器中的数据会经过译码后驱动LED数码管(而不是直接输出),这样如果你需要最左侧显示“0”,则只需要往Digit0数据寄存器中写入0的BCD码即可(也就是0),具体的译码表如下所示。

 


如果你选择不译码,数据寄存器中的数据会直接输出以驱动LED数码管的每个段,那么同样显示数字“0”就得往相应的数据寄存器中写入0b1111110(0x7E)。也就是说,译码模式对于LED数码管非常方便,但是只能显示约定好的某些特定字符,对于需要驱动LED点阵模块的场合,通常还是会选择不译码
当然,上面这个译码表成立的前提条件是,你必须按照预定义的连接方式将MAX7219与LED数码管连接,MAX7219约定的段与数据位的对应关系如下图所示,前面的仿真电路图也遵从此约定,这样可以避免将简单的问题复杂化。

 


需要注意的是,当你使用译码模式时,数据寄存器仅使用到了低4位,而最高位对应小数点控制位(1为亮,0为灭),下图是已经往Digit3与Digit4数据寄存器的最高位写入的1后的显示效果。

 


MAX7219还可以控制扫描的数码管位数,这是由扫描限制(Scan-Limit)寄存器完成的。与译码模式控制寄存器有所不同的是,你需要往其中输入限制位数的BCD码(而并非每一位数据寄存器对应控制扫描与否,这也就意味着,扫描位数只能是连续的,你不能异想天开地只企图扫描第1、3、5位)。例如,当你往其中写入0时,表示仅扫描第0位对应的数码管(其它数码管不会亮,即便你已经往其中写入了数据),当你往其中写入4时,则表示第0、1、2、3、4位都会扫描,而5、6、7位不扫描(不会亮),相应的表格如图所示:

 


下图是限制扫描位数为
4的显示效果。

 


当然,想要让MAX7219正常显示,显示测试(Display Test)关闭(Shutdown)寄存器也必须得进行合理设置。显示测试寄存器主要用于测试,当其最低位为1时,表示进入测试模式,此时所有数码管都会亮起来(即显示8.8.8.8.8.8.8.8.),这样你就可以判断芯片驱动是否正常,数码管是否存在无法点亮的段等情况。在正常工作(Normal Operation)时,应该将其最低位置0,如下表所示:

 


关闭寄存器可以控制是否输出。在关闭模式下,MAX7219内部时钟源处于挂起状态,所有段驱动引脚(Seg A,B,C,…)都下拉到地,所有位选通引脚(DIG0~7)都上拉到电源,此时所有数码管都不会显示,具体如下表所示。

 

 

下图为限制低4位扫描时依次发送的数据。首先发送“F00”表示往显示测试寄存器(地址为0xF)中写入0,将最低位清零也就进入了正常工作模式。然后往译码模式寄存器(地址为0x9)中写入“9FF”,表示进行全8位译码,因为我们驱动的是LED数码管。接下来的“B03”表示限制扫描位数为0、1、2、3,所以最右侧4位是不会显示的。

 


A0F”通过往亮度(Intensity)寄存器中写入数据以达到控制LED显示亮度的目的,本质上是通过控制PWM来实现的,受限于篇幅不再讨论,因为即便你不往其中写入数据,MAX7219也存在一个默认的亮度,有兴趣的读者可参考《显示器件》一书。
紧接着往关闭寄存器(地址为0xC)中发送“C01”,将最低位置1即可进入正常工作模式,此后,数据寄存器中的数据将会被显示出来。当然,到目前为止,我们还没有往数据寄存器中写入任何内容,本例中依次往地址0x1~0x8中写入0~7的BDC码即可,值得一提的是,Digit3与Digit4数据寄存器的最高位被置1,表示显示小数点,但由于前面已经限制了扫描位数,所以你只看得到一个小数点。
posted @ 2022-09-01 10:04  阳光&技术  阅读(2430)  评论(1编辑  收藏  举报