2010-02-27

MAX7219 動作テスト (7セグLED 3桁)

MAX7219 のテストは以前やりましたが、あの時は、配線が面倒だったので 7セグLED を1つだけ使いました。
しかし、桁が増えたときの接続を確認しないと、この先、モノが作れないので、今回、7セグLED を3つ使っての確認を行いました。

MAX7219 と、Arduino との接続は、前回と同じ。

  • 5V と GND をそれぞれ接続
  • DIN を 2番ピンに接続
  • LOAD を 3番ピンに接続
  • CLK を 4番ピンに接続
の計 5本です。
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);
}