Allegria ! 疯狂的钟表匠又回来了 !!
标题是无理取闹,因为它会一直:
我显示矩阵的计算方法: HW SW技术和使用
这是因为什么,我要描述的点阵显示8×8 (7×5 8×5) 试图了解这些方法包括硬件和软件及其使用. 为此,我产生了一些原型 (是本领域的这些状态) 使用不仅仅是这些矩阵数字时钟. 它指出HW特性几乎是相同的 (它只是改变了针) 双方共阳极是共阴极. 因此,在具体进入前’ 使其基于一些视频展示一些原型.
NB: 显示视频: 命运点击链接SUL: 将打开一个对话框,询问你是否要打开或保存文件. 该视频可以使用Windows Media Player可以看到或WMV文件类似.

此视频演示了如何简单的矩阵8×8 您可以显示时钟 “RAIL”. 如果考虑到时间前,而不是一个曾想过在我的另一篇文章中已经出现 !

在这段视频中,个别时钟值显示逐点: 该序列示出了从左侧与数十小时,然后初始值的形成遵循最新的. 第二扫描由LED /像素左三显示在显示器上.

大字符组成小时, 分钟和秒,由右至左滚动下去. 由于采取性格的形成时间, 你失去约 2/3 充分和随后的显示之间秒.

在这个最新的视频手表 “在口头上”. 在这种情况下不使用点阵显示,但一个特定的设备: 该 DL2416T. 这是一个显示 “聪明” 由 4 具有多个区段,可以显示数字的数字, 字母和一些特殊字符. 该装置, 现在已经过时了, 它现在是在更新的版本,但遗憾的是提供相当 “亲爱”. 那些我所掌握的一些点阵的抵消作用得到打印机年 80/90. 正如你从视频中可以看到, 这是唯一的原型完成 (PCB与所述显示器和所述两个部分 “主要” 具有微Arduino_Nano和控制电子器件).
矩阵显示器的特性
在互联网上有很多图片和实例上使用这些矩阵: 他们可能是一个帮助appronfondire其特定的用途. 然而,许多例子是肤浅的,, 在我看来,, 不全面. 因此,我将描述仅是研究和个人经验的结果. 任何参考纯属巧合.
在下图中可以看出: 显示器8×8, 容纳两个显示它的控制器模块 (MAX7219), 的逻辑布局分配和管理的草图, 矩阵的模块上,最后的引脚分配. 大号’ 容纳在所述显示模块的所述取向具有单一位置 (8 右销 8 向左) 因此,如果它被放置颠倒显然将无法正常打开. 从第四幅图可以验证与控制器的显示引脚分配 (MAX7219), 因此,人们可以推断出其是阴极 (我会打电话 “数字“) 什么是阳极 (我会打电话 “SEGMENTS“). 所讨论的显示是共阴极.
为什么要叫阴极的原因 “数字” 和阳极 “SEGMENTS” 它来自于它是如何从硬件或软件,显示器和相关的控制器管理. 这些显示元件可以相对于所述显示 7 段 + 1 定义为 “一个”, “乙”, “C”, “d”, “Ë”, “F”, “G”, “DP” (小数点或第八区段). 每列 8 所述矩阵的LED /像素 (看到第三个图) 它可以是一个显示 7+1 段,然后阵列可以被比作的链 8 分段显示. 要打开一个单一的LED /像素足以适用销 “阴极” 接地柱和销的 “anodo” 单段为逻辑值 “1” (+5V下降至R). Ë’ 清楚的是,为了形成字符或数字是必要的,同时根据预定的格式以接通LED /像素 (持久性del'immagine的眼睛): 或使用复用. 这是没有意义的数字连接和段 (8+8 销) 到微控制器的输出端 (与电阻明显下降) 和不必要的程序复杂.
在我的项目,我总是习惯认为, “圣多美和普林西比” 从 “移位寄存器” 因为只有 3 针能够驱动的链 8 级联连接的矩阵以彼此或 8 显示器 7 段. 随着限制 (然后,我们将看到它是不是) : 只有模块 “共阴极”. 该芯片 (成本低,如果有这么多的显示器的模块是值得 1,5 一个 5 欧元) 是 MAX7219. 主要特点:
- 3 PIN的驾驶 (LOAD /时钟/ DATA_IN).
- 综合复用.
- 定调光.
- 销DATA_OUT用于连接另一显示.
- 无差别地既设法段显示的是,矩阵.
- 7 用于操作控制寄存器和 8 每个I位.
- 即使从微调外界亮度的限制.
如何使用和芯片编程MAX7219
现在使用这种芯片涉及显示器的管理所有的项目是一个矩阵或分段LED阵列也适用于RGB. 关于RGB LED不久我将发表 “圣诞之星” 尽管它不是本赛季 !. 我们与芯片再深化和脚的各种登记:

DG0 / DG7 驱动显示器的阴极, SEG_A / SEG_DP 飞行显示器的阳极. 每个I显示矩阵的计算 DG0 / DG7 他们提到,而列 SEG_A / DP 他们指的是单独的LED / pixex列. 大号’ 段分配/ LED及其二进制值必须在注册表被配置 “数据” 铭记位 “DP” 谷 128 (0X80). 销 FROM 这是相对于输入数据 , 销 负载/ CS 选择芯片, 销 CLK 提供时钟和最后销 DOUT 这是什么让另一个芯片的最多的级联 8. 最后销 “我设置 “通过连接A R 10K调整亮度值 (一个一个剪) 正极.
让我们来看看这些记录:

使用和各个寄存器的意义:
- 注册 0: 治 “0X00” 它只会在链显示. (0VVER不进行任何操作的特定显示).
- 日志 1/8: 这些是针对各个区段对各个段的点火寄存器 (见格式数据寄存器).
- 注册 9: Decode_Mode: 它需要芯片,查看是否使用它的BCD码或无.
- 注册 10: 亮度变化. 值 0 一个 15. 随着零值将不下车的显示,但其最低亮度. 您可以发光的效果,从引进该寄存器 0 一个 15 在一个渐进的和有节奏的方式.
- 注册 11: 扫描限制: 事实上,它必须说明有多少位扫描: 在数据表中显示一个表,将被分配的值.
- 注册 12: 操作模式 (关掉). 这个交替寄存器的值 (该 0X00一0×01) 你被打开或关闭的显示切换而获得 (不会丢失任何现值). 它可以帮助创建效果交替闪烁的两个值测量方法.
- 注册 13/14: 没有.
- 注册 15: 设备测试: 你得到所有连接的LED照明.
基本上执行特定的命令,请发送到芯片 2 字节: 寄存器地址和其值必须假设为相同的命令的功能: 例如正常启动必须发送序列: “0C00“.
管理软件
这里是最有趣的部分: 如何管理这些显示器. 上了网, 明显, 你可以找到许多例子和图书馆,并在一开始我已经下载了一些这些库: LEDCONTROL Ë LEDCONTROLMS 和用于第一测试 . 我不满意是有效的,但pesonalmente为什么我开发我的一个好处 “图书馆自成一格” 能够同时管理阴极显示ANODO domune. 我定义 “自成一格” 因为它不是写在行,但实际上是一个文件 (.伊诺) 它包含所有必要的功能和用于两个矩阵来实现,对于 7 段. Ë’ 只是包括草图这个文件,然后打的电话. (我保留这个文件转换成一个真正的图书馆的权利). 正如本文开头语关于矩阵我们看看他们是如何进行管理.
首先,你必须确定有多少矩阵必须进行处理: 一个或多个. 如果对于单个阵列,没有特别的问题, 当谈到connetterne一个以上应采取或PCB或使飞行连接. 我们看到这个图:

所述第一矩阵被连接到微与经典的销 LOAD / DIN / CLOCK: 因此,如果它是只需要什么. 从第二次起连接 LOAD / CLK 被连接在一起,但在第二阵列 (或第三等) 他的 FROM 它连接到 DOUT 以前的矩阵. Ë’ 该软件的任务目标正确矩阵. (记住寄存器 “零” ?) . 使用这种微型模块便于连接:

的输入是那些以前见过和输出引脚是 VCC, GND, 加载, CLK, DOUT. 对于滑动时钟原型或级联, 我用 4 显示容纳在该PCB:

正门销的左, 在输出销的右下连接任何其它基质. 每个模块的空间由在红色矩形界定. 千万不要错过VCC和GND.
我们已经说过,我们做管理的第一步. 在要进行的第一个操作 “建立” 任何草图是: (今时 “设备” 识别芯片 “显示” 个位数或列矩阵的). 所有这些操作必须对每个执行 “设备” 现在. 应当注意的是,当系统, 在大多数情况下,, 您将有将亮起,它可以是在任何其他一个好主意,进行这些操作的所有LED芯片的自检,否则,你将有LED的点亮持续.
- 微芯片作为输出的引脚分配.
- 请关机初始化芯片.
- 设置亮度.
- 设置为编码.
- 设置测试模式.
- 设置 “扫描限位”.
所有这些操作都通过定义为我的库中的函数管理 “Led_MX_Init” 即设置引脚, 执行初始化和分配方法 “阴极” 该 “ANODO” 常见. 为方便起见,该库的调试我还添加了 (通过在init标志) 的能力,以查看串行输出的值被发送到记录. 对于图书馆的发展我实现了一个草图, 串行, 设置通过菜单对话,允许的库的所有功能都矩阵用于显示的执行 7 段.
我指定的芯片只能管理显示器共阴极: 真正在一定程度上是因为你也可以使用这些共阳极但以下措施:
- A级HW: 反转信号DG0 / DG7插入一HEX INVERTER (74LS04). 这样涂层阳极到达正确的逻辑值.
- 一个livello SW: 激活标志 “ACMODE” 在图书馆INIT功能. 在用来管理所述LED该活化功能的存在/象素反转通过传递值’ 特殊功能 (Led_Value =〜Led_Value;).
- 在状态’ 技术库使用该函数仅用于显示 7 段.
现在让我们专门为每个时钟的早期原型描述的相同的开发中使用的方法和技巧. 至于说到手表很显然,我们需要一个 RTC 从中读取时间和日期. 有没有具体的规范: 你可以使用 DS1307 该 DS3231 或 PCF8583 (模型vetusto). 唯一的区别是寄存器和解码方法的读取. 顺便说一句我没有使用任何库管理这些RTC: 我访问直接用库函数来注册 “线“.
二进制时钟: 这是最简单其他所有的. 草图管理一个设备 (矩阵8×8) 和初始化设备后,并检查RTC的正确操作, 在函数执行一个循环 “环” 从寄存器读取RTC时间值, 分钟,秒,天, 月. 作为形成这些值 “BCD” (小时 12 他们在二进制 0001 0010) 没有解码不需要它们的可视化. 让我们退后一步: 我说,矩阵可以看作是一组 8 显示,其中每一列代表 8 段 (7+1) 其编码在寄存器分配 1 该列 1, 2 该列 2 (等为其它列) 尊重由芯片所规定的编码 (见图 “注册数据“). 因此,关键是: 对于每个选择的列,然后将值被上传 “著名12小时” 他们被分配如下:

等了所有其他列. 和面罩覆盖其显示是没有必要的位. 它是然后控制通过柱芯片柱 (从 1 一 8 但如果只有特定的 1, 2, 4, 5, Ë 7) 这提供的库函数 “LEDMTX_Setcolumn” 这提供设备号, 列和它的值的数量.
滑动时钟: 这比以前的,但并不复杂更复杂,它是唯一的理由’ 算法来决定的值的滑动. 它适合这方面的另一个文件 (Led_Tabel.ino) 这是在阵列的形式, 什么是必须承担个别列数字字符的表示二进制配置 (九到零) 为两个矩阵用于显示 7 段. 现在,如果这些显示器的结构被确定,并且毫不含糊, 对于具有8个可用的网格矩阵×8 LED /像素成为开发商的自由选择各种数字配置为最恣.
下面是一个例子: 用于分段显示器的数量为零具有以下配置: 0111 1110. 小数点 (段 “DP“) 它可以插入导致 “1” 他咬 8 或通过使标志在适当的功能. 因此,对于每一个执行显示指向的数组作为数的函数数目和功能的一个字节. (零尖端阵列的第一个字节的, 第二个,等等).
不同是用于阵列系统: 事实上,对于相同数量的需要以及 8 配置中,为每列即一个字节. 相同的编号为0的定义如下: “0,60,98,82,74,70,60,0“. 数值以十进制数表示和配置是个人的选择. 由此得出结论,显示号码的功能必须指向每个系列的第一个字节 * 8 (“0” * “8” = “0” 并且指向第一个字节; “1” * “8” = 8 而指向配置一把手的第一个字节). 然后柱/列使得观看. 下图是如何它们可以在电网8组成的字符的一个例子×8.

话虽如此,我们看到的是由我设计的算法, 通过通过柱从右滑动到左边列中显示的时钟的值. 滑上 4 总共设备 4*8 = 32 柱: 然后创建数组 32 柱. 我省略了设置的初始部分 (RTC, 在init 7219 等等) 然后在周期 “环” 你做:
- 读RTC寄存器
- 小时值的解码, 分和秒,以获得所述十位和个的各个值. 这些值用来指向你在各个组的字符表的开始 8 字节.
- 从几十个小时的值开始的例程通过从字节位置中的表结构和插入物中提取的相对字节 32 数组的值中提取一次一个. 开始在该点的阵列从位置扫描 “零” 显示所述第一设备的所述第一列的内容向左和持续 32 位置 (这些器件 4 串联). 一旦该扫描是它向左移动一个位置在整个阵列,并且该循环与配置的下一个字节重新开始. 当循环结束 8 字节它继续与小时,直到单元’ 用相同的系统中的第二单元的. 因此,获得的滑动效果. 但是其他的读数之间’ RTC和完整的显示都将丢失 2/3 每个周期秒.
此时进来一个方面仍然没有在显示管理层认为. 正如我所说的设备是 4 串联. 然后,这也是为了引导整个设备 (从第一个到最后) 知道每个命令包括 2 字节 (地址/值) 我们需要发送一组等于设备的字节数对靶向值和命令:
或者,如果设备是第四序列如下: “0000 0000 0000 XXXX“. (如果该设备是第一序列将: “XXXX“)
鸽子: “0000” 它的代码 空操作, “XXXX” 在命令被发送到第四设备 (第一个路口右转). 但是从第四组字节序列 (在实践中,最后). 该芯片接收第一 4 但是由于在循环字节还接收随后的零, 从一个设备滑动的各种字节. 所有这一切是通过从表中读取一种特定的功能 (有备无患 8 设备) 一世 4 价值明显从去年开始. Ë’ 但是,其基于该设备号相同的功能来发送多少字节.
很抱歉,但它更容易做的比说的. 我希望我是清楚的,但 注意 一切是相对于所述第一设备位置,以被分配的号码 1.
级联时钟: 在这里,我们有更复杂, 但从实施点, 这些persentati直到现在. 我承认,我在建立正确的算法来实现,你在电影中看到的效果的一些问题. 也跳过在这里,在执行的标准操作 “建立” 直接去本发明方法. 然后循环 “环” 你开始读RTC值, 它们转换成几十个小时和分钟, 小时和分钟为单位. 秒通过在第三设备闪烁显示由左, LED “DP” 根据该位的值的第一列的 “1” 秒. 从电影可以看作是最初的所有矩阵设定值, 妈, 仅当应该显示的值变化相比前每个矩阵改变. 如果每个值从RTC读 (几十小时或分钟, 的小时或分钟为单位) 变化, 然后升级其显示被激活. 因此,每 60 秒 (“大约” 因为矩阵充分展示占据了一点时间) 它更新数分钟或数小时,等. 为了达到效果 “瀑布” 每列的各个LED的你已经从上表可以采取 (被三只所以你可以改变数据源) 单字节 (第一至第八) 它开始闪烁的第一LED (位 1) 每 15 女士, 然后用第二但这样做是说以前的LED一直亮起,继续 (根据字符的结构). 零个字节被跳过. 重复这个循环,直到八个字节完成. 当这个周期被传递到下一个字符,直到完成. 一世 15 一个闪光灯和另一个之间毫秒的延迟是执行和所需效果的速度之间的折衷. 显然,秒的闪光将是不准确的,特别是如果他们在同一时间的小时和分钟改变。(该 23.59 一个 00.00).
这是不容易来形容这种机制, 自己甚至在已经产生,并通过加入可变参数修改, 我几乎不能ricomprenderlo (!!!). 如果你是编程初学者, 例程被充分注释应被理解.
语音时钟: 而这里的’ 最后 (希望在此期间不要有你无聊). 我也想为了使不同的显示模块之间的比较,更何况这: 在这种情况下,, 拉出的老东西的抽屉,但功能仍然齐全, 它是 DL2416T 特定显示今天换成 DLR2416. 不幸的是,后者是昂贵.
这两种模式之间的区别,我们可以用这个图中看到它:

第一类是 4 分段显示 (14 如果我没有算错了) 而第二个是一个矩阵7×5. 这些显示特性, 既是引脚功能兼容, 它们可以被概括为:
- 4 位可单独寻址 (“00”, “01”, “10”, “11”).
- 设备可单独寻址 (两个选择引脚)
- 可擦除单独.
- 设置的特殊字符, 字母和数字.
- 自动复用管理.
- 食品 5 一个6V最大.
- 光标管理
- 每个数据表中的其他功能.
在下面的有效数字为两款车型, 连接销:

我们检查: 2 销供选择 (CE1 / 2), 2 引脚光标的管理 (CUS,CUE), 两个销为数字的选择 (A0 / A1), 销 CLR 消除, 销 BL 对于没有价值的损失关机 (对于blincaggio有用), 7 销 (D0 / D6) 为 数据输入, 最后,销 我们 该值的写作. 高 - 低 - 高的过渡使设置的内容写入. 经验丰富的最优值: 5我们.
然后将连接的复杂性,两个显示器 (作为原型), 我不得不产生这样的PCB:

我已经设计的电路作为所述PCB只通过并联连接销提供两个显示器的壳体 D0 / D6 并把连接到 “主要” 我脚 A0 / A1, 我们, CL1, CL2, BL1, BL2. 我脚 CUS Ë CUE 在这种情况下,他们不会使用,并设置为默认值 (逻辑电平 “0” Ë “1”). 一个特别值得注意涉及销 CL1 / 2 Ë BL1 / 2: 根据在数据表的用于显示或其abblencamento取消我们独立于相同的显示的选择: 不能 (但它是一种选择) 并联连接,如果你想删除或关闭独显. 我预计在后期软件. 这里代替上为微Arduino_Nano主板和两个74HC595在pcb.

让我们继续前进,然后原型的心脏.
很显然,鉴于连接数 (6 每个I数据输入) Ë 9 为命令, 他们将耗尽所有ARDUINO销 (一个或纳米要离开了米加等), 所以我们需要一个不同的方法,因为可以在这个线路图中可以看出:

在图表中我们可以看到 2 74HC595 (移位寄存器) 其中在第一他们在引脚输出被定义 D0 / D6 相对于显示器的数据输入端,而在第二命令销被定义: 当/ A1, CL1 / 2,BL1 / 2, CE1 / 2. 两个芯片级联连接并根据所述移位寄存器的规则 (在串行接收数据发送它们并联). 信号 QH 连接到 数据输入 第二.
该方案是在与第一版本,它不是严格必要的分离信号 OE, THE, CLK 因为它需要的信号分别是 OE 其控制输出 支持/ Q7 (否则他们是高阻抗). Ë’ 然而,我所选择的信号分离. 信号 先生 (主复位) 它用于复位芯片. 命令管脚被连接到Arduino销; 信号 “我们” 它是独立于休息和属于另一微针.
至于芯片 7219 您可以定义 “智能” 因为除了移位寄存器功能, 需要的命令对的功能的激活, 一世 74HC595 他们是 “笨” 因为他们只是局限于接收串行位,如果这些 > 8 连续位传递到下一芯片,等等. 采取这一系统的优点,该算法用于单独控制显示在可以由:
- 发送到一个芯片 8 有关字符的配置位 (8 位森佩尔零).
- 发送到所述控制位的下一个芯片选择显示配置及其位; 操作, 这些, 在顺序进行.
- 稳定使信号’ OE 两个芯片.
- 开关信号 “我们” 上显示的实际写作.
Ë’ 显然,不必写 8 数字 (2 每台显示器 4 数字) sigole组成完整的文本的字母 (你可能已经看过电影) 必要确定命令的确切序列和要发送的字符 . 在这方面,我已经构建如下表.

当你阅读此表 ?. 例子: 要加载显示 “1” 数字 “0” 一个字符: 那么你被发送到第一芯片和根据十进制值芯片的字符的值 “62“. 布局位输出 (Q0 / Q7) 它对应于信号 A1 / A0, BL2, CL2, CE2, BL1, CL1, CE1 对此我的逻辑电平 “1” (非经营) 或逻辑电平 “0” 操作. 因为我已经习惯正确计算值时,他们是零或一,不要欺骗表中显示的数字. 要记住的另一件事是,这取决于如何在芯片已经连接到信号,然后显示, 它不是说,第一芯片必须一定是一个用于数据或用于信号.
不过有一点耐心: 此外,我们完成这个原型,其软件. 你也知道在这种情况下,它涉及到管理一个时钟. 草图并不复杂,但它可以简述如下:
- 索利塔激活’ RTC与通常存在的控制和效率,在不存在该系统的.
- 连接到所述芯片74HC595销的配置.
- 在循环 “环” 该RTC值读数, 相同的,并且准备一个字符串的转码包括的话 “是小时 ” 时间值 (十位和个) 与穿插点, 然后 “THE ” 天值, 周月和转码的转码. 所以在字符串的结尾将包含:
- 是XX.XX XX日周五HOURS —-> 例子. 一个字和另一个之间的空间与角色获得 “00” 二进制产生什么可见.
- 建设后弦, 根据其实际长度被插入到一个数组d 8 字节位置 8, 字符串的第一个字符.
- 它执行一个循环 8 循环来发送数组的值,以 8 数字DEI显示 (设定特定的命令来显示和数字和data_value的).
- 它维护移阵列 8 从右到左字节.
- 它重复周期.
它以这种方式获得,滑动效果,其中250ms的编程速度可以被认为是最优的用于观看.
结论:
我承认,这篇文章很长,可能我描述明显的事情和risapute. 但是从我的角度看的方式和实施选择, 他们可以永远是一个很好的信息来源特别是对那些谁是初学者或者干脆像我这样的业余爱好者.
如果当时我写了一些不准确, 请原谅不.
感谢您的关注.
GVSOFT五月 2018
PS: 如果你有兴趣在草图及相关文件写gvsoft75@hotmail.com.

我所看到的东西,或者在之前的疯狂时钟之一有怎样的DCF77信号进行解码的解释?
我想这个项目,但无法找到它.
没有, 我从来没有在任何DCF77梅项目的使用.