成为订阅者(免费)

加入29,000名其他订阅者以获得用户销售折扣和 其他免费资源。
:
:
大学教师'担心 - 您的邮件地址完全是 安全的。我保证使用它 只要 到 send you MicroZine.

如何 to 使用MAX7219驱动8x8 LED显示矩阵 Arduino.

MAX7219 LED驱动器可节省处理器引脚和 处理时间!以下, 您可以确切地了解为什么这是真实的,以及如何 use these devices on an Arduino. You'LL还看到如何使用多个设备 不再使用 processor pins!

使用7219,您可以在只需要3时驾驶64个LED wires to interface 它到微控制器(这不包括V. CC. and 假设的GND 可用)。此外,您可以菊花链多 7219 chips for bigger displays.

7219驾驶64有16条输出线 个别LED。这个 听起来不可能,但驱动方法利用了 way our eyes work. 利用视力的持久性被利用以使LED出现 to be on all the 事实上他们不是的时间。事实上,LED是 安排为8x8套 行和列。每列都脉冲短时间 虽然行位 该列被驱动。

我们的眼睛记得大约一盏灯 20ms, so when you 以速率连续闪烁光(或LED)或 比20ms更快,然后 似乎光永远不会熄灭。这是怎么回事 7219 works. All the LED在短时间内被单独打开,以速度 greater than 20ms.

max7219-1088as breakout
                scrolled LED display

spi. 接口

MAX7219 具有四线SPI接口 - 时钟,数据, chip select and 地面 - 连接到一个非常简单 microcontroller.

  1. 数据 - 莫斯 - 主输出串行输入。 7219是从设备。
  2. 芯片选择 - 加载 (CSn) - 有效的低芯片选择。
  3. 钟 - SCK.
  4. 地面。

MAX7219 规范

  Parameter
价值
  Voltage Supply (Vs)
4.0V〜5.5V.
  Supply current
330mA
  段驱动源电流 -40mA
  Shut down current
150uA
  Scan rate 500-1300Hz,800Hz(典型值)
  Interface
spi. (四线)
  Max serial clock 10MHz(Max)
  工作温度 (MAX7219E)
-40°C〜85°C [1]
           [1]对于MAX7219C温度范围是 0°C〜70°C

MAX7219 和 MAX7221 Datasheet:

[max7219数据表: http://datasheets.maximintegrated.com/en/ds/MAX7219-MAX7221.pdf]

笔记 : 这 MAX6950 / MAX6951是一个 3或3.3V系统的等效设备,但有 差异如此阅读 仔细数据表例如没有级联 - 重要的是你 不能使用它们 内部有线7SEGING显示,但您确实可以访问 to each LED segment (probably using a Charlieplexing. method - 虽然这不是直接说明的)。这 MAX6950/MAX6951 is 仅在表面贴装包装中使用。

显示MAX7219亮度控制

有两种方法可以控制显示亮度。

  • 通过电流设置电阻(RSET)。
  • 通过使用内部控制寄存器。
笔记 :没有 requirement for 将电流限制电阻添加到每个列中 LED输出强度是 由PWM信号控制I.E。LED接通 a shorter time to 暗淡它们 - 此时间由寄存器控制。

电阻器 Brightness Control

尽管如此,你不能使用一个没有其他的 to use the 电阻设置最大强度(最大电流 - the current into pin ISET - 实际电流是ISET电流的100倍 价值)。最小值 40mA亮度的电阻应为9.53K - reality you just use 10K电阻(这取决于您使用的LED - 可能应该使用 12K电阻 - 使用红色LED最大为7219寿命 - see below).

电流设置还取决于正向电压 drop of the LEDs you 采用;每个不同的LED颜色都有不同的前方 电压降 - 见表 11:

表11:RSEC VS. 分段电流和LED Forward Voltage

Iseg(MA) v (V)
1.5 2.0 2.5 3.0 3.5
40 12.2 11.8 11.0 10.6 9.69
30 17.8 17.1 15.8 15.0 14.0
20 29.8 28.0 25.9 24.5 22.6
10 66.7 63.7 59.3 55.4 51.2

来自数据表:[MAX7219 http://datasheets.maximintegrated.com/en/ds/MAX7219-MAX7221.pdf

以下是正向电压下降(在〜15mA常数 目前的一些) LEDs on my bench:

引领 vf(v)@〜15ma
红色的 1.91
黄色的 2.03
绿色的 2.14
蓝色 3.07

登记 Brightness control

控制亮度的第二种方式更有用 is under program 控制。寄存器0xxa使用4设置级别 lower data bits i.e. 有15个亮度水平值,15个是15 the brightest.

布线布局 two MAX7219s

如果你只有一个突破板休假 hand one.

下面的布局允许从左到来滚动文本 right (It does not 这种方式有权将它们电线连接 - 但这是方式 此代码允许 正确滚动)。在顶部的连接 板是相同的 在底部的那些,除了中间销是dout (black). The other 4 线直通过连接。

笔记 : 加上 更多滚动显示器 将它们添加到左侧并更改MaxDisplays变量 to match (2nd example code).

 MAX7219 -1088AS突破滚动LED显示屏

了解 MAX7219

MAX7219 输入接口是16位串行输入 shift register. The 前8位定义了第二个8位的命令 定义该数据 命令(见下图):

 MAX7219 
                internal block diagram showing how it works.

只有4条地址行选择要执行的操作 - the other 4 are not 用过的。请注意,首先发送MSB。前4位是 redundant but you 仍然必须将它们发送到换档寄存器中以填充 that register completely.

最重要的一点是多个MAX7219设备 can be cascaded 只需通过一个到DIN的DOUT喂食 of the next. Load 和时钟(CLK)对所有设备保持相同。

负载脉冲(CSN)是发送所有数据的触发器 from the shift 在设备中注册到每个控制寄存器中 same time. You can 根据需要更改移位寄存器内容 (consider data flow 当级联许多设备时,完成后,您 将数据转移到 通过脉冲低电平使用CSN线路控制寄存器 then high.

DOT Matrix显示 1088AS

数据表在相当的情况下显示二极管布局 无益的方式(它被偏见了 朝着行/列而不是引脚布局.:

1088AS
                diode layout

资源 [http://www.datasheetbank.com/datasheet/ETC/1088AS.html]

1088AS Row and Column setup

实际上,销钉放在物理上如下:

笔记 :较低的 用销1-8的侧面 在案例上由小半月标签识别。

如果您想证明这是这种情况,请使用a 二极管上的万用表 检查设置。将正探针(红色)放到销16和 负探针(PIN 1)。然后,您将在第8列和第5行灯中看到二极管 up.

提示: The above 方法可用于 在任何未知的LED矩阵上识别LED位置。

图书馆

周围有很少的图书馆(一个呼叫本身 yet-another MAX7219 library!).

笔记 :去 quickly with scrolled text
just use the second 图书馆 MaxMatrix below.

一些工作比其他人更好,但我选择的少数人 random - I did have 一些问题。我想做什么听起来很简单 - 使用两个max7219串行 显示器(64个LED)菊花链接并滚动了一些文本 across them.

你应该注意的一件事是这些库 可能是期待 两个以上的设备 - 然而不应该阻止它们 operating correctly! 他们可以为你工作!

警告: These 图书馆有点撞击 并且不要使用SPI接口(虽然它们是 附加到正确的 如果要使用内部SPI模块,请使用引脚 - find/write the code 你自己!)。因此,它们相当慢 - 特别是如果 you want to do other 与微控制器的任务。然而他们很好地工作 足够的任务在这里 (scrolled text).

图书馆LEDCONTROL.

我尝试过的第一个图书馆提供了基本操作 character output and 允许各个像素控制。但在我的展示中 text was back to 正面。这是一个基本库,可以使用较少的内存 than others - so it 如果您需要较小的代码,可能值得纠正。

使用Arduino库安装此库 manager!

引领 CONTROL示例

编辑以下内容(安装目录中的示例) for the pins used (save as your own):

  • lcdemocascadeddevices.ino(2286字节)个人 像素控制 - 工作。
  • lcdemo7segment.ino(2766字节) - 不知道这是什么 doing!
  • lcdemomatrix.ino(3584 bytes) - 有点配合 backwards text.
笔记 :这个图书馆 does not scroll 文本。例子仅适用于一个64个LED单元 - 您可以编辑 them to use the other.

可以通过添加您自己的代码来进行此库 on top but you have 写下所有的显示器转移 - 已经 完毕!。我有一个问题 使用该代码是它使用已弃用的类型(其中 prog_uchar is no 在新的Arduino Compiler中使用时间更长):

prog_uchar

要舍入,请将以下内容添加到顶部 code:

#define prog_uchar const char

另一个问题是滚动方向是 左右。假设 是您使用LED正确使用I..行是 水平和柱子 是垂直的(这对于插头的显示器是正确的 直接在一起即e.e. 当放置到结束行和列时正确 方向)。那些 如下图所示,有行和列 swapped - the top of LED显示屏(上图)是左侧。

我正在使用那些更容易有行 垂直和列为 horizontal (see 接线 diagram 以下)。很高兴有一个代码交换机 改变这个 正如我在这里的非MAX7219项目上所做的那样:(这 引领 矩阵项目 directly controls a 8x8 64 LED矩阵使用8个晶体管(列)和8个数据 drives (ROWS)).

选择 library Maxtrix_Sprite.

另一个你可以尝试(我没有 - 只是快速 look) is maxtrix_sprite。这有一个有趣的方法来定义一个 sprite that is not 固定在特定尺寸。

使用此库中的所有功能更详细 这里 (虽然它没有向您展示在使用时发生的事情 the functions - see 例3. for that).

图书馆 MaxMatrix

这是一个手动安装<location of your sketches>/libraries - 解压缩此目录。

我使用的第二个图书馆(maxmatrix.)。这提供了简单的 界面和多个 滚动文本的方法:

  • Shiftleft - 可能是您需要使用的唯一功能 (see 例子 3)
  • 上移
  • shiftright - 请参阅代码注释(下面) not work that well.
  • 降档

对于想要左滚动滚动文本的大多数用户 library works well 但它只适用于所面向的模块 突破板显示在 下面的接线图I.仅限于 科尔斯 and ROWS swapped。它无法正常工作 插入模块 这具有正确导向的行和列(带有一个 surface mount MAX7912安装在后面)。

警告: This 图书馆不起作用( 除非1088AS LED是的,否则文本不会滚动到左侧) oriented with rows 垂直和柱子水平(1088AS pinout ) 和 每个显示在另一个显示旁边对齐(见 接线 diagram )。

此图显示了发生的情况:

maxmatrix示例

使用代码大小(3482字节) (with 例子 below )。

软件设置 for MAX7219:

IDE版本使用:1.6.4
二手董事会:Arduino Uno R3
使用设备:MAX7219
LED显示:64个元素LED矩阵(8x8) - 部分号 1088AS.

MAX7219 的零件 project:

  1. 2off - max7219(在备件板上)。
  2. 2off - 64元素LED矩阵(8x8) - 第号码1088as (on breakout board).
  3. 2OFF - 10K电阻(在备件板上)。
  4. arduino. Uno R3。
  5. 2off - 10UF电解(在备件板上)。

arduino素描 Example 1

此代码使用2个单位并使用内部SPI模块。 The display 在随机像素的同时,强度在上下慢慢缩放 are lit/unlit on the 显示 - 在一个变暗的房间里很好!它是基于的 code found here :

//gist.github.com/nrdobie/8193350


...但是修改以显示2个单位的操作。

我故意将代码作为基本操作离开 code without 算法e.g.没有设置显示单位的数量, 因为这让你允许 查看系统的根本操作 - 它保持 everything in one file.

警告 :你可能 hypnotize yourself 随机输出!

使用一个单位 - 断开 the last 一! - 并重置重置。

笔记 : 这 串行调试输出速度 代码 - 删除它(以及延迟(10))查看非常 fast operation.

注意如何添加两次代码以串行填写两次 connected MAX7219 (内部)移位寄存器 - 请参阅功能:

maxTransferCMD
maxTransferDATA

MAX7219 教程示例1代码:


// max7219_two
// Based on //gist.github.com/nrdobie/8193350

#include <SPI.h>
#define SS_PIN 10

// MAX7219 SPI LED Driver
#define MAX7219_TEST 0x0f // in real code put into a .h file
#define MAX7219_BRIGHTNESS 0x0a // in real code put into a .h file
#define MAX7219_SCAN_LIMIT 0x0b // in real code put into a .h file
#define MAX7219_DECODE_MODE 0x09 // in real code put into a .h file
#define MAX7219_SHUTDOWN 0x0C // in real code put into a .h file

void maxTransferCMD(uint8_t address, uint8_t value) {  
uint8_t i;

  digitalWrite(SS_PIN, LOW);   
  
spi. .transfer(address);      // Send address.
   spi. .transfer(value);        // Send the value.
   spi. .transfer(address);      // Send address.
   spi. .transfer(value);        // Send the value.
  digitalWrite(SS_PIN, HIGH); // Finish transfer.
}

void maxTransferDATA(uint8_t address, uint8_t value, uint8_t v2) {  
uint8_t i;
  digitalWrite(SS_PIN, LOW);   

  
spi. .transfer(address);      // Send address.
   spi. .transfer(value);        // Send the value.
   spi. .transfer(address);      // Send address.
   spi. .transfer(v2);         // Send the value.
  digitalWrite(SS_PIN, HIGH); // Finish transfer.
}

void setup() {

  
Serial.begin(9600);

  Serial.println("Debug MAX7219");

  
pinMode(SS_PIN, OUTPUT);  

  
spi. .setBitOrder(MSBFIRST);   // Reverse the SPI Data o/p.
   spi. .begin();                 // Start SPI


  
// Run test - All LED segments lit.
  maxTransferCMD( MAX7219 _TEST, 0x01);  delay(1000);  
  
maxTransferCMD( MAX7219 _TEST, 0x00);        // Finish test mode.
  
maxTransferCMD( MAX7219 _DECODE_MODE, 0x00); // Disable BCD mode.
  maxTransferCMD( MAX7219 _BRIGHTNESS, 0x00);  // Use lowest intensity.
  maxTransferCMD( MAX7219 _SCAN_LIMIT, 0x0f);  // Scan all digits.
  maxTransferCMD( MAX7219 _SHUTDOWN, 0x01);    // Turn on chip.

}

void loop() {  
uint8_t row=0;
在 t i=0,ud=1; // Need signed numbers.

    为了 (;;) {      

      
i += ud; 

      
if (i>255) {ud=-1;i=255;}

      if (i<0)   {ud=1 ;i=0;}

      if (row++>8) row=1;        
      
maxTransferDATA(row, random(0,255), random(0,255));             
      
maxTransferCMD( MAX7219 _BRIGHTNESS,i>>4);
      delay(10); 

      
Serial.print(" i ");
      Serial.print(i);
      Serial.print(" ud ");
      Serial.println(ud);
   }
}








arduino素描 Example 2

此草图使用MaxMatrix库留下文本 using bit banged 操作(使用的函数是ShiftOut - 在库中 code - this is an 自动包含Arduino功能)所以设备可以是 used on any pins (at a slower rate).

缓冲区Buf7219被定义为允许您的最大数据 use so if you use 超过5个数据字节增加它 - 其他数据刚刚将其设置为 10 - but that is 令人困惑,因为它不容易看出它的用途 unless you read the code.

笔记 : 观察 progmem限定符 将数据放入内部编程内存中 access function that 您必须使用来检索它memcpy_p()。

示例2 Max7219 Arduino示例代码


// maxmatrix-disp-scroll-text-7219
// based on
// //code.google.com/p/arudino-maxmatrix-library/wiki/Example_Display_Scrolling_Tex
#include <MaxMatrix.h>
#include <avr/pgmspace.h>

#define maxDisplays 2
// Number of MAX7219's in use.

byte Buf7219[7]; // "width,height,data[5]" single character buffer.
const  在 t data  = 11;     // DIN or MOSI
const  在 t load  = 10;     // CS
const  在 t clock = 13;     // SCK
  
maxmatrix. m(data, load, clock, maxDisplays);
// Data array is stored in program memory (see memcpy_P for access).
// Parameters are width, height, character data...
// There is a speed improvement for characters with height 8 bits see lib.

PROGMEM const unsigned char CH[] = {
3,
 8, B0000000, B0000000, B0000000, B0000000, B0000000, // space
1, 8, B1011111, B0000000, B0000000, B0000000, B0000000, // !
3, 8, B0000011, B0000000, B0000011, B0000000, B0000000, // "
5, 8, B0010100, B0111110, B0010100, B0111110, B0010100, // #
4, 8, B0100100, B1101010, B0101011, B0010010, B0000000, // $
5, 8, B1100011, B0010011, B0001000, B1100100, B1100011, // %
5, 8, B0110110, B1001001, B1010110, B0100000, B1010000, // &
1, 8, B0000011, B0000000, B0000000, B0000000, B0000000, // '
3, 8, B0011100, B0100010, B1000001, B0000000, B0000000, // (
3, 8, B1000001, B0100010, B0011100, B0000000, B0000000, // )
5, 8, B0101000, B0011000, B0001110, B0011000, B0101000, // *
5, 8, B0001000, B0001000, B0111110, B0001000, B0001000, // +
2, 8, B10110000, B1110000, B0000000, B0000000, B0000000, // ,
4, 8, B0001000, B0001000, B0001000, B0001000, B0000000, // -
2, 8, B1100000, B1100000, B0000000, B0000000, B0000000, // .
4, 8, B1100000, B0011000, B0000110, B0000001, B0000000, // /
4, 8, B0111110, B1000001, B1000001, B0111110, B0000000, // 0
3, 8, B1000010, B1111111, B1000000, B0000000, B0000000, // 1
4, 8, B1100010, B1010001, B1001001, B1000110, B0000000, // 2
4, 8, B0100010, B1000001, B1001001, B0110110, B0000000, // 3
4, 8, B0011000, B0010100, B0010010, B1111111, B0000000, // 4
4, 8, B0100111, B1000101, B1000101, B0111001, B0000000, // 5
4, 8, B0111110, B1001001, B1001001, B0110000, B0000000, // 6
4, 8, B1100001, B0010001, B0001001, B0000111, B0000000, // 7
4, 8, B0110110, B1001001, B1001001, B0110110, B0000000, // 8
4, 8, B0000110, B1001001, B1001001, B0111110, B0000000, // 9
2, 8, B01010000, B0000000, B0000000, B0000000, B0000000, // :
2, 8, B10000000, B01010000, B0000000, B0000000, B0000000, // ;
3, 8, B0010000, B0101000, B1000100, B0000000, B0000000, // <
3, 8, B0010100, B0010100, B0010100, B0000000, B0000000, // =
3, 8, B1000100, B0101000, B0010000, B0000000, B0000000, // >
4, 8, B0000010, B1011001, B0001001, B0000110, B0000000, // ?
5, 8, B0111110, B1001001, B1010101, B1011101, B0001110, // @
4, 8, B1111110, B0010001, B0010001, B1111110, B0000000, // A
4, 8, B1111111, B1001001, B1001001, B0110110, B0000000, // B
4, 8, B0111110, B1000001, B1000001, B0100010, B0000000, // C
4, 8, B1111111, B1000001, B1000001, B0111110, B0000000, // D
4, 8, B1111111, B1001001, B1001001, B1000001, B0000000, // E
4, 8, B1111111, B0001001, B0001001, B0000001, B0000000, // F
4, 8, B0111110, B1000001, B1001001, B1111010, B0000000, // G
4, 8, B1111111, B0001000, B0001000, B1111111, B0000000, // H
3, 8, B1000001, B1111111, B1000001, B0000000, B0000000, // I
4, 8, B0110000, B1000000, B1000001, B0111111, B0000000, // J
4, 8, B1111111, B0001000, B0010100, B1100011, B0000000, // K
4, 8, B1111111, B1000000, B1000000, B1000000, B0000000, // L
5, 8, B1111111, B0000010, B0001100, B0000010, B1111111, // M
5, 8, B1111111, B0000100, B0001000, B0010000, B1111111, // N
4, 8, B0111110, B1000001, B1000001, B0111110, B0000000, // O
4, 8, B1111111, B0001001, B0001001, B0000110, B0000000, // P
4, 8, B0111110, B1000001, B1000001, B10111110, B0000000, // Q
4, 8, B1111111, B0001001, B0001001, B1110110, B0000000, // R
4, 8, B1000110, B1001001, B1001001, B0110010, B0000000, // S
5, 8, B0000001, B0000001, B1111111, B0000001, B0000001, // T
4, 8, B0111111, B1000000, B1000000, B0111111, B0000000, // U
5, 8, B0001111, B0110000, B1000000, B0110000, B0001111, // V
5, 8, B0111111, B1000000, B0111000, B1000000, B0111111, // W
5, 8, B1100011, B0010100, B0001000, B0010100, B1100011, // X
5, 8, B0000111, B0001000, B1110000, B0001000, B0000111, // Y
4, 8, B1100001, B1010001, B1001001, B1000111, B0000000, // Z
2, 8, B1111111, B1000001, B0000000, B0000000, B0000000, // [
4, 8, B0000001, B0000110, B0011000, B1100000, B0000000, // backslash
2, 8, B1000001, B1111111, B0000000, B0000000, B0000000, // ]
3, 8, B0000010, B0000001, B0000010, B0000000, B0000000, // hat
4, 8, B1000000, B1000000, B1000000, B1000000, B0000000, // _
2, 8, B0000001, B0000010, B0000000, B0000000, B0000000, // `
4, 8, B0100000, B1010100, B1010100, B1111000, B0000000, // a
4, 8, B1111111, B1000100, B1000100, B0111000, B0000000, // b
4, 8, B0111000, B1000100, B1000100, B0000000, B0000000, // c // JFM MOD.
4, 8, B0111000, B1000100, B1000100, B1111111, B0000000, // d
4, 8, B0111000, B1010100, B1010100, B0011000, B0000000, // e
3, 8, B0000100, B1111110, B0000101, B0000000, B0000000, // f
4, 8, B10011000, B10100100, B10100100, B01111000, B0000000, // g
4, 8, B1111111, B0000100, B0000100, B1111000, B0000000, // h
3, 8, B1000100, B1111101, B1000000, B0000000, B0000000, // i
4, 8, B1000000, B10000000, B10000100, B1111101, B0000000, // j
4, 8, B1111111, B0010000, B0101000, B1000100, B0000000, // k
3, 8, B1000001, B1111111, B1000000, B0000000, B0000000, // l
5, 8, B1111100, B0000100, B1111100, B0000100, B1111000, // m
4, 8, B1111100, B0000100, B0000100, B1111000, B0000000, // n
4, 8, B0111000, B1000100, B1000100, B0111000, B0000000, // o
4, 8, B11111100, B0100100, B0100100, B0011000, B0000000, // p
4, 8, B0011000, B0100100, B0100100, B11111100, B0000000, // q
4, 8, B1111100, B0001000, B0000100, B0000100, B0000000, // r
4, 8, B1001000, B1010100, B1010100, B0100100, B0000000, // s
3, 8, B0000100, B0111111, B1000100, B0000000, B0000000, // t
4, 8, B0111100, B1000000, B1000000, B1111100, B0000000, // u
5, 8, B0011100, B0100000, B1000000, B0100000, B0011100, // v
5, 8, B0111100, B1000000, B0111100, B1000000, B0111100, // w
5, 8, B1000100, B0101000, B0010000, B0101000, B1000100, // x
4, 8, B10011100, B10100000, B10100000, B1111100, B0000000, // y
3, 8, B1100100, B1010100, B1001100, B0000000, B0000000, // z
3, 8, B0001000, B0110110, B1000001, B0000000, B0000000, // {
1, 8, B1111111, B0000000, B0000000, B0000000, B0000000, // |
3, 8, B1000001, B0110110, B0001000, B0000000, B0000000, // }
4, 8, B0001000, B0000100, B0001000, B0000100, B0000000, // ~
};

void setup()
{
  m. 在 it();
  m.setIntensity(3);
}

// Scrolling Text
char string[] = "The quick brown fox juumped over the lazy DOG.;:@'+=-/&";  
void loop()
{
      
  
delay(100);
  m.shiftLeft(false, true);
  printStringWithShift(string,100);   
}

void printCharWithShift(char c,  在 t shift_speed)
{
  if (c < 32) return;
  c -= 32;
  memcpy_P(Buf7219, CH + 7*c, 7);
  m.writeSprite(maxDisplays*8, 0, Buf7219);
  m.setColumn(maxDisplays*8 + Buf7219[0], 0);


  
为了  ( 在 t i=0; i<=Buf7219[0]; i++) 
  
{
    delay(shift_speed);
    m.shiftLeft(false, false);
  }
}

void printStringWithShift(char* s,  在 t shift_speed)
{
  while (*s != 0)
  {
    printCharWithShift(*s, shift_speed);
    s++;
  }
}




arduino. 草图示例 3

您可以探索MaxMatrix库的工作原理/"does not work" with
这个代码。此代码探讨了四个班次方向 provided in the MaxMatrix
library.

  • Shiftleft - 可能是您需要的唯一功能 use.
  • 上移
  • shiftright - 请参阅代码注释(下面) not work that well.
  • 降档

注意右移第一个左移的示例如何 the data by two and 失去了两列,因为库没有执行 wrap around.

示例3代码


// t1-maxmatrix-disp-scroll-text-7219
// sort of based on (but not entirely!)
// //code.google.com/p/arudino-maxmatrix-library/wiki/Example_Display_Scrolling_Text
#include <MaxMatrix.h>
#include <avr/pgmspace.h>

#define maxDisplays 2
// Number of MAX7219's in use.

byte Buf7219[10]; // width,height,data single character buffer.
const  在 t data  = 11;     // DIN or MOSI
const  在 t load  = 10;     // CS
const  在 t clock = 13;     // SCK   

maxmatrix. m(data, load, clock, maxDisplays);

PROGMEM const unsigned char CH[] = {
3,
 8, B0000000, B0000000, B0000000, B0000000, B0000000, // space
1, 8, B1011111, B0000000, B0000000, B0000000, B0000000, // !
3, 8, B0000011, B0000000, B0000011, B0000000, B0000000, // "
5, 8, B0010100, B0111110, B0010100, B0111110, B0010100, // #
4, 8, B0100100, B1101010, B0101011, B0010010, B0000000, // $
5, 8, B1100011, B0010011, B0001000, B1100100, B1100011, // %
5, 8, B0110110, B1001001, B1010110, B0100000, B1010000, // &
1, 8, B0000011, B0000000, B0000000, B0000000, B0000000, // '
3, 8, B0011100, B0100010, B1000001, B0000000, B0000000, // (
3, 8, B1000001, B0100010, B0011100, B0000000, B0000000, // )
5, 8, B0101000, B0011000, B0001110, B0011000, B0101000, // *
5, 8, B0001000, B0001000, B0111110, B0001000, B0001000, // +
2, 8, B10110000, B1110000, B0000000, B0000000, B0000000, // ,
4, 8, B0001000, B0001000, B0001000, B0001000, B0000000, // -
2, 8, B1100000, B1100000, B0000000, B0000000, B0000000, // .
4, 8, B1100000, B0011000, B0000110, B0000001, B0000000, // /
4, 8, B0111110, B1000001, B1000001, B0111110, B0000000, // 0
3, 8, B1000010, B1111111, B1000000, B0000000, B0000000, // 1
4, 8, B1100010, B1010001, B1001001, B1000110, B0000000, // 2
4, 8, B0100010, B1000001, B1001001, B0110110, B0000000, // 3
4, 8, B0011000, B0010100, B0010010, B1111111, B0000000, // 4
4, 8, B0100111, B1000101, B1000101, B0111001, B0000000, // 5
4, 8, B0111110, B1001001, B1001001, B0110000, B0000000, // 6
4, 8, B1100001, B0010001, B0001001, B0000111, B0000000, // 7
4, 8, B0110110, B1001001, B1001001, B0110110, B0000000, // 8
4, 8, B0000110, B1001001, B1001001, B0111110, B0000000, // 9
2, 8, B01010000, B0000000, B0000000, B0000000, B0000000, // :
2, 8, B10000000, B01010000, B0000000, B0000000, B0000000, // ;
3, 8, B0010000, B0101000, B1000100, B0000000, B0000000, // <
3, 8, B0010100, B0010100, B0010100, B0000000, B0000000, // =
3, 8, B1000100, B0101000, B0010000, B0000000, B0000000, // >
4, 8, B0000010, B1011001, B0001001, B0000110, B0000000, // ?
5, 8, B0111110, B1001001, B1010101, B1011101, B0001110, // @
4, 8, B1111110, B0010001, B0010001, B1111110, B0000000, // A
4, 8, B1111111, B1001001, B1001001, B0110110, B0000000, // B
4, 8, B0111110, B1000001, B1000001, B0100010, B0000000, // C
4, 8, B1111111, B1000001, B1000001, B0111110, B0000000, // D
4, 8, B1111111, B1001001, B1001001, B1000001, B0000000, // E
4, 8, B1111111, B0001001, B0001001, B0000001, B0000000, // F
4, 8, B0111110, B1000001, B1001001, B1111010, B0000000, // G
4, 8, B1111111, B0001000, B0001000, B1111111, B0000000, // H
3, 8, B1000001, B1111111, B1000001, B0000000, B0000000, // I
4, 8, B0110000, B1000000, B1000001, B0111111, B0000000, // J
4, 8, B1111111, B0001000, B0010100, B1100011, B0000000, // K
4, 8, B1111111, B1000000, B1000000, B1000000, B0000000, // L
5, 8, B1111111, B0000010, B0001100, B0000010, B1111111, // M
5, 8, B1111111, B0000100, B0001000, B0010000, B1111111, // N
4, 8, B0111110, B1000001, B1000001, B0111110, B0000000, // O
4, 8, B1111111, B0001001, B0001001, B0000110, B0000000, // P
4, 8, B0111110, B1000001, B1000001, B10111110, B0000000, // Q
4, 8, B1111111, B0001001, B0001001, B1110110, B0000000, // R
4, 8, B1000110, B1001001, B1001001, B0110010, B0000000, // S
5, 8, B0000001, B0000001, B1111111, B0000001, B0000001, // T
4, 8, B0111111, B1000000, B1000000, B0111111, B0000000, // U
5, 8, B0001111, B0110000, B1000000, B0110000, B0001111, // V
5, 8, B0111111, B1000000, B0111000, B1000000, B0111111, // W
5, 8, B1100011, B0010100, B0001000, B0010100, B1100011, // X
5, 8, B0000111, B0001000, B1110000, B0001000, B0000111, // Y
4, 8, B1100001, B1010001, B1001001, B1000111, B0000000, // Z
2, 8, B1111111, B1000001, B0000000, B0000000, B0000000, // [
4, 8, B0000001, B0000110, B0011000, B1100000, B0000000, // backslash
2, 8, B1000001, B1111111, B0000000, B0000000, B0000000, // ]
3, 8, B0000010, B0000001, B0000010, B0000000, B0000000, // hat
4, 8, B1000000, B1000000, B1000000, B1000000, B0000000, // _
2, 8, B0000001, B0000010, B0000000, B0000000, B0000000, // `
4, 8, B0100000, B1010100, B1010100, B1111000, B0000000, // a
4, 8, B1111111, B1000100, B1000100, B0111000, B0000000, // b
4, 8, B0111000, B1000100, B1000100, B0000000, B0000000, // c // JFM MOD.
4, 8, B0111000, B1000100, B1000100, B1111111, B0000000, // d
4, 8, B0111000, B1010100, B1010100, B0011000, B0000000, // e
3, 8, B0000100, B1111110, B0000101, B0000000, B0000000, // f
4, 8, B10011000, B10100100, B10100100, B01111000, B0000000, // g
4, 8, B1111111, B0000100, B0000100, B1111000, B0000000, // h
3, 8, B1000100, B1111101, B1000000, B0000000, B0000000, // i
4, 8, B1000000, B10000000, B10000100, B1111101, B0000000, // j
4, 8, B1111111, B0010000, B0101000, B1000100, B0000000, // k
3, 8, B1000001, B1111111, B1000000, B0000000, B0000000, // l
5, 8, B1111100, B0000100, B1111100, B0000100, B1111000, // m
4, 8, B1111100, B0000100, B0000100, B1111000, B0000000, // n
4, 8, B0111000, B1000100, B1000100, B0111000, B0000000, // o
4, 8, B11111100, B0100100, B0100100, B0011000, B0000000, // p
4, 8, B0011000, B0100100, B0100100, B11111100, B0000000, // q
4, 8, B1111100, B0001000, B0000100, B0000100, B0000000, // r
4, 8, B1001000, B1010100, B1010100, B0100100, B0000000, // s
3, 8, B0000100, B0111111, B1000100, B0000000, B0000000, // t
4, 8, B0111100, B1000000, B1000000, B1111100, B0000000, // u
5, 8, B0011100, B0100000, B1000000, B0100000, B0011100, // v
5, 8, B0111100, B1000000, B0111100, B1000000, B0111100, // w
5, 8, B1000100, B0101000, B0010000, B0101000, B1000100, // x
4, 8, B10011100, B10100000, B10100000, B1111100, B0000000, // y
3, 8, B1100100, B1010100, B1001100, B0000000, B0000000, // z
3, 8, B0001000, B0110110, B1000001, B0000000, B0000000, // {
1, 8, B1111111, B0000000, B0000000, B0000000, B0000000, // |
3, 8, B1000001, B0110110, B0001000, B0000000, B0000000, // }
4, 8, B0001000, B0000100, B0001000, B0000100, B0000000, // ~
};


void setup()
{
  m. 在 it();
  m.setIntensity(3);
}

char string[] = "Best-Microcontroller-Projects.com";  // Scrolling Text

void loop()
{
  m.shiftLeft(false, true);            
  
  
byte CH_A[] = {4, 8, B1111110, B0010001, B0010001, B1111110 };

  
// Down
  m.writeSprite(0, 0, CH_A);
   为了  ( 在 t i=0; i<8; i++)
  {
    delay(300);
    m.降档(true); // rotate = true = rotate within 8 bit block
  }

  delay(500);

  m.clear(); 

  
// UP
  m.writeSprite(0, 0, CH_A);
   为了  ( 在 t i=0; i<8; i++)
  {
    delay(300);
    m. 上移 (true);  // rotate = true = rotate within 8 bit block
  }

  delay(500);
  m.clear();

  
m.writeSprite(0, 0, CH_A);

  
delay(500);

  m.clear(); 

  
// Left
  m.writeSprite(8, 0, CH_A); // write sprite OUTSIDE the LED matrix
   为了  ( 在 t i=0; i<8; i++)
  {
    delay(300);
    m.shiftLeft(false, false); 
  
}

  
delay(500);
  m.clear();

  
// Right - does not work in the same way as shiftleft.
  m.writeSprite(0, 0, CH_A); 
  
m.shiftLeft(false, false); // Code library does not work for shiftleft
  m.shiftLeft(false, false); // unless all chars are on the screen!
   for ( 在 t i=0; i<8; i++)
  {
    delay(300);
    m.shiftRight(true, false); 
  
}

  
delay(500);
  m.clear();
}

void printCharWithShift(char c,  在 t shift_speed)
{
  if (c < 32) return;
  c -= 32;
  memcpy_P(Buf7219, CH + 7*c, 7);
  m.writeSprite(maxDisplays*8, 0, Buf7219);
  m.setColumn(maxDisplays*8 + Buf7219[0], 0);

  
为了  ( 在 t i=0; i<Buf7219[0]+1; i++) 
  
{
    delay(shift_speed);
    m.shiftLeft(false, false);
  }
}

void printStringWithShift(char* s,  在 t shift_speed)
{
  while (*s != 0)
  {
    printCharWithShift(*s, shift_speed);
    s++;
  }
}



一点点 extra on the MAX7219 and MIPS

解码或不解码 - 即 question.

MAX7219 能够自动解码二进制文件 coded decimal values (BCD)。启用时,这意味着7段显示 LEDs are correctly 输入BCD时,照亮显示数字 value.

笔记 :BCD号码 is just a binary 号码,但您只允许数字0到9即0000 to 1001 anything 较高无效。即它是十进制的或"Binary coded Decimal".

在大多数C库中都有例程进行操作 BCD值,所以你可以 使用BCD编号字符串进行正常算术。

关于BCD的最佳方法是它易于使用 assembler or C 代码即,您可以轻松地使用库例程 翻译二进制数 它的BCD等效 - 相当快。由于MAX7219可以是 set to BCD decode mode you don'T需要弄清楚一个字符集 控制个人 LED patterns.

例如,当显示数字时,这将是有用的 on a frequency counter's 7 segment display.

笔记 :BCD解码 can be set-up for 单个7个段留下其余的余额,即未解码即 individual LED 控制。因此,可能使用可能有4位数 显示加上32个人 LED输出,或带有24个单独LED的5位数字显示器 outputs etc.

为什么 Does a MAX7219 保存处理时间(MIPS)

原因是显示刷新操作是 performed entirely 在MAX7219中。在里面 频率 counter 您可以在此网站上找到并制作 (参见链接),我使用了一种执行的直接驱动方法 与MAX7219完全一样 司机。唯一的区别是所有显示刷新 is done within the 需要中断的微控制器.i.e。它有了 update the display 速度超过20ms,可以看到一个未播放的显示。

笔记: Display refreshing also 要求您决定输出数据的时间(如何 much LED light is 输出)并且您通过所有8个数据输出循环 that ALL 7 segments 已在20ms内提供服务。有最多7219,它确实如此 all this for you.

使用MAX7219允许您在它中夹住一些数据 forget it - it 将始终显示数据,直到电源熄灭 it does not require 任何其他处理器输入或控制,直到您想要 change the data.

使用 the MAX7219 with 3V3 Arduinos

正如您从高于高于高于高于的规格 输入电压电平是 真的很高,即高于3.3V高输出水平的方式,所以a 3.3V Arduino needs a 级别转换器以驱动输入。低输入vil是 a standard level so 那不是问题!

7219使用可以在MHz的快速SPI接口 frequencies and you 可能想要以快速速度驱动它,具体取决于您的 项目,所以你需要一个 快速转换器和一些很慢。自水平以来 只需要转换 在一个方向上,一个解决方案是使用HCT 设备如74hct04 逆变器在5V下运行(只需使用两个逆变器正确 signal levels or 只接受倒置信号电平 - 改变它们 微控制器)或你 可以使用诸如74hct125等缓冲区。


Logic level
                conversion 3.3V to 5V

电压 analysis 从3V3 ATMEG328P(Arduino)到HCT设备


arduino.
outputs @3V3
3V3
levels

(V)
HCT.
inputs
TTL.
i/p

Levels

(V)
状况
for operation
vol 0.6(最大)

vil. 0.8(最大) ardvol.<HCTVil = True
voh. 2.3(分钟) VIH. 2.0(分钟) ardvoh.>HCTVih = True


电压 analysis 从HCT设备到MAX7219

HCT.


outputs @5V
5V

levels

(V)

MAX7219

5V


levels

(V)
状况
for operation
vol 0.1(最大)

vil. 0.8(最大) HCT. Vol.<7219Vil = True
voh. 4.4(分钟) VIH. 3.5(分钟) HCT. VOH.>7219Vil = True


因此,3V3系统可以与MAX7219接口:

arduino. 电压 levels

arduino. 电压电平(328p
datasheet)
范围

(v) 在vcc.
of 3.3V (V)
在vcc.
of 5V (V)
vil(max) 0.3 x vcc. 1.0(最大)(2.4V-5.5V) 1.5(最大)
vih(min) 0.6 x vcc. 2.0(分钟)(2.4V-5.5V)

3.0(分钟)
vol(max) - 0.6(最大) (3V,85 C) 0.9(最大)(85 C)
voh(min) - 2.3(分钟) (3V,85 C) 4.2(分钟) (85 C)


HCT. 电压电平

HCT. 电压电平
范围

在vcc.
of 5V (V)
vil(max) 0.8(最大)
vih(min) 2.0(分钟)
vol(max) 0.1(最大)(4.5V)
voh(min) 4.4(分钟)(4.5V)

上面的HCT级别的数据表源:

74hc_hct125.pdf.

来源:[nexperia.com]

其他 similar projects on this site:

引领 矩阵项目
- 不需要MAX7219 - 只是晶体管和4017 Johnson counter chip (即廉价的设备)。


新的! Comments

让你说到你刚刚阅读的东西!留下下面的框中的评论。



隐私政策 | 接触 | 关于我

网站地图 | 使用条款


 ezoic. 报告此广告

访问我们的Facebook页面:

   点击这里



最近的文章

  1. 如何使用ADS1115

    使用ADS1115精度16位ADC进行教程进行低功耗。

    阅读更多

  2. arduino. 模拟输出...易模拟输出生成

    arduino. 模拟输出:如何创建最精确的PWM模拟输出以及如何创建模拟PWM正弦波。

    阅读更多

  3. 数号和等效的快速宏。加快代码!

    了解DigitalWrite()的工作原理......现在使用17倍宏宏!

    阅读更多

  4. TCS230颜色传感芯片:如何运作以及如何使用它。

    如何使用TCS230(/ TCS3200)彩色检测器芯片并轻松将其添加到您的任何项目中。

    阅读更多

  5. 如何使用ADXL345进行运动感测等。

    使用ADXL345 Acellerometer,您可以检测到16G!您还可以了解如何使用它来点击检测等。

    阅读更多

  6. HMC5883L 3轴数字MAGENTOMTER如何运作

    HMC5883L - 如何制作数字罗盘,了解HMC5883L和QMC5883L之间的差异以及它们是否兼容。

    阅读更多



读者 Comments

"I wanted to thank
你这么好
对于所有信息
你已经提供了
你的网站's

高超 极好的."

- 逃亡Potthath.

"This site really is
最好的和我最喜欢的。
我发现这里有很多很有用
项目和提示。"

- 米兰

Bursach.<at>gmail.com<

"Awesome site,
非常,非常容易和好
导航!"


-
Matt_tr. <at>
wolf359.cjb.net.


学习微控制器

"Interested in
微控制器?"

注册
免费7天指南:

自由 GUIDE : CLICK HERE


"I am a newbie to PIC
我想说
 how great your
网站一直在为我。"


- 戴夫

de_scott.<at>bellsouth.net

"Your site is a great
和完美的工作。
恭喜。"


- SURESH.

IntegratedInfosys.<at>
Yahoo.com.

"I couldn't find the correct
要定义的词语
你的网页。

非常有用,揭开,
诚实明确。

非常感谢
你的时间和作品。
问候。 "


- Anon.

回到顶部