用 MAX7219 点亮 8*8点阵显示屏(倒不如说是 8*8 LED模块)

本篇文章并不完善,目前可能会有错误。

仅供个人参考。

暂时无代码,后续更新代码!


 首先用的是单色LED点阵屏模块

8*8点阵屏就如图所示,共阴极和共阳极两种。但也都差不多。

点亮 点阵屏 的方法有很多

①可以直接接到单片机的IO口,就是占用的IO口多了些,需要16个,好处就是比较简单。

②可以用八位锁存器进行控制,列如74HC573。此时只需要9个IO口就能实现点亮LED。好处就是比第一种方式简单,而且占用IO口较少。

③可以用38译码器,但是一次刷新只能显示个别点,不能全显示。不推荐,但可以用。只需要6个IO端口。

④使用位移缓存器74HC595,可将串行输入转化为并行输出,并且可以级联,只需占用3个IO端口。

⑤使用MAX7219多位LED显示驱动器。可级联,只需3个IO端口。除了贵点别的还行。

(假如要使用MAX7219显示的话,可使用Max72xxPanel库,这样一来就比较简单了)

GitHub - markruys/arduino-Max72xxPanel: Arduino interface for Adafruit-GFX to control a set of 8x8 LEDs with a MAX7219 or MAX7221https://github.com/markruys/arduino-Max72xxPanel

https://github.com/markruys/arduino-Max72xxPanel

先看看74HC595吧,觉得这个芯片还可以。

74HC595输出引脚为三态输出引脚(高电平、低电平、高阻态)。

查看的是 深圳市富满电子 提供的关于 74HC595D 的数据手册

 哎嘿??10、13引脚啥都没做?这就是把 RST 和 ENABLE 直接砍掉了吧。

相比东芝提供的数据手册:

 可以看出10脚SCLR#的逻辑功能是R,13脚G#的逻辑功能是EN3。推测是RST和ENABLE功能,并且都是低电平有效。

经查,10脚SCLR#是移位寄存器清零端。13脚G#是输出使能端。

使用时只需将SCLR#接入高电平,即不使用清零功能,清零可由程序清零。G#直接接地,永远使用输出使能端。

这俩引脚无关紧要。还是按照富满的手册看即可。

主要就仨脚和单片机相连

(不用管每个公司标注的一不一样!只要芯片型号一样,引脚就一样的功能。)

引脚 符号 功能
11 SCK 移位寄存器时钟,上升沿移位(数据输入时钟线)
12 RCK 锁存寄存器时钟,高电平存储(锁存器存储时钟线)
14 SER 串行数据输入端
9 Q7' 串行数据输出端

真值表

SCK RCK 功能
X 移位寄存器存储。Qn=Qn-1
X H 存储移位寄存器的值

逻辑:

工作时序图:

一定要记住:移位寄存器哈 ~  后来的数据就把以前的数据拱掉了。

 第一个移位寄存器的数据被挤出来后,会从输出口输出,给第二个寄存器。

这就表示,如果4个74HC595串联,尾部的595的数据是最先传入595的连接链的。经过位移4*8=32次后,方可设置RTC使其共同输出数据。

示例:

MAX7219

这个芯片查了一下,有点小贵。可能因为最近什么芯片都涨钱的问题。

MAX7219/MAX7221是一种集成化的串行输入/输出共阴极显示驱动器,它连接微处理器 与8位数字的7段数字LED显示,也可以连接条线图显示器或者64个独立的LED

8×8点阵就是64个独立的LED。

典型应用电路

时序图

数据结构

串行数据在 DIN 输入 16 位数据包,无论 LOAD 端处于何种状态,在时钟的上升沿数据均移入到内部 16 位移位寄存器。

对 MAX7221 来说,无论数据输入或输出LOAD必须为低电平。然后数据在LOAD的上升沿被载入数据寄存器或控制寄存器。LOAD端在第 16 个时钟的上升沿同时或之后,下个时钟上升沿之前变为高电平,否则数据将会丢失。

在 DIN 端的数据传输到移位寄存器在 16.5 个时钟 周期之后出现在 DOUT 端。在时钟的下降沿数据将被输出。

数据位标记为 D0-D15。D8-D11 为寄存器地址位。D0-D7 为数据位。D12-D15 为无效位。在传输 过程中,首先接收到的是 D15 位,是非常重要的一位(MSB)。

数据寄存器和移位寄存器

下面是 14 个可寻址的数据寄存器和控制寄存器。

数据寄存器由一个在片上的 8×8 的双向SRAM来实现。它们可以直接寻址所以只要在 V+大于 2V 的情况下每个数 据都可以独立的修改或保存。

控制寄存器包括编码模式显示亮度扫描限制关闭模式以及显示检测五个寄存器。

掉电模式就不考虑了,用不到

MAX7219 掉电后,扫描震荡器关闭,所有段电流源和地连接,所有数字驱动与 V+相 连,所以显示熄灭。

MAX 7221 除了数字驱动呈现高阻抗以外其他都与 MAX7219 一样。 在数据和控制寄存器里的数据是不变的。

停机模式可以节省电源,当有一个连续的警报使显示器发光时,便能离开掉电模式。

为了满足掉电模式最低的工作电流,逻 辑输入应该在 GND 或 V+(CMOS 的逻辑电位)。

MAX7219 和 MAX7221 可以在小于 250μs 的时间内离开掉电模式。

在掉电模式下,显示驱动是可以编程的,而且在显示检测的时候不用考虑他是否在掉电模式工作。

Shutdown Register Format (Address (Hex) = 0xXC)

初始状态

在初始状态下,所有的控制寄存器将被重置,显示器熄灭,MAX7219/MAX7221 进入掉电模式。对显示驱动预先编程为以后显示而用。否则它将以最初的设置来扫描每一 位数据,不对数据寄存器里的数据进行扫描,显示亮度寄存器设置为最小值。

译码模式寄存器

用来设置对每个数据进行 B 型 BCD 译码或者不译码。寄存器中的每一位对应一个数据。逻辑高电平用来选择译码低电平取消译码。下表举例说明了译码控制寄存器的 格式。

Decode-Mode Register Examples (Address (Hex) = 0xX9)

当选择译码模式时,译码器只对数据的低四位进行译码(D3-D0),D4-D6 为无效位。 D7 位用来设置小数点,不受译码器的控制且为高电平。下表为 B 型译码的格式。

Code B Font

 当选择不译码时,数据的八位与 MAX7219/MAX7221的各段线上的信号 一致。下表列出了每个数字对应的段位码。

No-Decode Mode Data Bits and Corresponding Segment Lines

亮度控制

MAX7219/MAX7221通过加在V+和ISET之间的一个外部电阻来控制显示亮度。段驱动电流一般是流入ISET端电流的100倍。这个电阻可以是固定的,也可以是可变电阻,通过前面板来控制以选择合适的亮度。其最小值为9.53KΩ ,它设定段电流为40mA。

显示亮度也可以通过亮度寄存器来控制。 数字控制显示亮度是通过亮度寄存器的低四位来控制的脉宽调制器来控制。调制器将段电流平均分为16个阶次,最大值为由RSET设置的最大电流的31/32,最小值为电流峰值的1/32 (MAX7221为15/16到1/16)。下表列出了亮度寄存器的格式。最小数据熄灭时间设置为时钟周 期的1/32。

扫描控制寄存器

扫描控制寄存器用来设定扫描显示器的个数,从 1 个到 8 个.它们将以 800Hz 的扫描 速率进行多路扫描显示。如果数据少的话,扫描速率为 8*fosc/N,N 是指需要扫描数字的个 数。扫描数据的个数影响显示亮度,所以不能将扫描寄存器设置为空扫描。表 8 列出了扫描 寄存器的格式。

Intensity Register Format (Address (Hex) = 0xXA)

 Scan-Limit Register Format (Address (Hex) = 0xXB)

如果扫描寄存器被设置扫描 3 个数据或者更少,个别的数据驱动将损耗过多的能量。所以,RSET 的值必须根据显示数据的个数来确 定,从而限制个别数据驱动对能里的浪费。 下列出了不同个数字被扫描时所对应的最大需求段电流。

Maximum Segment Current for 1-, 2-, or 3-Digit Displays

显示检测寄存器

显示检测寄存器有正常和显示检测两种工作状态。显示检测状态在不改变所有其他控 制和数据寄存器(包括关闭寄存器)的情况下将所有 LED 都点亮。在此状态下,8 个数据都会被扫描,工作周期为 31/32。下表列出了显示检测寄存器的格式。

Display-Test Register Format (Address (Hex) = 0xXF)

注意:MAX7219/MAX7221仍处于显示测试模式(所有LED亮起),直到重新配置显示测试寄存器用于正常操作。

不工作寄存器

当有多个MAX7219或MAX7221被串接使用时要用到不工作寄存器。把所有的芯片的LOAD/CS 端联接在一起,把相邻的芯片的DOUT和DIN连接在一起。DOUT是一个CMOS逻辑电平的输出口,他 可以很容易的驱动下一级的DIN口。例如,如果四个MAX7219被连接起来使用,然后向第四个芯片 发送必要的16位数据,后面跟三组NO-OP代码(如表2所示,十六进制的0xXX0X)。然后使LOAD/CS 端变为高电平,数据则被载入所有芯片。前三个芯片接收到 NO-OP 代码,第四个接收到有效数据。

假设:8×8点阵显示如图所示

第一行写显示的数据

往MAX7219写的数据

一位一位的写。

示意:

//伪代码
write(0x01);    //0000 0001
write(0x3c);    //0011 1100

假如串行写数据,和74HC595类似的。

假设点两个8×8点阵

数据写入

最后一行:右侧为先输入的数据

//伪代码
write(0x01);    //0000 0001
write(0x70);    //0111 0000

write(0x01);    //0000 0001
write(0x3c);    //0011 1100

就也是一位一位的挤压过去的,移位寄存器嘛

//写数据

//假如要写  0x3f    0011 1100

CS = 0;

//=======写0
CLK = 0;
DIN = 0;
CLK = 1;
//=======写0
CLK = 0;
DIN = 0;
CLK = 1;
//=======写1
CLK = 0;
DIN = 1;
CLK = 1;
//=======写1
CLK = 0;
DIN = 1;
CLK = 1;

//=======写1
CLK = 0;
DIN = 1;
CLK = 1;
//=======写1
CLK = 0;
DIN = 1;
CLK = 1;
//=======写0
CLK = 0;
DIN = 0;
CLK = 1;
//=======写0
CLK = 0;
DIN = 0;
CLK = 1;

CS = 1;

OK了,就这样吧 ~

我搞清楚原理啦 ~ 这就可以啦 ~ !

等我验证完程序在再这里附上程序!

猜你喜欢

转载自blog.csdn.net/qq_41650023/article/details/124705397
88