Project 16.1 7セグメントLED/7-Segment Display

前回はシフトレジスター『74HC595』の使用方法を学びました。

あわせて読みたい
Project 15.1 シフトレジスター/Flowing Water Light 以前、バーLEDアレイを使って流れるようなライトを作りました。 https://kaneshige.org/?p=209 この時の実装ではESP32-S3の GPIOポートが10個使われました。 GPIOポート...

今回はシフトレジスターを使用して7セグメントディスプレイで0~Fまで表示してみましょう。

目次

7セグメントディスプレイについて

7セグメントディスプレイはデジタル電子表示デバイスです。「8」という数字と小数点が表示されており、これは8つのLEDから構成されています。これらのLEDは共通のアノード(陽極)と個別のカソード(陰極)を持っています。内部構造とピンの配置図は以下の通りです

上の回路図でわかるように、各LEDの状態を個別に制御することができます。また、異なるONとOFFの状態のLEDを組み合わせることで、さまざまな文字(数字やアルファベット)を表示することができます。例えば、「0」を表示する場合、LEDセグメントA、B、C、D、E、FをONにし、LEDセグメントGとDPをOFFにする必要があります。

このプロジェクトでは、共通アノード型の7セグメントディスプレイを使用します。そのため、LEDセグメントにLOWレベルの信号を入力すると、LEDが点灯します。セグメント “A”を最下位、セグメント “DP” を最上位として、上位から下位に向かって “DP”、”G”、”F”、”E”、”D”、”C”、”B”、”A” となります。文字 “0” はコード 1100 0000 = 0xc0 に対応します。

表にすると以下のとおりです。

CHARDPGFEDCBAHexASCII
0110000000xC01100 0000
1111110010xF91111 1001
2101001000xA41010 0100
3101100000xB01011 0000
4100110010x991001 1001
5100100100x921001 0010
6100000100x821000 0010
7111110000xF81111 1000
8100000000x801000 0000
9100100000x901001 0000
A100010000x881000 1000
B100000110x831000 0011
C110001100xC61100 0110
D101000010xA11010 0001
E100001100x861000 0110
F100011100x8E1000 1110

回路図

接続図

動作デモ

コード

/**********************************************************************
  Filename    : 1 Digital 7 Segment Display
  Description : Use 74HC595 to drive the digital display
  Auther      : www.freenove.com
  Modification: 2022/10/24
**********************************************************************/
int dataPin  = 12;          // Pin connected to DS of 74HC595(Pin14)
int latchPin = 13;          // Pin connected to ST_CP of 74HC595(Pin12)
int clockPin = 14;          // Pin connected to SH_CP of 74HC595(Pin11)

// Define the encoding of characters 0-F for 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);
}

void loop() {
  // display 0-F on digital tube
  for (int i = 0; i < 16; i++) {
    writeData(num[i]);// Send data to 74HC595
    delay(1000);      // delay 1 second
    writeData(0xff);  // Clear the display content
  }
}

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, then 74HC595 will update the data to parallel output
  digitalWrite(latchPin, HIGH);
}

コード解説

まずは12~15行目。発光パターンを16進数2桁=1バイトでbyte型の配列に入れていますね。

byte num[] = {
  0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
  0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e
};

メインループは出力して、1秒待って、消しての繰り返し。

33行目からがメインディッシュ。ラッチピンを下げて、シフトアウトして、ラッチピンを上げる⇒出力する

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, then 74HC595 will update the data to parallel output
  digitalWrite(latchPin, HIGH);
}

そんなに難しいプログラムではないですね。最初の発光パターンを用意するのがちょっと面倒ですね。

次回は4つの7セグディスプレイを制御してみましょう。

あわせて読みたい
Project 16.2 4桁7セグメントLED/4-Digit 7-Segment Display 前回は7セグメントディスプレイをシフトレジスタ『74HC595』を使用して制御しました。 https://kaneshige.org/?p=445 今回はパワーアップして4つの7セグディスプレイを...
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

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

コメント

コメントする

目次