今回は、前回の7セグディスプレイを拡張した、4桁7セグメントLEDを使用して、カウンターを作成したいと思う。
7セグメントLEDが4桁分表示できるものである。
ただし、1度に4桁すべてを表示することはできない。そこで、1桁ずつONとOFFを高速で切り替える作業を指定された時間だけループさせることによって、あたかも4桁同時に表示させているように見せている。
端子は以下の3つに分類される
アノードコモンのため、論理が反転し、0で点灯となることに注意する。
#include <wiringPi.h>
#include <time.h>
#include <math.h>
int main(void) {
// 外側が表示させる数字、内側がa~gの信号出力
int num[10][7] = {
{0, 0, 0, 0, 0, 0, 1}, // 0
{1, 0, 0, 1, 1, 1, 1}, // 1
{0, 0, 1, 0, 0, 1, 0}, // 2
{0, 0, 0, 0, 1, 1, 0}, // 3
{1, 0, 0, 1, 1, 0, 0}, // 4
{0, 1, 0, 0, 1, 0, 0}, // 5
{0, 1, 0, 0, 0, 0, 0}, // 6
{0, 0, 0, 1, 1, 1, 1}, // 7
{0, 0, 0, 0, 0, 0, 0}, // 8
{0, 0, 0, 0, 1, 0, 0} // 9
};
int i = 0; // カウント用(最大9999)
int start; // 時間制御用
int pw; // 桁数調節用
wiringPiSetup();
// a~gのビットを出力に設定し、HIGH(1)で初期化
for (int count = 21; count < 28; count++) {
pinMode(count, OUTPUT);
digitalWrite(count, HIGH);
}
// 桁数を指定する端子を出力に設定し、LOW(0)で初期化
for (int count = 2; count < 6; count++) {
pinMode(count, OUTPUT);
digitalWrite(count, LOW);
}
// 開始時間を初期化
start = (int)time(NULL);
// 数字が9999になるまで繰り返す
while (i <= 9999) {
// 表示する桁を指定(下位桁から表示)
for (int count = 5; count > 1; count--) {
// HIGHにして、指定された桁を表示
digitalWrite(count, HIGH);
// 指定された桁のセグメントを1つずつ点灯
for (int seg = 21; seg < 28; seg++) {
// 1の位から順番に
pw = (int)pow(10, (5 - count));
// 表示させる数字を指定して、セグメントに0(LOW)を指定
digitalWrite(seg, num[i % (pw * 10) / pw][seg - 21]);
}
// 1ms待ち
delay(1);
// 現在の桁の表示を消灯
digitalWrite(count, LOW);
}
// while文実行から1秒経っていたら次の数字に進める
if (((int)time(NULL) - start) >= 1) {
i++;
// 時間のリセット
start = (int)time(NULL);
}
}
return 0;
}
pow()関数を使うため、コンパイルするときにオプションとして、-lmを付ける必要がある。
HIGHにし、表示の準備をする。(42行目)i % (pw * 10) / pwは、指定された桁の数を抜き出すための計算である。seg - 21は、配列のインデックスが、0~7に合わせるための計算である。delay(1)は、処理時間を調節するためのものである。(52行目)