今回は、7セグメントディスプレイを使用して、数字の1~9を順番に表示するプログラムを作成したいと思う。
7セグメントディスプレイとは、以下の図のように9つのLEDを備えており、点灯させるLEDの組み合わせを工夫することによって、数字を表示させることができるものである。
信号ピンは10個存在するが、数字の表示に使用するのが、7つ、右下のドット表示に使用するのが1つ、GNDに接続するのが2つとなっている。
今回使用する7セグディスプレイは、ポジティブトリガーエッジのため、正論理で点灯(つまり1を出力すると点灯)となる。
0~9までの数字を表示する際の各セグメントのビットは、次の表のようになる。
| Display digital |
a | b | c | d | e | f | g |
| 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
| 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
| 2 | 1 | 1 | 0 | 1 | 1 | 0 | 1 |
| 3 | 1 | 1 | 1 | 1 | 0 | 0 | 1 |
| 4 | 0 | 1 | 1 | 0 | 0 | 1 | 1 |
| 5 | 1 | 0 | 1 | 1 | 0 | 1 | 1 |
| 6 | 1 | 0 | 1 | 1 | 1 | 1 | 1 |
| 7 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
| 8 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 9 | 1 | 1 | 1 | 1 | 0 | 1 | 1 |
今回はGPIO21~27ピンを使用する。
ごちゃごちゃしているが、以下のように接続する。
なお、今回dpは使用しないので、LOWにして(GNDに接続して)消灯しておく。
#include <wiringPi.h>
int main(void) {
wiringPiSetup();
int num[10][7] = {
{1, 1, 1, 1, 1, 1, 0}, // 0
{0, 1, 1, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1}, // 2
{1, 1, 1, 1, 0, 0, 1}, // 3
{0, 1, 1, 0, 0, 1, 1}, // 4
{1, 0, 1, 1, 0, 1, 1}, // 5
{1, 0, 1, 1, 1, 1, 1}, // 6
{1, 1, 1, 0, 0, 0, 0}, // 7
{1, 1, 1, 1, 1, 1, 1}, // 8
{1, 1, 1, 1, 0, 1, 1}, // 9
};
for (int i = 21; i < 28; i++) {
pinMode(i, OUTPUT); // 21~27ピンをすべて出力に設定
}
for (int count = 0; count < 10; count++) {
for (int i = 0; i < 8; i++)
{
digitalWrite(i, num[count][i]); // num配列の中身を各端子に出力
}
delay(1000); // 1秒停止
}
return 0;
}
5行目で、2次元配列numを用意し、外側は表示させるための数字、内側はA~Gに出力する値を格納している。
18行目~のfor文で21~27ピンを出力設定で初期化している。
22行目~はforの2重ループとなっており、外側のループで表示させる数字、内側のループで送信するピン番号を指定している。 ピン番号は21~27だが、配列は0~7で格納しているため、注意が必要である。
このままfor文を回すと早すぎるので、delay()関数で1秒間停止している。