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);
}
