アノードコモンの8セグメントLEDへ表示する(SN74LS47を使う)


今回はアノードコモンの7セグメントLED専用ドライバーのSN74LS47(覚 えにくい型番です)を 使って8セグメントLEDを表示する方法を紹介します。
7セグメントLED専用ドライバーなので、D.P(小数点)を点滅させることはできません。

SN74LS47

SN74LS47
SN74LS47

このチップもCD4543Bと同じく「BCD-to-7-Segment Latch/Decoder/Driver」と呼ばれるもので、CD4543Bとは逆の動作をします。
CD4543B(カソードコモン用)
A、B、C、Dを全て0Vにすると、SegmentG以外に電流が流れる→SegmentG以外のLEDが点灯する→結果「0」が表示される。
SN74LS47(アノードコモン用)
A、B、C、Dを全て0Vにすると、SegmentGに電流が流れる→SegmentGのLEDが消灯する→結果「0」が表示される。

データシートを見るとVCCは4.5Vから5.5Vとなっていますが、3.3Vでも動いています。

SN74LS47のピン番号 LEDへの接続(ピン番号) Raspberryへの接続(ピン番号)
1(BCD INPUT B)
13(GPIO27)
2(BCD INPUT C)
12(GPIO18)
3(LT)
3.3V
4(BI/RBO)
3.3V
5(RBI)
3.3V
6(BCD INPUT D)
15(GPIO22)
7(BCD INPUT A)
11(GPIO17)
8(GND)
GND
9(OUTPUT E) Segment e
10(OUTPUT D) Segment d
11(OUTPUT C) Segment c
12(OUTPUT B) Segment b
13(OUTPUT A) Segment a
14(OUTPUT G) Segment g
15(OUTPUT F) Segment f
16(VCC)
3.3V

このチップは7セグメントLED専用で、Segment制御しかできません。
従って複数桁のLEDを使う場合、桁の制御は独自に行う必要があります。
桁の制御としては以下のピンを使います。

LEDへの接続(ピン番号) Raspberryへの接続(ピン番号)
Digit 3 Common 24(GPIO8)
Digit 2 Common 26(GPIO7)
Digit 1 Common 19(GPIO10)

ソースコードは以下の通りです。

/*

 sn74ls47.c

 Raspberry Pi driving the SN74LS47

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

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

#define Pins    4
#define P0      0
#define Digs    3
#define D0      10

DisplayDigits (char* digits)
{
    int i;
    uint8_t digit, bcd, mask ;
    uint8_t index, d ;

    for (digit = 0 ; digit < Digs; ++digit) {
      d = toupper (digits [digit]) ;
      if ((d >= '0') && (d <= '9'))        // Digit
      index = d - '0' ;
      else
      index = 0xf ;                // Blank

      mask = 1;
      for (bcd = 0 ; bcd < 4 ; bcd++) {
        if (index & mask)
      digitalWrite (P0 + bcd, 1) ;
        else
      digitalWrite (P0 + bcd, 0) ;
        mask = mask << 1 ;
      }
      digitalWrite (D0 + digit, 1) ;
      delay(1);
      digitalWrite (D0 + digit, 0) ;
    }
}

int main (void)
{
    int i;
    char digits [8] ;

    if(wiringPiSetup() == -1) return 1;
    for(i=0;i<Pins;i++) {
        pinMode(P0+i, OUTPUT);
        digitalWrite(P0+i, 0);
    }
    for(i=0;i<Digs;i++) {
        pinMode(D0+i, OUTPUT);
        digitalWrite(D0+i, 0);
    }

    strcpy(digits,"123");
    for(i=0;i<3000;i++) DisplayDigits(digits);

    strcpy(digits,"789");
    for(i=0;i<3000;i++) DisplayDigits(digits);

    for(i=0;i<Pins;i++) {
        digitalWrite(P0+i, 0);
    }
    for(i=0;i<Digs;i++) {
        digitalWrite(D0+i, 0);
    }
    exit;
}

カソードコモンに続いて、アノードコモンの8セグメントLEDでずいぶん楽しめましたが、
LEDと一緒に使えそうなチップは一通り試したようなので、このシリーズは今回で終わりの予定で す。
以下にチップと必要なGPIOの数、必要な抵抗の数をまとめます。


必要なGPIOの数 表示できる最大桁数 必要な抵抗の数
専用チップを使わない場合 8本+桁数 8桁(※)
桁数
TLC5940(LED用PWMドライバー) 6本+桁数 8桁(※) 1本+桁数
DM13A(定電流LEDドライバー) 4本+桁数 8桁(※) 1本+桁数
SN74LS47 4本+桁数 8桁(※) 桁数
(※)最大桁数に制限はありませんが、8桁以上のセグメントLEDを見たことがないので8桁としています。

色々試しましたが、アノードコモンの8セグメントLEDと一緒に使うチップとしては、あまりお勧めできるものがありません。
専用チップといえるのはSN74LS47ぐらいしか見つけられませんでした。

8セグメントLEDを使う場合、回路の複雑さなども考えると、個人的なお勧めは以下となります。
・とにかく簡単に使いたいときは、アノードコモンの8セグメントLEDを素で使う。(抵抗が桁数分だけの簡単回路)
・とにかくGPIOを空けたいときは、カソードコモンの8セグメントLED+MAXシリーズ。(GPIOたったの3本。しかも輝度調整機能付き)