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


今回はカソードコモンの8セグメントLED専用ドライバーのMAX7221を 使って8セグメントLEDを表示する方法を紹介します。
MAX7221は前回紹介したMAX7219にハードウェアSPIの機能を追 加したチッ プ です。
また、MAX7219とは輝度のDUTY CYCLEが微妙に変わっています。

このチップもMAX7219と同様に、カソードコモンの8セグメントLED専用で、電流制限機能を持っていますので、電流制限用の抵抗はまったく 必要ありません。
また各LEDのON/OFFはチップ内のトランジスタが高速で行いますので、チラつきも無く非常に綺麗な表示です。
表示可能な最大桁数はMAX7219と同じ8桁です。
こちらもMAX7219と同様に桁数の多い8セグメントLEDや、8x8のマトリックスLEDを使うためには非常に便利なチップですが、国内では あまり流通していないようです。


このチップは2通りのI/Fで通信が可能です。
1.MAX7219と同じソフトウェアSPIを使って通信する
2.ハードウェアSPIを使って通信する
MAX7219と同じソフトウェアSPIを使って、通信を行う場合、結線、ソースコードはMAX7219とまったく同じです。
ハードウェアSPIを使う場合の結線は以下の通りです。
赤字の部分だけがMAX7219と異なります。

18番ピン(ISET)と3.3Vの間には、電流制限用の抵抗を挟んで使用します。
使用する抵抗値はデータシートを参照してください。
私は68KΩの抵抗を使いましたので、LEDには5V 10mAぐらいが流れるはずです。
MAX7219のピン番号 LEDへの接続(ピン番号) Raspberryへの接続(ピン番号)
1(DIN)
19(GPIO10) SPIO MOSI
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(CS)
24(GPIO24) SPIO CE0
13(CLK)
23(GPIO11) SPIO SCLK
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+)
3.3V
20(SEG C) Segment c
21(SEG E) Segment e
22(SEG DP) Segment D.P
23(SEG D) Segment d
24(DOUT)


SPI I/Fを使う場合は、raspi-configでSPIを有効にする必要があります。
SPI I/Fでのソースコードは以下の通りです。
/*
 max7221.c
 Raspberry Pi driving the Max7221
 to compile : gcc max7221.c -o max7221 -lwiringPi
*/

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <wiringPi.h>
#include <wiringPiSPI.h>

// The Max7221 Registers :

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

#define NLEDS           4       // Number of Digits
#define SPI_CHANNEL     0       //


// Take a reg numer and data and send to the max7221
//
// reg_number : Register Address of max7221 (0x00-0x0f See datasheet)
// dataout    : Send Data
//
static void MAX7221Send (unsigned char reg_number, unsigned char dataout)
{
  unsigned char data[2];
  int retCode;

  data[0]=reg_number;
  data[1]=dataout;

  retCode=wiringPiSPIDataRW (SPI_CHANNEL,data,sizeof(data));
}


void displayNumber(int digit, uint32_t number) {
  int i;
  uint8_t data;

  uint32_t num = number;
  for(i=0;i<digit;i++) {
    data = num % 10;
//    printf("data[%d]=%d ",i,data);
    MAX7221Send(i+1 ,data);     // displays the 1 digit number
    num = num / 10;
  }
//  printf("\n");
}


int main (void)
{
  int i,j;
  int retCode;

  printf ("\n\nRaspberry Pi Max7221 Test using WiringPi\n\n");

  if (wiringPiSPISetup(SPI_CHANNEL, 1000000) < 0) {
        printf("SPISetup failed:\n");
  }

  MAX7221Send(SCAN_LIMIT, NLEDS-1);


/*
 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 ' '
*/

  MAX7221Send(DECODE_MODE, 0xff); // Set BCD decode mode on
  MAX7221Send(DISPLAY_TEST, 0); // Disable test mode
  MAX7221Send(SHUTDOWN, 1);     // come out of shutdown mode(turn on the digits)

  for(i=0;i<NLEDS;i++) {
    MAX7221Send(i+1 ,i);
  }

  for(i=0;i<5;i++){
    MAX7221Send(INTENSITY, i);  // set brightness
    sleep(1);
  }

  for(i=0;i<16;i++) {
    for(j=0;j<NLEDS;j++) {
      MAX7221Send(j+1,i);       // displays the 4 digit number
    }
    delay(500);
  }

  for(i=0;i<1000;i++) {
    displayNumber(NLEDS, i);
    delay(100);
  }

  return 0;
}

結果はMAX7219と全く同じになります。


このドライバーも8桁のLEDを表示することができます。
4桁のLEDを2つ使った時の結果も、MAX7219と同じです。


次回はカソードコモンの8セグメントLED専用ドライバーのMC14489を 紹介します。