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


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

CD4543B

CD4543B
CD4543B

写真のように非常に小さなチップです。
このチップは「BCD-to-7-Segment Latch/Decoder/Driver」と呼ばれるもので
同じ動作をするチップはTexas Instruments社のものだけでも沢山ありますが、
国内ではあまり流通していないようです。 結線は以下の通りです。
0-9の値をA、B、C、Dの4ビットで入力すると、対応するセグメントに電流を流してくれます。
例えばA、B、C、Dを全て0Vにすると、SegmentG以外が点灯します。
VDDにLEDの定格電圧(2V)を与えると、そのまま出力してくれるので、抵抗も1個で済みます。
DataSheetを見ると1,2,3,4,5番の入力ピンの電圧は-0.5Vから(VDD+0.5V)となっているので、
VDDに2V、1,2,3,4,5番ピンに3.3Vはヤバイかなと思ったんですが動いています。

CD4543Bのピン番号 LEDへの接続(ピン番号) Raspberryへの接続(ピン番号)
1(LATCH DISABLE)
3.3V
2(BCD INPUT C)
13(GPIO27)
3(BCD INPUT B)
12(GPIO18)
4(BCD INPUT D)
15(GPIO22)
5(BCD INPUT A)
11(GPIO17)
6(PHASE)
GND
7(BLANKING)
GND
8(VSS)
GND
9(OUTPUT A) Segment a
10(OUTPUT B) Segment b
11(OUTPUT C) Segment c
12(OUTPUT D) Segment d
13(OUTPUT E) Segment e
14(OUTPUT G) Segment g
15(OUTPUT F) Segment f
16(VDD)
100Ωの抵抗を介して3.3V

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

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

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

/*

 cd4543.c

 Raspberry Pi driving the CD4543

 to compile : cc cd4543.c -o cd4543 -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) {
      digitalWrite (D0 + digit, 0) ;
      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) ;
    }
}

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, 1);
    }
    for(i=0;i<Digs;i++) {
      pinMode(D0+i, OUTPUT);
      digitalWrite(D0+i, 1);
    }

    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, 1);
    }
    for(i=0;i<Digs;i++) {
      digitalWrite(D0+i, 1);
    }
    exit;
}

CD4511Bで も 同様の動きをしますが、CD4511Bの場合はLatchEnable=GND、(NOT)Blanling=3.3V、 (NOT)LampTest=3.3Vにする必要があります。
チップによって、LatchDisable/LatchEnable  Blanking/Not_Blanking  Phase/Not_LampTest など、ピンの動作(GNDでON/3.3VでON)が違うので注意が必要です。
CD4511B


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


必要なGPIOの数 表示できる最大桁数 必要な抵抗の数
専用チップを使わない場合 8本+桁数 8桁(※)
8本
シフトレジスタ 3本 8桁(※) 8本
MAX7219 3本 8桁 1本
MAX7221 3本 8桁 1本
MC14489 3本 5桁 1本
CD4543Bなど 4本+桁数 8桁(※) 1本
(※)最大桁数に制限はありませんが、8桁以上のセグメントLEDを見たことがないので8桁としています。

色々試しましたが、カソードコモンの8セグメントLEDと一緒に使うチップとしては、
3本のGPIOと1個の抵抗だけで8桁まで表示できて、輝度まで変えることができるMAX7219/MAX7221が 最強だと思います。

アノードコモンの8セグメントLEDに続く....