PR

Arduino学習⑱ Lesson20 4桁の7セグメントディスプレイ
Arduinoの勉強会。74HC595シフトレジスタと4桁 7セグメントディスプレイを使って16進数をシフト表示してみた。

Arduino学習

4 桁の 7 セグメントディスプレイを使用する方法を学習します。

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

基本的には、1桁の時と制御は、同様です。

「e」を点灯
「d」を点灯
「dp」を点灯
「c」を点灯
「g」を点灯
D4(4桁目)
「b」を点灯
D3(3桁目)
D2(2桁目)
「f」を点灯
「a」を点灯
D1(1桁目)

「74HC595シフトレジスタ」を使用して、1桁ずつ表示していますが、非常に高速に数値を表示しているため、同時に表示されているように見えます。(写真では、全てが同時に表示されたようには見えません。)
表示する桁数のLOWにすることで表示桁の位置を指定します。(もしくは全てLOWにして順番に表示をセットします。)

データシート

使用部品

必要な部品は以下になります。

  • Elegoo UNO R3 x 1
  • 830 tie-points Breadboard x 1
  • 220Ω 抵抗器 x 4
  • 74HC595 IC
  • 4桁 7-セグメントディスプレイ
  • M-M Jumper wires x 31

以下のスターターキットに使用部品はすべて同梱されています。

回路をつくってみる

チュートリアル付属の回路図
チュートリアル付属の配線図

チュートリアルに従って繋いでみましたが、まともに値が表示されなかったため、回路図を以下のように変更しました。(D1~D4をArduinoの1~4に繋ぎました。)

Arduino UNO R374HC5954DIG 7-SEGMENT DISPLAY
Q0⑪ A
Q1⑦ B
Q2④ C
Q3② D
Q4① E
Q5⑩ F
Q6⑤ G
Q7③ DP
GNDGND
5VVCC
D8DS(DATA)
GNDOE
D9ST_CP(LATCH)
D10SH_CP(CLOCK)
5VMR(CLEAR)
Q7′
⑫ D1
⑨ D2
⑧ D3
⑥ D4

プログラムを動かしてみる

回路を少し変更したのでチュートリアルのプログラムを少し変更して動かします。

//chikuma-creative.com
//2025.04.06
int tDelay = 1;  // 100ms delay
int latch = 9;    // 74HC595  pin 9 STCP
int clock = 10;   // 74HC595  pin 10 SHCP
int data = 8;     // 74HC595  pin 8 DS
#define DIG1  1   // DIG1
#define DIG2  2   // DIG1
#define DIG3  3   // DIG1
#define DIG4  4   // DIG1
#define numval(x) ((x > 16) ? (16) : (x))

unsigned char table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c
,0x39,0x5e,0x79,0x71,0x00};

void setup() {
  pinMode(latch,OUTPUT);
  pinMode(clock,OUTPUT);
  pinMode(data,OUTPUT);
  pinMode(DIG1,OUTPUT);
  pinMode(DIG2,OUTPUT);
  pinMode(DIG3,OUTPUT);
  pinMode(DIG4,OUTPUT);
  digitalWrite(DIG1,HIGH);
  digitalWrite(DIG2,HIGH);
  digitalWrite(DIG3,HIGH);
  digitalWrite(DIG4,HIGH);
}
uint8_t pinValue(uint8_t dig, uint8_t tgt) {
  if (dig == tgt) {
    return LOW;
  } else {
    return HIGH;
  }
}
void display(uint8_t dig, uint8_t num)
{
  delay(tDelay);
  digitalWrite(DIG1,pinValue(DIG1,dig));
  digitalWrite(DIG2,pinValue(DIG2,dig));
  digitalWrite(DIG3,pinValue(DIG3,dig));
  digitalWrite(DIG4,pinValue(DIG4,dig));
  digitalWrite(latch,LOW);
  shiftOut(data,clock,MSBFIRST,table[num]);
  digitalWrite(latch,HIGH);
}
void display4digit(uint8_t num) {
  for(int i=0; i<100; i++) {
    display(DIG1, numval(num));
    display(DIG2, numval(num + 1));
    display(DIG3, numval(num + 2));
    display(DIG4, numval(num + 3));
  }
}
void loop() {
  for (int i=0; i<17; i++) {
    display4digit(i);
  }
}
C++

table配列を順番に表示します。DIG1にtable[0]、DIG2にtable[1]、DIG3にtable[2]、DIG4にtable[3]…、これを表示するデータを1つずつカウントアップします。
16以上の場合は、table[16]を(全て消灯)を表示しています。

「0123」を表示
「5678」を表示
「89Ab」を表示
「cdEF」を表示
「EF 」を表示

以上

コメント

タイトルとURLをコピーしました