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


今回はカソードコモンの8セグメントLED専用ドライバーのMC14489を 使って8セグメントLEDを表示する方法を紹介します。
このチップもカソードコモンの8セグメントLED専用で、電流制限機能を持っていますので、電流制限用の抵抗はまったく必要ありません。
また各LEDのON/OFFはチップ内のトランジスタが高速で行いますので、チラつきも無く非常に綺麗な表示です。
表示可能な最大桁数は5桁(ちょっと中途半端)です。
こ ちらのページで使い方が紹介されています。


MC14489
MC14489

結線は以下の通りです。
8番ピン(Rx)とGNDの間には、電流制限用の抵抗を挟んで使用します。
使用する抵抗値はデータシートを参照してください。
私は32KΩの抵抗を使いましたが、LEDにはIf=12mAぐらいが流れるはずです。
3桁のLEDを使う場合は、BANK3、BANK4、BANK5を使います。
もし、4桁のLEDを使う場合は、BANK2、BANK3、BANK4、BANK5を使ってください。

MC14489のピン番号 LEDへの接続(ピン番号) Raspberryへの接続(ピン番号)
1(SEG F) Segment f
2(SEG E) Segment e
3(VDD)
5V
4(DEG D) Segment d
5(SEG C) Segment c
6(SEG B) Segment b
7(SEG A) Segment a
8(Rx)
33KΩの抵抗を介してGNDに接続
9(BANK1)

10(ENABLE)
13(GPIO27)
11(CLOCK)
12(GPIO18)
12(DATA IN)
11(GPIO17)
13(BANK2)

14(VSS)
GND
15(BANK3) Digit1 Common
16(BANK4) Digit2 Common
17(BANK5) Digit3 Common
18(DATA OUT)

19(SEG H) Segment D.P
20(SEG G) Segment g

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

/*
 mc14489.c
 Raspberry Pi driving the MC14489
 to compile : cc mc14489.c -o mc14489 -lwiringPi
*/

#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>
#include <wiringShift.h>

#define    DATA    0
#define    CLOCK    1
#define    ENABLE    2

void displayON() {
  digitalWrite(ENABLE,LOW);
  shiftOut(DATA,CLOCK,MSBFIRST,0x01);    // HEX DECODE ALL BANK
  digitalWrite(ENABLE,HIGH);
  delay(10);
}

void displayOFF() {
  digitalWrite(ENABLE,LOW);
  shiftOut(DATA,CLOCK,MSBFIRST,0xff);    // SPECIAL DECODE ALL BANK
  digitalWrite(ENABLE,HIGH);
  delay(10);
  digitalWrite(ENABLE,LOW);
  shiftOut(DATA,CLOCK,MSBFIRST,0x00);
  shiftOut(DATA,CLOCK,MSBFIRST,0x00);
  shiftOut(DATA,CLOCK,MSBFIRST,0x00);
  digitalWrite(ENABLE,HIGH);
  delay(10);
}

uint8_t convertDigit(char digit) {
  uint8_t d0;
  d0 = toupper (digit) ;
  if ((d0 >= '0') && (d0 <= '9'))        // Digit
    d0 = d0 - '0' ;
  else if ((d0 >= 'A') && (d0 <= 'F'))   // Hex
    d0 = d0 - 'A' + 10 ;
  return(d0);
}

void displayDigits(int mode, char* digits) {
  int i;
  uint8_t data[3];
  uint8_t index;
  uint8_t d[5];
 
  for(i=0;i<5;i++) {
    d[i] = convertDigit (digits[i]) ;
  }

  data[0]=0x00;            // DIM LED
  if(mode == 1) data[0]=0x08;    // BRIGHTEN LED
  data[0]=(data[0] << 4) + d[4];
  data[1]=(d[3] << 4) + d[2];
  data[2]=(d[1] << 4) + d[0];

  digitalWrite(ENABLE,LOW);
  shiftOut(DATA,CLOCK,MSBFIRST,data[0]);
  shiftOut(DATA,CLOCK,MSBFIRST,data[1]);
  shiftOut(DATA,CLOCK,MSBFIRST,data[2]);
  digitalWrite(ENABLE,HIGH);
  delay(10);
 
}


int main (int argc, char **argv) {

  if(wiringPiSetup() == -1) return 1;
  pinMode(DATA, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  pinMode(ENABLE, OUTPUT);
  digitalWrite(DATA,LOW);
  digitalWrite(CLOCK,LOW);
  digitalWrite(ENABLE,LOW);
 

  displayON();

  displayDigits(0,"00123");
  getchar();
  displayDigits(1,"00123");
  getchar();
  displayDigits(0,"00789");
  getchar();
  displayDigits(1,"00789");
  getchar();
  displayDigits(0,"00abc");
  getchar();
  displayDigits(1,"00abc");
  getchar();

  displayOFF();
  exit;
}

次回は汎用LEDドライバーのHT16K33を紹介します。