🕷
シフトレジスタと7セグメントLEDの使い方
主な部品
アイテム | 価格 |
---|---|
シフトレジスタ 74HC595 | 40円 |
7セグメントLED | 40円 |
配線
こちらがわかりやすい。
- 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 をまとめて書いている。
個人的には後者のように反映する処理としてまとめて書きたい。
Discussion