「ラインデコーダ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 のプルダウンで対応していましたが、これでは抑止できなくなったのでこのようにしています。
シフトレジスタを使ったスケッチ
スケッチです。
- // analog2bcd-02.ino 2020/03/23 by meyon
- int dataPin = 2;
- int clockPin = 3;
- int latchPin = 4;
-
- void setup() {
- pinMode(dataPin, OUTPUT);
- pinMode(clockPin, OUTPUT);
- pinMode(latchPin, OUTPUT);
- }
- void loop() {
- int sensorValue = analogRead(A0);
- int displayValue = map(sensorValue, 0, 1023, 0, 1023);
- for(byte digit=0; digit<4; digit++) {
- int digitData = displayValue % 10;
- int zeroSuppression = 1;
- if((0 < digit) && (0 == displayValue)) {
- zeroSuppression = 0;
- }
- digitData += zeroSuppression << 4;
- digitData += digit << 5;
- digitalWrite(latchPin, LOW);
- shiftOut(dataPin, clockPin, LSBFIRST, digitData);
- digitalWrite(latchPin, HIGH);
- delay(4);
- displayValue /= 10;
- }
- }
digitData がシフトレジスタへおくるデータです。
18 行で 0 ~ 3 bit に数値データを格納し、24 行で 4 bit にゼロサプレスのフラグを、25 行で 5 ~ 6 bit に表示する桁位置を格納しています。
27 行で表示をすべて Blank にしておき、28 行でデータをシフトレジスタへ送出、29 行でストレージレジスタへクロックを送って表示を変更しています。
30 行でその状態を 4ms 保持した後、次の桁の処理に移ります。
ブレッドボード
毎度のブレッドボードです。
上段のラインデコーダに並べてシフトレジスタを取り付けています。
デジット制御用のトランジスタの左に、クロックを反転させるためのトランジスタが 1 つ増えています。
ということで、4 桁 7 セグメント LED を駆動する回路について、とりあえず完成です。