MAX7219 のテストは以前やりましたが、あの時は、配線が面倒だったので 7セグLED を1つだけ使いました。
しかし、桁が増えたときの接続を確認しないと、この先、モノが作れないので、今回、7セグLED を3つ使っての確認を行いました。
MAX7219 と、Arduino との接続は、前回と同じ。
- 5V と GND をそれぞれ接続
- DIN を 2番ピンに接続
- LOAD を 3番ピンに接続
- CLK を 4番ピンに接続
MAX7219 と 7セグLED (DIG_0、DIG_1、DIG_2) との接続は...
- DIG_0 のコモンカソードを MAX7219 の 2番ピン(DIG 0)へ
- DIG_1 のコモンカソードは、11番ピン(DIG 1)。DIG_2 のコモンカソードは、6番ピン(DIG 2)へ
- DIG_0、DIG_1、DIG_2 のセグメントA 端子は、まとめて MAX7219 の 14番ピン(SEG A)へ
- DIG_0、DIG_1、DIG_2 のセグメントB 端子は、まとめて MAX7219 の 16番ピン(SEG B)へ
- 以降、同様にセグメント C~G、DP を接続。
I_SET 端子に接続する抵抗値は、前回同様 100kΩ にしました。
点灯用のプログラムですが。
MAX7219 は、7セグLEDで使い易いようになっているので...各桁(LED8個)毎に値を記憶します。なので、明示的な消灯が必要になる場合と、ならない場合あり。
例えば、LED0~LED16 があって、それぞれ8個毎に DIG0、DIG1 として接続し、それぞれの LED を1個づつ順に点灯させたい場合...
LED6 を消灯して、LED7 を点灯させる時には、LED6 の明示的な消灯は必要なく、命令は 1行で済みますが、LED7 を消灯して、LED8 を点灯さえる場合、LED7 の消灯を命令する必要があります。
まあ、LED7 は DIG0、LED8 は DIG1 なので、それぞれ DATA を送る必要がありますよ...って言いたいダケですが。
スケッチは、前回とほぼ同じ。
初期化周りでは、LEDの桁数が増えた事で [Scan Limit] の値が 0 から 2 になっているのみ。
//----------------------------------------------------- // MAX7219 のテスト // //----------------------------------------------------- // MAX7219 REGISTER ADDRESS MAP #define REG_NO-OP 0x00 #define REG_DIG_0 0x01 #define REG_DIG_1 0x02 #define REG_DIG_2 0x03 #define REG_DIG_3 0x04 #define REG_DIG_4 0x05 #define REG_DIG_5 0x06 #define REG_DIG_6 0x07 #define REG_DIG_7 0x08 #define REG_DECODEMODE 0x09 #define REG_INTENSITY 0x0A #define REG_SCANLIMIT 0x0B #define REG_SHUTDOWN 0x0C #define REG_DISPLAYTEST 0x0F // MAX7219 DATA #define SEG_DP 0x80 #define SEG_A 0x40 #define SEG_B 0x20 #define SEG_C 0x10 #define SEG_D 0x08 #define SEG_E 0x04 #define SEG_F 0x02 #define SEG_G 0x01 // MAX7219 PIN at Arduino int DIN = 2; // DATA IN int LOAD = 3; // LATCH int CLK = 4; // CLOCK //----------------------------------------------------- // 初期化 // //----------------------------------------------------- void setup() { pinMode(DIN, OUTPUT); pinMode(LOAD, OUTPUT); pinMode(CLK, OUTPUT); // Scan Limit MAX7219_SendData(REG_SCANLIMIT, 2); // 2: Display digit 0, 1, 2 // Decode Mode MAX7219_SendData(REG_DECODEMODE, 0); // 0: No decode for digits 7–0 // Intensity MAX7219_SendData(REG_INTENSITY, 0x07); // 7: Duty Cycle 15/32 // Shutdown Mode MAX7219_SendData(REG_SHUTDOWN, 1); // 1: Normal Operation. // Display Test MAX7219_SendData(REG_DISPLAYTEST, 0); // 0: Normal Operation. } //----------------------------------------------------- // メイン // //----------------------------------------------------- void loop() { unsigned char ucDIG; int cx; MAX7219_SendData(REG_DIG_0, 0x0); // DIG 0 off MAX7219_SendData(REG_DIG_1, 0x0); // DIG 1 off MAX7219_SendData(REG_DIG_2, 0x0); // DIG 2 off delay(1000); for(cx = 0; cx < 3; cx++){ switch(cx){ default: case 0: ucDIG = REG_DIG_0; break; case 1: ucDIG = REG_DIG_1; break; case 2: ucDIG = REG_DIG_2; break; } MAX7219_SendData(ucDIG, (SEG_B | SEG_C)); // 1 delay(200); MAX7219_SendData(ucDIG, (SEG_A | SEG_B | SEG_D | SEG_E | SEG_G)); // 2 delay(200); MAX7219_SendData(ucDIG, (SEG_A | SEG_B | SEG_C | SEG_D | SEG_G)); // 3 delay(200); MAX7219_SendData(ucDIG, (SEG_B | SEG_C | SEG_F | SEG_G)); // 4 delay(200); MAX7219_SendData(ucDIG, (SEG_A | SEG_C | SEG_D | SEG_F | SEG_G)); // 5 delay(200); } MAX7219_SendData(REG_DIG_0, 0x0); // DIG 0 MAX7219_SendData(REG_DIG_1, 0x0); // DIG 1 MAX7219_SendData(REG_DIG_2, 0x0); // DIG 2 delay(200); //----- cx = 3; while(cx--){ MAX7219_SendData(REG_DIG_0, 0x0); MAX7219_SendData(REG_DIG_1, 0x0); MAX7219_SendData(REG_DIG_2, SEG_A); delay(100); MAX7219_SendData(REG_DIG_0, 0x0); MAX7219_SendData(REG_DIG_1, SEG_A); MAX7219_SendData(REG_DIG_2, 0x0); delay(100); MAX7219_SendData(REG_DIG_0, SEG_A); MAX7219_SendData(REG_DIG_1, 0x0); MAX7219_SendData(REG_DIG_2, 0x0); delay(100); MAX7219_SendData(REG_DIG_0, SEG_B); delay(100); MAX7219_SendData(REG_DIG_0, SEG_C); delay(100); MAX7219_SendData(REG_DIG_0, SEG_D); delay(100); MAX7219_SendData(REG_DIG_0, 0x0); MAX7219_SendData(REG_DIG_1, SEG_D); delay(100); MAX7219_SendData(REG_DIG_1, 0x0); MAX7219_SendData(REG_DIG_2, SEG_D); delay(100); MAX7219_SendData(REG_DIG_2, SEG_E); delay(100); MAX7219_SendData(REG_DIG_2, SEG_F); delay(100); } } //----------------------------------------------------- // MAX7219 の DIN へデータ (16bit) を送る // void MAX7219_SendData(unsigned char regAddress, unsigned char data) { digitalWrite(LOAD, LOW); regAddress &= 0x0F; shiftOut(DIN, CLK, MSBFIRST, regAddress); shiftOut(DIN, CLK, MSBFIRST, data); digitalWrite(LOAD, HIGH); }