🕷

シフトレジスタと7セグメントLEDの使い方

2023/01/02に公開

主な部品

https://akizukidenshi.com/catalog/g/gI-14053/

https://akizukidenshi.com/catalog/g/gI-00640/

アイテム 価格
シフトレジスタ 74HC595 40円
7セグメントLED 40円

配線

こちらがわかりやすい。

https://iot.keicode.com/arduino/arduino-shift-register-sn74hc595.php

  • QA〜QH で8ビット分だけど QA だけ反対側にある (なぜ?)
  • 7セグメントLEDがカソードコモンの場合は 3 と 8 を GND に繋ぐ

コード

#define SER   2
#define RCLK  3
#define SRCLK 4

void setup() {
  pinMode(RCLK, OUTPUT);
  pinMode(SRCLK, OUTPUT);
  pinMode(SER, OUTPUT);
}

uint64_t count = 0;

void loop() {
  shiftOut(SER, SRCLK, LSBFIRST, 1 << ((count / 5) & 7));
  digitalWrite(RCLK, LOW);
  digitalWrite(RCLK, HIGH);
  count++;
  delay(1000 / 60);
}

書き込む前に RCLK を LOW にすべき?

次のように RCLK の LOW と HIGH で囲んでいるサンプルをよく見かける。

digitalWrite(RCLK, LOW);
shiftOut(...);
digitalWrite(RCLK, HIGH);

しかし、実際のところ囲まなくても書き込める。RCLK が LOW か HIGH の状態で何かが変わるのではなく LOW から HIGH にしたタイミングで反映する仕組みになっている。

囲んでいるサンプルが多い理由は、

  • LOW にしないと書き込めないという思い込み
  • HIGH のままだと即反映されてしまうという思い込み
  • HIGH のままもし即反映されたらいけないから (心配性)
  • DB の Transacation ブロックのようなものをイメージしちゃってる
  • 既存のサンプルがそうなってたから

と思われる。

一方、こちらの記事では普通に LOW, HIGH をまとめて書いている。

https://rage1blog.com/how-to-use-arduino_shift-register_74hc595/

個人的には後者のように反映する処理としてまとめて書きたい。

Discussion