某掲示板でシフトレジスタの話が出ていた(最近それきっかけが多い。)ので自分もやってみる。
何のために買ったのかさえ忘れたが、ちゃんと手持ちにSN74HC595が存在する。
https://www.ti.com/lit/gpn/SN74HC595
基本はクロックの立ち上がりで下の順にシフトされていくってこと。
SER->QA->QB->QC->QD->QE->QF->QG->QH->QH’
マイコンの出力をSERにつないでHighかLowか設定してからSRCLKを立ち上げる。
残りのピンの働きは以下の通り。
GND(8) : GND
SRCLR(10) : Shift Register Clear (負論理なのでHighで使う。)
SRCLK(11) : Shift Register Clock (立ち上がりで更新する。)
RCLK(12) : Storage Register Clock (立ち上がりで更新する。)
OE(13) : Output Enable (負論理なのでLowで使う。)
VCC(16) : VCC
レジスタが2種類あるので若干煩雑だ。
SRCLKを使ってビットをシフトし終わった後、RCLKを立ち上げてストアレジスタを更新するひと手間が必要だ。
マイコンはNodeMCUを使ってみた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
#include <Arduino.h> #define SER_PIN (4) // NodeMCU GPIO4(D2) - 74HC595 SER(14) #define STORE_PIN (2) // NodeMCU GPIO2(D4) - 74HC595 RCLK(12) #define CLK_PIN (0) // NodeMCU GPIO0(D3) - 74HC595 SRCLK(11) static char _bitdata[24] = { ///* B00000011, B00000110, B00001100, B00011000, B00110000, B01100000, B11000000, B10000001, //*/ ///* B00000001, B00000010, B00000100, B00001000, B00010000, B00100000, B01000000, B10000000, //*/ ///* B11111111, B00001111, B11111111, B11110000, B11111111, B10101010, B11111111, B11001100 //*/ }; void setup(){ pinMode(SER_PIN, OUTPUT); pinMode(STORE_PIN, OUTPUT); pinMode(CLK_PIN, OUTPUT); } void loop(){ for (int i = 0; i < 24; i++){ digitalWrite(STORE_PIN, LOW);// Prepare for HIGH shiftOut(SER_PIN, CLK_PIN, MSBFIRST, _bitdata[i]); digitalWrite(STORE_PIN, HIGH);// HIGH to Store delay(500); } delay(1000); } |
shiftOut()なんていう、まさにこのための関数まで用意されている。
https://www.arduino.cc/reference/en/language/functions/advanced-io/shiftout/
人がやることは何に使うか考える以外何も無いって感じ。