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


今回はカソードコモンの7セグメントLED専用ドライバーのCD4543Bを使っ て8セグメントLEDを表示する方法を紹介します。
7セグメントLED専用ドライバーなので、D.P(小数点)を点滅させることはできません。
写真のように非常に小さなチップです。
このチップは「BCD-to-7-Segment Latch/Decoder/Driver」と呼ばれるもので
同じ動作をするチップは沢山ありますが、国内ではあまり流通していないようです。


CD4543B
CD4543B

結線は以下の通りです。
0-9の値をA、B、C、Dの4ビットで入力すると、対応するセグメントに電流を流してくれます。
例えばA、B、C、Dを全てLOWにすると、SegmentG以外が点灯します。
データシートによると、VDDは3V以上となっていますが2Vでも動いています。
VDDにLEDの定格電圧(2V)を与えると、各セグメントにはそのまま出力してくれるので、抵抗も1個で済みます。
データシートを見ると1,2,3,4,5番の入力ピンの最高電圧は(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)
LEDの定格電圧(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)Blanking=3.3V、 (NOT)LampTest=3.3Vにする必要があります。
チップによって、LatchDisable/LatchEnable  Blanking/NotBlanking  Phase/NotLampTest など、ピンの動作(GNDでON/3.3VでON)が違うので注意が必要です。




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

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

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

こちらではアノードコモンの8セグメントLEDを紹介しています。