前回は7セグメントディスプレイをシフトレジスタ『74HC595』を使用して制御しました。
今回はパワーアップして4つの7セグディスプレイをコントロールしてみます。
4桁7セグメントディスプレイ
4桁7セグメントディスプレイは、4つの7セグメントディスプレイを1つのモジュールに統合したものです。そのため、より多くの文字を表示することができます。内蔵されたすべてのLEDは、共通のアノードと個別のカソードを持っています。内部構造とピン配置図は以下の通りです。
7セグメントディスプレイの内部電子回路は次の図のようになっています。各7セグメントディスプレイの8つのLEDカソードピンはすべて接続されています。
4桁7セグメントディスプレイの表示方法は、1桁の7セグメントディスプレイと似ています。異なる点は、4桁表示では各桁が順番に、一度に一桁ずつ表示されるということです。表示の仕組みは、最初に表示したい桁の共通端にHIGHレベルを出力し、他の3つの共通端にはLOWレベルを出力します。それから、表示したい桁の8つのLEDカソードピンに内容を送ります。このとき、先頭の桁の7セグメントディスプレイに内容が表示され、残りの3つはOFFになります。同様に、2番目、3番目、4番目の7セグメントディスプレイにも順番に内容表示を行います。4つの数字が個別に順番に表示されますが、この過程が非常に速いため、人間の目では認識できません。これは、光の残像効果および人間の目の残像現象によるものです。このようにして、4つの数字を同時に見ることができます。しかし、もし各数字をより長い間表示すると、数字が個別に表示されていることが認識できるようになります。
回路図
接続図
動作デモ
動画ではチラチラしているように見えますが、肉眼ではチラつきを感じず、全てが同時に点灯しているように見えると思います。
コード
/**********************************************************************
Filename : 4 Digital 7 Segment Display
Description : Use 74HC595 to drive the digital display
Auther : www.freenove.com
Modification: 2022/10/24
**********************************************************************/
int latchPin = 39; // Pin connected to ST_CP of 74HC595(Pin12)
int clockPin = 40; // Pin connected to SH_CP of 74HC595(Pin11)
int dataPin = 38; // Pin connected to DS of 74HC595(Pin14)
int comPin[] = {21,47,35,36};// Common pin (anode) of 4 digit 7-segment display
// Define the encoding of characters 0-F of the common-anode 7-Segment Display
byte num[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};
void setup() {
// set pins to output
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
for (int i = 0; i < 4; i++) {
pinMode(comPin[i], OUTPUT);
}
}
void loop() {
for (int i = 0; i < 4; i++) {
// Select a single 7-segment display
electDigitalDisplay (i);
// Send data to 74HC595
writeData(num[i]);
delay(5);
// Clear the display content
writeData(0xff);
}
}
void electDigitalDisplay(byte com) {
// Close all single 7-segment display
for (int i = 0; i < 4; i++) {
digitalWrite(comPin[i], LOW);
}
// Open the selected single 7-segment display
digitalWrite(comPin[com], HIGH);
}
void writeData(int value) {
// Make latchPin output low level
digitalWrite(latchPin, LOW);
// Send serial data to 74HC595
shiftOut(dataPin, clockPin, LSBFIRST, value); // Make latchPin output high level
// Make latchPin output high level, then 74HC595 will update data to parallel output
digitalWrite(latchPin, HIGH);
}
メインループを見てみましょう。
全体をforループで囲っています。これは『7セグディスプレイ4つ分の処理を行う』という状況です。それぞれの7セグディスプレイに対して選択、書き込み、クリアと処理しています。
void loop() {
for (int i = 0; i < 4; i++) {
// Select a single 7-segment display
electDigitalDisplay (i);
// Send data to 74HC595
writeData(num[i]);
delay(5);
// Clear the display content
writeData(0xff);
}
}
次にelectDigitalDisplay()関数を見てみましょう。
最初にforが4回まわっていますね。そして4つのcomPin(共通ピン)をLOWに設定しています。
次に選択された共通ピンをHIGHにしています。これで該当の7セグディスプレイを使用可能な状態にしました。
void electDigitalDisplay(byte com) {
// Close all single 7-segment display
for (int i = 0; i < 4; i++) {
digitalWrite(comPin[i], LOW);
}
// Open the selected single 7-segment display
digitalWrite(comPin[com], HIGH);
}
writeData()関数についてはこれまでと同様ですね。シフトレジスタにデータを書き込んでいます。
いかがだったでしょうか?人間の目の残像を利用するというとてもアナログな仕掛けですが、うまく4つの7セグディスプレイに文字が表示されているように見えたのではないでしょうか。
表示内容を数秒間隔で更新したい時はどうしたら良いでしょうか?
一つはシフトレジスタを増やすという方法が考えられます。
もう一つは時間を判定しながらループを繰り返すという方法もあります。
ぜひ挑戦してみてください。
次回はシフトレジスタを使用してドットマトリックスLEDを制御してみましょう。
コメント