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


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





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

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

74LS47のピン番号 LEDへの接続(ピン番号) Raspberryへの接続(ピン番号)
1(BCD INPUT B)
12(GPIO18)
2(BCD INPUT C)
13(GPIO27)
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を使う場合、桁の制御は独自に行う必要があります。
桁の制御としては以下のピンを使います。
いずれのピンも電流制限用に100オームの抵抗を挟んでいます。
LEDへの接続(ピン番号) Raspberryへの接続(ピン番号)
Digit 3 Common 100Ω抵抗-24(GPIO8)
Digit 2 Common 100Ω抵抗-26(GPIO7)
Digit 1 Common 100Ω抵抗-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;
}

74シリーズのドライバーチップの種類については、こちらに大変詳しく記 載されています。
一番上の写真には74LS47と74LS247が写っています。
今まで違いが判らなかったのですが、47と247は「6」の文字と「9」の文字のフォント違いだそうです。

左 74LS247  右 74LS47





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


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

色々試しましたが、アノードコモンの8セグメントLEDと一緒に使うチップには、決定的なチップがありません。