ご無沙汰しておりますtueksです。
今回7セグメントLEDを光らすために7セグメントようデコードICを入手しました。
これは4桁の2進数によって0~9までの数字を7セグメントで表示するためのICで、好きな数字を表示さるための10進2進変換をするためのコードをかきましたので備忘録的に紹介します。
Arduino Uno, Nanoを使用し、7セグデコードICと合わせて使用することで以下のように7セグメントを光らせることができます。
ここまで大変でした😇 pic.twitter.com/3YiW9mNaMG
— tueks (@tueks3) October 22, 2020
回路を組み立てなくても、シリアルモニタから10進数が2進数に変換されているかを確認することができます。
あまり賢くないとは思いますが、コードです。
//10進数を2進数に変換します。
//ArduinoUno/Nanoで動きます。
//2進数によって7セグメントをスタティック点灯させるデコードICのために作成しました。
//2020.11.10 tueksによって作成されました。
void setup() {
Serial.begin(9600);
}
/*10進数2進数変換*/
void ChangeBin(int Dec, int *Bin);
//https://monoist.atmarkit.co.jp/mn/articles/1408/07/news012.html
void loop()
{
int deadtime = 500; /*mSec*/
int Bin[4];//4桁2進数用の配列
int i;
int k = 0;
//0~9までの数字を順番に表示。
for (int n = 0; n < 10; n++) {
Serial.print(String(k)+" ");//シリアルモニタに10進の表示
ChangeBin(k, Bin);//kで与えられる10進数を2進数にエンコード
/*d2~4を出力ピンに設定、昇順に配列設定し、TC5068(7セグデコードIC)の入力ピンA~Dに対応*/
for (i = 0; i < 4; i++) {
//d2~d5に配列の値Bin[0]~Bin[3]を格納
if (Bin[i] == 1) {
digitalWrite(i + 2, HIGH);
} else {
digitalWrite(i + 2, LOW);
}
Serial.print(",");
Serial.print(Bin[i]);//シリアルモニタに2進数の表示
} Serial.println();
delay(deadtime);
k = k + 1;
}
}
//10進を4bitの2進数に変換し、配列に格納。
void ChangeBin(
int Dec, //input
int *Bin //roop()内で作成した配列のアドレスを受け取る。ポインタ渡し。
)
{
/*10進数が2進数に変換され、配列に格納。Bin[3]=0桁目,Bin[2]=1桁目,Bin[1]=2桁目,Bin[0}=3桁目*/
int m = 3;
for (int i = 0; i < 4; i++) {
Bin[m] = Dec % 2;
Dec = Dec / 2;
m = m - 1;
}
}
以下雑なコードの解説です。プログラミングには本当に弱いので説明が間違っているかもしれません。なにかありましたらご指摘いただければと思います。
ChangeBinという自作した関数によって10進数を2進数に変換します。
loop()内でkによって与えられた10進の数、Bin[]という配列をChangeBinに渡します。配列は関数によって直接値を書き換えられないため、「ポインタ渡し」という作成した配列Bin[]のアドレスを渡します。
ChangeBin関数内で10進2進変換が行われ、2進数は4桁の配列に1文字ずつ格納されます。
loop()内で配列Bin[0]~[3]の値が呼び出され、digitalWriteによってArduinoのd0~d5を2進数の電圧出力にします。
2進数の出力で直接LEDを駆動するとこうなります。
以上です。配列を引き渡すのにポインタを使うとか言うのよくわかんなくて難しかったです。みつお pic.twitter.com/Z9UPUYAuza
— tueks (@tueks3) October 22, 2020
tueks