カソードコモンの8セグメントLEDへ表示する(MAX7219を使う)


今回はカソードコモンの8セグメントLED専用ドライバーのMAX7219を 使って8セグメントLEDを表示する方法を紹介します。
以下のページで使い方が紹介されています。
http://www.raspberrypi.org/forums/viewtopic.php?f=63&t=67382


MAX7219
動作結果

結線は以下の通りです。
このチップはカソードコモンの8セグメントLED専用なので、電流制限用の抵抗はまったく必要ありません。
また各LEDのON/OFFはチップ内のトランジスタが高速で行いますので、チラつきも無く非常に綺麗な表示です。
表示可能な最大桁数は8桁です。
8桁のLEDに表示するためには、桁制御用に8個、セグメント制御用に8個の合計16個のGPIO(TypeBの場合、ほぼ全てのGPIO)が必 要になりますが
このチップを使えば3個のGPIOで済みます。
桁数の多い8セグメントLEDを使うためには非常に便利なチップですが、国内ではあまり流通していないようです。

18番ピン(ISET)と3.3Vの間には、電流制限用の抵抗を挟んで使用します。
使用する抵抗値はデータシートを参照してください。
私は68KΩの抵抗を使いましたが、LEDにはIf=10mAぐらいが流れるはずです。

MAX7219のピン番号 LEDへの接続(ピン番号) Raspberryへの接続(ピン番号)
1(DIN)
11(GPIO17)
2(DIG 0) Digit1 Common
3(DIG 4)

4(GND)
GND
5(DIG 6)

6(DIG 2) Digit3 Common
7(DIG 3)

8(DIF 7)

9(GND)
GND
10(DIG 5)

11(DIG 1) Digit2 Common
12(LOAD)
13(GPIO27)
13(CLK)
12(GPIO18)
14(SEG A) Segment a
15(SEG F) Segment f
16(SEG B) Segment b
17(SEG G) Segment g
18(ISET)
68KΩの抵抗を介して3.3Vに接続
19(V+)
5V
20(SEG C) Segment c
21(SEG E) Segment e
22(SEG DP)
Segment D.P
23(SEG D) Segment d
24(DOUT)


ソースコードはほぼこ のページのままです。
変えたのは赤字の箇所だけです。

/*

 max7219.c
 
 Raspberry Pi driving the Max7219

 to compile : cc max7219.c -o max7219 -lwiringPi


*/
 
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>


// define our pins :

#define DATA        0    // GPIO 17 header pin 11
#define CLOCK     1    // GPIO 18 header pin 12
#define LOAD        2    // GPIO 27 header pin 13


// The Max7219 Registers :

#define DECODE_MODE   0x09                      
#define INTENSITY     0x0a                       
#define SCAN_LIMIT    0x0b                       
#define SHUTDOWN      0x0c                       
#define DISPLAY_TEST  0x0f                        



static void Send16bits (unsigned short output)
{
  
  unsigned char i;

  for (i=16; i>0; i--)
  {
    unsigned short mask = 1 << (i - 1); // calculate bitmask
 
    digitalWrite(CLOCK, 0);  // set clock to 0
   
    // Send one bit on the data pin
   
    if (output & mask)  
      digitalWrite(DATA, 1);         
    else                             
      digitalWrite(DATA, 0); 
      
    digitalWrite(CLOCK, 1);  // set clock to 1
     
  }

}


// Take a reg number and data and send to the max7219
//
// reg_number : Register Address of max7219 (0x00-0x0f See datasheet)
// dataout    : Send Data
//

static void MAX7219Send (unsigned char reg_number, unsigned char dataout)
{
  digitalWrite(LOAD, 1);  // set LOAD 1 to start
  Send16bits((reg_number << 8) + dataout);   // send 16 bits ( reg number + dataout )
  digitalWrite(LOAD, 0);  // LOAD 0 to latch
  digitalWrite(LOAD, 1);  // set LOAD 1 to finish
}




int main (void)
{
  int i,j;
  
  printf ("\n\nRaspberry Pi Max7219 Test using WiringPi\n\n");

  if (wiringPiSetup () == -1) exit (1) ;

  //We need 3 output pins to control the Max7219: Data, Clock and Load

  pinMode(DATA, OUTPUT); 
  pinMode(CLOCK, OUTPUT);
  pinMode(LOAD, OUTPUT); 
  
  MAX7219Send(SCAN_LIMIT,  2);     // set up to scan three digits
//  MAX7219Send(SCAN_LIMIT, 7);     // set up to scan all eight digits


/*

 BCD decode mode off : data bits correspond to the segments (A-G and DP) of the seven segment display.

 BCD mode on :  0 to 15 =  0 to 9, -, E, H, L, P, and ' '
  
*/

  MAX7219Send(DECODE_MODE, 15);   // Set BCD decode mode on
 
  MAX7219Send(DISPLAY_TEST, 0);  // Disable test mode

  MAX7219Send(SHUTDOWN, 1);      // come out of shutdown mode   / turn on the digits

  MAX7219Send(1,0);        // displays the number 0 on digit 0
  MAX7219Send(2,1);        // displays the number 1 on digit 1
  MAX7219Send(3,2);        // displays the number 2 on digit 2
  for(i=0;i<5;i++){
    MAX7219Send(INTENSITY, i);  // set brightness
    sleep(2);
  }
    
  for(i=0;i<16;i++) {            // display BCD code
    for(j=0;j<3;j++) {           // display digit
      MAX7219Send(j+1,i);  // displays the 3 digit number
      sleep(1);
    }
  }

  return 0;
}

実行すると最初に「000」を表示し、輝度が0から4に変化します。
INTENSITY(輝度)をあまりあげすぎると、電流が増えすぎてLED側が追従できなくなります。
その後「000」→「100」→「110」の様に1桁ずつ表示を変化させていきます。
0-9以外に「-HELP」の5文字とブランクを表示することができます。

次回は同じMAXシリーズのSPI-IFのチップを紹介します。