1桁7セグメントLEDを表示させてみる。~C言語編~
はじめに
7セグメントLEDをRaspberryPiを使って表示させていきます。
今回使用するのは1桁です。0~9の数字を表示することが目標です。
以前力業で点灯させましたが、今回は入力した数字に対応して点灯するようにプログラムを作成します。
Python編はこちら。
用意するもの
Raspberry Pi | Raspberry Pi 4 |
1桁7セグメントLED | OSL10561-LRA |
抵抗 | 100Ω抵抗 |
ジャンパーケーブル | ジャンパーケーブル |
ブレッドボード | ブレッドボード |
1桁7セグメントLEDはカソードコモンの物を使用します。
抵抗については8本使用します。
素子の接続
7セグメントのピンは以下のようになっています。
データシートの抜粋です。
Raspberry Piと7セグメントのピンの対応は次のようにしました。
7セグの8番は使っていません。
7セグピン | GPIO | 点灯箇所 |
1 | 24 | E |
2 | 25 | D |
3 | GND | – |
4 | 12 | C |
5 | 16 | DP |
6 | 21 | B |
7 | 20 | A |
8 | – | – |
9 | 23 | F |
10 | 18 | G |
GPIOの出力をHIGHにすることで、対応する箇所が点灯します。
数字を点灯させるにはHIGHLOWの組み合わせをうまくすれば表現できます。
対応は以下の表のとおりです。
数字 | GPIO24 | GPIO25 | GPIO12 | GPIO16 | GPIO21 | GPIO20 | GPIO23 | GPIO18 |
0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 |
2 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
3 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 |
4 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 |
5 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 |
6 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 1 |
7 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 |
8 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 |
9 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 |
プログラムを作成する
まずは、おまじない。
#include <stdio.h>
#include <time.h>
#include <wiringPi.h>
#include <math.h>
続いてメインの処理です。
int main()
{
int gpionum[8] = {24,25,12,16,21,20,23,18}; //使用するGPIO番号
//使用するGPIO番号に対応したHIGHLOWを格納。
int ledhl[10][8] = { {1,1,1,0,1,1,1,0} , //「0」の時
{0,0,1,0,1,0,0,0} , //「1」の時
{1,1,0,0,1,1,0,1} , //「2」の時
{0,1,1,0,1,1,0,1} , //「3」の時
{0.0,1,0,1,0,1,1} , //「4」の時
{0,1,1,0,0,1,1,1} , //「5」の時
{1,1,1,0,0,1,1,1} , //「6」の時
{0,0,1,0,1,1,0,0} , //「7」の時
{1,1,1,0,1,1,1,1} , //「8」の時
{0,1,1,0,1,1,1,1} }; //「9」の時
gpionum[8]は使用するGPIO番号を格納していきます。
光らせるセグは8個あるので[8]としています。
ledhl[10][8]はGPIOの対応表を参考にgpionum[8]と対応させます。
[10]は光らす数字の数、[8]はセグの数です。
HIGH、LOWと表現していますが、HIGH=1、LOW=0です。
どちらを使ってもOKです。
wiringPiSetupGpio(); //pinをGPIO番号選択に
//①使用するgpioのモードをoutputに出力をLOWに
for ( int i = 0 ; i < 8 ; i++){
pinMode(gpionum[i] , OUTPUT);
digitalWrite(gpionum[i] , LOW);
}
printf("表示したい数字を入力");
int num;
scanf("%d" , &num); //②表示する数字を外部入力
//③入力された数字に応じてGPIOのHIGHLOWを変更
for ( int i = 0 ; i < 8 ; i++){
digitalWrite(gpionum[i] , ledhl[num][i]);
}
return 0;
}
GPIOのモードをすべてOUTPUTに変更します。for分で簡単にできます。(①)
外部入力で表示したい数字0~9を受け付けます。入力された数字がnumに格納されます(②)
入力された数字に対応したGPIOの出力を変更します。こちらもfor分で繰り返し処理で簡単にできます。(③)
gcc -o 7sec_c.c 7seg_c -lwiringPi
./7seg_c
表示したい数字を入力
コンパイルして実行すると入力待ちになるので0~9の数字を入力します。
エラー処理を入れていないので、0~9以外を入れたときの動作はわかりません。
入力した数字が点灯したら成功です。
終わりに
7セグメントの数字点灯をC言語で作成しました。
思っていたよりも簡単で手動で7セグメントを表示するよりも簡単なのでは・・・?と思ったほどでした。
自動で表示させてみたい方はお試しください。
今後は4連7segなども使って自作の温度計などを作っていきたいと考えてます。