全国统一学习专线

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

logo
来源:七品教育

2024-04-04|已帮助:82

进入 >

大家好,今天,我们来说一下比较老但是应用广泛的MAX7219(我们已经发誓不讨论了,哈哈,不要打我),这是一款可以驱动多个led的芯片。

出版的书《显示器件应用分析精粹:从芯片架构到驱动程序设计》(以下简称“显示器件”)也有详细介绍。本文主要是结合仿真工具以另一种图形方式展示其工作效果,让你即使不买《显示器件》这本书,也有机会窥探其工作原理。

当然,书籍的组织更注重体系的完整性,涉及的知识面相对较广较深,而文章则注重图像可读性,所以图片会更多。另外,本文不涉及具体的控制时序和代码相关话题,我想很少有人会在手机上看这么大一段代码。

有兴趣的话可以参考《显示器件》。

MAX7219的硬件连接比较简单。除了用于驱动LED的16个引脚,ISET引脚还可以设置LED的驱动电流值(因为MAX7219是恒流驱动的形式)。也就是说,

你只需要额外增加一个外围电阻就可以让MAX7219正常工作。《显示器件》给出的电路类似于下图所示。需要注意的是,MAX7219只能驱动共阴极型数码管。

那怎么才能让MAX7219驱动数码管显示想要的数据呢?几乎所有的LED驱动芯片都是相似的,所以我们肯定需要将一些数据写入芯片的某个存储区域。首先我们来明确一下单片机是如何控制MAX7219的。

通过时钟(CLK)、数据(DIN)、负载(LOAD)的串行通信实现,一次传输16位数据(高位优先)。对应的格式如下图所示。

可以看出,发送到MAX7219的16位数据中,低8位是具体数据,高8位是对应地址(只有低4位有效),所以最多只有16个有效寄存器(8位寄存器)。

所以我们需要知道这16个寄存器的功能是什么。

MAX7219共有14个寄存器(2个地址无效),一般可以分为数据寄存器和控制寄存器。前者决定了LED数码管能显示什么(简而言之就是你在里面写字LED数码管会显示什么)。

后者决定了LED如何显示内容,如下图所示。

Digit0~~Digit7(地址0x1~0x8,写0xX1~0xX8因为只有低四位有效)这八个寄存器分别对应多位数码管的每一位。在上面的仿真电路图中,Digit0对应最左边的位。

Digit1对应左边第二位,以此类推。以下是显示数字0~7的模拟效果。

现在的问题是:怎样才能表现出这样的效果?将BCD码或字体码(代表各段的开、关数据)写入数据寄存器?取决于解码模式寄存器,

每个位(共8位)可以控制相应数据寄存器的解码模式,如下表所示。

比如当解码模式寄存器的D0位设置为1时,意味着Digit0数据寄存器中的数据解码后会驱动LED数码管(而不是直接输出),所以如果你需要在最左边显示“0”,

然后只需要将BCD码0写入Digit0数据寄存器(即0)。具体解码表如下所示。

如果选择不解码,数据寄存器中的数据会直接输出驱动LED数码管的每一段,那么数字“0”也会显示出来,所以你要将0b1111110(0x7E)写入对应的数据寄存器。换句话说,解码方式对于LED数码管来说非常方便。

但只能显示一些约定好的特定字符,在需要驱动LED点阵模块时通常选择不解码。

当然,以上解码表的前提是你必须按照预定义的连接方式将MAX7219与LED数码管连接。MAX7219约定的段与数据位的对应关系如下图所示,之前的仿真电路图也遵循这个约定。

这样可以避免简单问题复杂化。

需要注意的是,使用解码模式时,数据寄存器中只使用低4位,最高位对应小数点控制位(1为开,0为关)。下图显示了将1写入Digit3和Digit4数据寄存器的最高位后的显示效果。

MAX7219还可以控制扫描数码管的位数,这由扫描限制寄存器完成。不同于有限解码模式控制寄存器,

你需要在里面输入有限位数的BCD码(并不是数据寄存器的每一位都控制扫描与否,也就是说扫描位数只能是连续的,不能异想天开地试图只扫描第一位、第三位和第五位)。例如,当你写0进去的时候,

意味着只会扫描0位对应的数码管(其他数码管不会亮,即使你已经往里面写了数据)。当你把4写入其中时,意味着0、1、2、3、4位会被扫描,而5、6、7位不会被扫描(不会亮起)。对应的表格如下所示:

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

当然,为了让MAX7219正常显示,显示测试和关机寄存器也必须合理设置。显示测试寄存器主要用于测试。当其最低位为1时,表示进入测试模式。

这时所有数码管都会亮(也就是8.8.8.8.8.8。),以便你判断芯片驱动是否正常,数码管是否有不亮段等。在正常操作期间,

其最低位置应为0,如下表所示:

关闭寄存器可以控制是否输出。在关闭模式下,MAX7219的内部时钟源暂停,所有段驱动引脚(SEG A、B、C、)被拉低到地,并且所有位选通引脚(DIG0~7)被拉高到电源。

此时,不会显示所有数码管,如下表所示。

下图显示了低位4位扫描受限时依次发送的数据。先发送“F00”意味着将0写入显示测试寄存器(地址0xF),清零最低位,进入正常工作模式。然后将“9FF”写入解码模式寄存器(地址0x9),

意思是全8位解码,因为我们驱动的是LED数码管。下一个“B03”表示扫描位数限于0、1、2、3,所以最右边的四位数字不会显示。

“A0F”通过向强度寄存器写入数据来达到控制LED显示亮度的目的,本质上是通过控制PWM来实现的。由于篇幅所限,不再讨论,因为即使不往里面写数据,

MAX7219也有默认亮度。有兴趣的读者可以参考《显示器件》这本书。

然后向close寄存器(地址0xC)发送“C01”,将最低位设为1,进入正常工作模式。之后,将显示数据寄存器中的数据。当然,到目前为止,我们还没有向数据寄存器中写入任何内容。

在本例中,将0~7的BDC代码依次写入地址0x1~0x8即可。值得一提的是,Digit3和Digit4数据寄存器的最高位设置为1,表示显示小数点,但由于扫描位数受到限制,您只能看到一个小数点。

以上是七品教育整理的一文教你全面透彻使用MAX7219驱动8位LED数码管全部内容。