📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

ページの作成:「== 概要 == シフトレジスタを使用すると、少ない出力ピンで多くの出力を制御することが可能になる。<br> ここでは、シフトレ…」
 
155行目: 155行目:
     }
     }
  }
  }
</source>
<br><br>
== シフトレジスタ(74HC595)のカスケード接続 ==
このセクションでは、2個の74HC595をカスケード接続することにより、16個のLEDをオン / オフする方法を記載する。<br>
<br>
74HC595のカスケード接続には、9番ピン(カスケード用シリアル出力)を使用する。<br>
前段の74HC595の9番ピン(カスケード用シリアル出力)を、後段の74HC595の14番ピン(シリアルデータ入力)に接続する。<br>
これにより、前段の74HC595のSER(シリアル入力)から入力されたデータが、カスケード接続された後段の74HC595に次々と伝達される。<br>
<br><br>
== 2個のシフトレジスタ(74HC595)をカスケード接続して、16個のLEDを制御する ==
2個の74HC595を使用して、16個のLEDをオン / オフする場合、下図のように接続する。<br>
[[ファイル:Arduino 74HC595 6.png|フレームなし|中央]]
<br>
その他の接続は、上記セクションの場合と同様である。<br>
この場合も、Arduinoからの出力で必要になるのは、データ、ラッチ、クロックの3つの出力だけである。<br>
<br>
Arduinoのプログラムを以下のように記述する。<br>
<source lang="c++">
const int PIN_SER  =  8;
const int PIN_LATCH =  9;
const int PIN_CLK  = 10;
void setup()
{
    pinMode( PIN_SER, OUTPUT );
    pinMode( PIN_LATCH, OUTPUT );
    pinMode( PIN_CLK, OUTPUT );
    byte b1 = B11010001;
    byte b2 = B00110011;
    digitalWrite(PIN_LATCH, LOW);
    shiftOut(PIN_SER, PIN_CLK, LSBFIRST, b2);
    shiftOut(PIN_SER, PIN_CLK, LSBFIRST, b1);
    digitalWrite(PIN_LATCH, HIGH);
}
void loop()
{
}
</source>
<br>
下図左が前段のシフトレジスタ(74HC595)で、下図右が後段のシフトレジスタ(74HC595)である。<br>
前段のシフトレジスタ(74HC595)はArduinoからシリアルデータ入力されて、後段のシフトレジスタ(74HC595)の入力は前段のシフトレジスタのカスケード用シリアル出力に接続している。<br>
また、LEDの配置はQ<sub>A</sub>からQ<sub>H</sub>が左から右に並ぶように配線している。<br>
[[ファイル:Arduino 74HC595 7.png|フレームなし|中央]]
<br>
プログラムのデータ書き込み部分を見ると、最初に1バイトのデータ変数<code>b2</code>を<code>LSBFIRST</code>のビット順で入力している。<br>
続いて、1バイトのデータ変数<code>b1</code>を入力している。<br>
このため、先に入力された変数<code>b2</code>のデータ<code>B00110011</code>が、後段のシフトレジスタにセットされる。<br>
また、後に入力した変数<code>b1</code>のデータ<code>B11010001</code>が前段のシフトレジスタにセットされる。<br>
<br>
LSBFIRSTのビット順なので、プログラムに記載したB11010001とB00110011がそのままLEDのオン(1がON)、オフ(0がOFF)となる。<br>
<source lang="c++">
byte b1 = B11010001;
byte b2 = B00110011;
digitalWrite(PIN_LATCH, LOW);
shiftOut(PIN_SER, PIN_CLK, LSBFIRST, b2);
shiftOut(PIN_SER, PIN_CLK, LSBFIRST, b1);
digitalWrite(PIN_LATCH, HIGH);
  </source>
  </source>
<br><br>
<br><br>