Project 16.2 4桁7セグメントLED/4-Digit 7-Segment Display

前回は7セグメントディスプレイをシフトレジスタ『74HC595』を使用して制御しました。

あわせて読みたい
Project 16.1 7セグメントLED/7-Segment Display 前回はシフトレジスター『74HC595』の使用方法を学びました。 https://kaneshige.org/?p=427 今回はシフトレジスターを使用して7セグメントディスプレイで0~Fまで表示...

今回はパワーアップして4つの7セグディスプレイをコントロールしてみます。

目次

4桁7セグメントディスプレイ

4桁7セグメントディスプレイは、4つの7セグメントディスプレイを1つのモジュールに統合したものです。そのため、より多くの文字を表示することができます。内蔵されたすべてのLEDは、共通のアノードと個別のカソードを持っています。内部構造とピン配置図は以下の通りです。

7セグメントディスプレイの内部電子回路は次の図のようになっています。各7セグメントディスプレイの8つのLEDカソードピンはすべて接続されています。

4桁7セグメントディスプレイの表示方法は、1桁の7セグメントディスプレイと似ています。異なる点は、4桁表示では各桁が順番に、一度に一桁ずつ表示されるということです。表示の仕組みは、最初に表示したい桁の共通端にHIGHレベルを出力し、他の3つの共通端にはLOWレベルを出力します。それから、表示したい桁の8つのLEDカソードピンに内容を送ります。このとき、先頭の桁の7セグメントディスプレイに内容が表示され、残りの3つはOFFになります。同様に、2番目、3番目、4番目の7セグメントディスプレイにも順番に内容表示を行います。4つの数字が個別に順番に表示されますが、この過程が非常に速いため、人間の目では認識できません。これは、光の残像効果および人間の目の残像現象によるものです。このようにして、4つの数字を同時に見ることができます。しかし、もし各数字をより長い間表示すると、数字が個別に表示されていることが認識できるようになります。

回路図

接続図

動作デモ

動画ではチラチラしているように見えますが、肉眼ではチラつきを感じず、全てが同時に点灯しているように見えると思います。

コード

/**********************************************************************
  Filename    : 4 Digital 7 Segment Display
  Description : Use 74HC595 to drive the digital display
  Auther      : www.freenove.com
  Modification: 2022/10/24
**********************************************************************/
int latchPin = 39;           // Pin connected to ST_CP of 74HC595(Pin12)
int clockPin = 40;           // Pin connected to SH_CP of 74HC595(Pin11)
int dataPin  = 38;           // Pin connected to DS of 74HC595(Pin14)
int comPin[] = {21,47,35,36};// Common pin (anode) of 4 digit 7-segment display

// Define the encoding of characters 0-F of the common-anode 7-Segment Display
byte num[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
              0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};
              
void setup() {
  // set pins to output
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  for (int i = 0; i < 4; i++) {
    pinMode(comPin[i], OUTPUT);
  }
}

void loop() {
  for (int i = 0; i < 4; i++) {
    // Select a single 7-segment display
    electDigitalDisplay (i);
    // Send data to 74HC595
    writeData(num[i]);
    delay(5);
    // Clear the display content
    writeData(0xff);
  }
}

void electDigitalDisplay(byte com) {
  // Close all single 7-segment display
  for (int i = 0; i < 4; i++) {
    digitalWrite(comPin[i], LOW);
  }
  // Open the selected single 7-segment display
  digitalWrite(comPin[com], HIGH);
}

void writeData(int value) {
  // Make latchPin output low level
  digitalWrite(latchPin, LOW);
  // Send serial data to 74HC595
  shiftOut(dataPin, clockPin, LSBFIRST, value);  // Make latchPin output high level
// Make latchPin output high level, then 74HC595 will update data to parallel output
  digitalWrite(latchPin, HIGH);
}

メインループを見てみましょう。
全体をforループで囲っています。これは『7セグディスプレイ4つ分の処理を行う』という状況です。それぞれの7セグディスプレイに対して選択、書き込み、クリアと処理しています。

void loop() {
  for (int i = 0; i < 4; i++) {
    // Select a single 7-segment display
    electDigitalDisplay (i);
    // Send data to 74HC595
    writeData(num[i]);
    delay(5);
    // Clear the display content
    writeData(0xff);
  }
}

次にelectDigitalDisplay()関数を見てみましょう。
最初にforが4回まわっていますね。そして4つのcomPin(共通ピン)をLOWに設定しています。
次に選択された共通ピンをHIGHにしています。これで該当の7セグディスプレイを使用可能な状態にしました。

void electDigitalDisplay(byte com) {
  // Close all single 7-segment display
  for (int i = 0; i < 4; i++) {
    digitalWrite(comPin[i], LOW);
  }
  // Open the selected single 7-segment display
  digitalWrite(comPin[com], HIGH);
}

writeData()関数についてはこれまでと同様ですね。シフトレジスタにデータを書き込んでいます。

いかがだったでしょうか?人間の目の残像を利用するというとてもアナログな仕掛けですが、うまく4つの7セグディスプレイに文字が表示されているように見えたのではないでしょうか。

表示内容を数秒間隔で更新したい時はどうしたら良いでしょうか?
一つはシフトレジスタを増やすという方法が考えられます。
もう一つは時間を判定しながらループを繰り返すという方法もあります。

ぜひ挑戦してみてください。

次回はシフトレジスタを使用してドットマトリックスLEDを制御してみましょう。

あわせて読みたい
Project 16.3 ドットマトリックスLED/LED Matrix 前回はシフトレジスタを使用して4つの7セグメントディスプレイを制御する方法を学びました。 https://kaneshige.org/?p=453 今回は同じ考え方を使用して、マトリックスL...
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

金重総合研究所の主席研究員。
子供の頃から研究者を目指し、ライフワークとして日々様々な研究をしています。
経営・マネジメント・金融・DXあたりが本職です。
私を採用したい人、私と一緒に働きたい人、一緒に知識を肥やしていきたい人はぜひお声がけ下さい。

コメント

コメントする

目次