アフィリエイト広告
アフィリエイト広告

シフトレジスタでデジタルピン数を減らす

ラインデコーダTC74HCT139でデジット制御する」で、論理 IC で作っていたラインデコーダも TC74HCT139 に置き換えて、4 桁 7 セグメント LED の制御回路もほぼできあがった感じがしてきました。

が、Arduino のデジタルピンを 8 本も使っているのがちょっと気になっています。

シフトレジスタを使った回路図

使用するピンの数を減らす方法としてよくあるのが、パラレルをシリアルにするという方法です。複数の出力線を使ってデータを送るパラレル (並列) な接続を、ひとつの出力線でデータを順番に送るシリアル (直列) な接続にする、ということです。

ググってみると、シフトレジスタを使った方法がいろいろ出てきます。
シフトレジスタに関しては、俺も以前使ってみたことがあります。「シフトレジスターSN74LS164Nを使ってみる」とか「LED Cube 4x4x4 を試してみた」とか、合わせてご覧ください。

今回は一般的によく使われているらしい U74HC595AG を利用してみました。原理や使い方はグーグル先生に尋ねて下さい。

以下のような回路にしました。Arduino からの出力に使用しているデジタルピンは 3 本に減りました。

Arduino から出るラインは、出力データとクロックの 2 本と、ストレージレジスタ用のクロック 1 本の合計 3 本です。

シフトレジスタの出力データ 8 ビットは、以下のようにしています。

bit内容
7(未使用)
6桁位置 BCD 2bit
5
4ゼロサプレス
3表示数値 BCD 4bit
2
1
0

0 ~ 3 bit は表示する数値データですので、シフトレジスタの出力は 7 セグメントドライバへ送ります。
4 bit はゼロサプレス用のフラグです。これは 7 セグメントドライバの BI へ送り、LOW のとき表示を Blank とします。
5 ~ 6 bit は表示する桁位置で、ラインデコーダへ送ります。”00″ が 1 桁目、”01″ が 2 桁目、 “10” が 3 桁目、”11″ が 4 桁目をそれぞれ表示します。
したがって、例えば “00110101” であれば、2 桁目に [ 5 ] を表示させることになります。

ラインデコーダの G にはストレージレジスタ用のクロックを入れています。これは起動時や Arduino のリセット (スケッチ書き込み) 時の無用な点灯を抑止するためのものです。
以前は BI のプルダウンで対応していましたが、これでは抑止できなくなったのでこのようにしています。

シフトレジスタを使ったスケッチ

スケッチです。

  1. // analog2bcd-02.ino 2020/03/23 by meyon
  2. int dataPin = 2;
  3. int clockPin = 3;
  4. int latchPin = 4;
  5.   
  6. void setup() {
  7.   pinMode(dataPin, OUTPUT);
  8.   pinMode(clockPin, OUTPUT);
  9.   pinMode(latchPin, OUTPUT);
  10. }
  11. void loop() {
  12.   int sensorValue = analogRead(A0);
  13.   int displayValue = map(sensorValue, 0, 1023, 0, 1023);
  14.   for(byte digit=0; digit<4; digit++) {
  15.     int digitData = displayValue % 10;
  16.     int zeroSuppression = 1;
  17.     if((0 < digit) && (0 == displayValue)) {
  18.       zeroSuppression = 0;
  19.     }
  20.     digitData += zeroSuppression << 4;
  21.     digitData += digit << 5;
  22.     digitalWrite(latchPin, LOW);
  23.     shiftOut(dataPin, clockPin, LSBFIRST, digitData);
  24.     digitalWrite(latchPin, HIGH);
  25.     delay(4);
  26.     displayValue /= 10;
  27.   }
  28. }

digitData がシフトレジスタへおくるデータです。
18 行で 0 ~ 3 bit に数値データを格納し、24 行で 4 bit にゼロサプレスのフラグを、25 行で 5 ~ 6 bit に表示する桁位置を格納しています。

27 行で表示をすべて Blank にしておき、28 行でデータをシフトレジスタへ送出、29 行でストレージレジスタへクロックを送って表示を変更しています。
30 行でその状態を 4ms 保持した後、次の桁の処理に移ります。

ブレッドボード

毎度のブレッドボードです。

上段のラインデコーダに並べてシフトレジスタを取り付けています。
デジット制御用のトランジスタの左に、クロックを反転させるためのトランジスタが 1 つ増えています。

ということで、4 桁 7 セグメント LED を駆動する回路について、とりあえず完成です。

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