前回、2桁の7セグメントLEDの各桁へ、ダイナミック点灯という方式で、数値を表示しました。
今回は、 2桁7セグメントLEDの表示を関数化します。
前回のスケッチです。
void setup(){
//1~7番ピン デジタル出力へセット
for (int i=1; i<=7; i++){
pinMode(i,OUTPUT);
}
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
}
//LEDレイアウトを定義
boolean Num_Array[10][7]={
{0,0,0,0,0,0,1},{1,0,0,1,1,1,1},{0,0,1,0,0,1,0},{0,0,0,0,1,1,0},
{1,0,0,1,1,0,0},{0,1,0,0,1,0,0},{1,1,0,0,0,0,0},{0,0,0,1,1,1,1},
{0,0,0,0,0,0,0},{0,0,0,1,1,0,0}
};
//LED表示関数を定義
void NumPrint(int Number){
for (int w=0; w<=6; w++){
digitalWrite(w+1,Num_Array[Number][w]);
}
}
void loop(){
digitalWrite(8,HIGH);
digitalWrite(9,LOW);
NumPrint(2);
delay(20);
digitalWrite(8,LOW);
digitalWrite(9,HIGH);
NumPrint(3);
delay(20);
}
目指すのは、関数に引数を付けて実行したら、あとは関数側で処理できるようにすることです。
void loop 内では、次のように書くだけで済むようにします。NumPrintEx2はこれから作る関数の名前です。
void loop(){
NumPrintEx2(23)
}
目指すことが、もう一つあります。
NumPrintEx2関数を呼び出したあと、すぐにLoop内の次の命令に戻してくれることです。
なぜかというと、NumPrintEx2を呼び出したあと、戻ってきてくれなければ、次の命令に移ることができないからです。
そこで、必要となるのが、タイマー割り込み(MsTimer2)の処理です。
NumPrintEx2関数を呼び出すことで、ダイナミック点灯を開始し、次にNumPrintEx2関数で数値を指定されるまで、割り込み処理を行いながら、その数値を表示し続けます。
関数から、戻ってきたら、セグメントの表示が消えてしまっては、つまらないです。
スケッチを考えると、次のようになります。
#include <MsTimer2.h>
//グローバル変数を宣言
int Digit1=0; //左側7セグLED表示用LED
int Digit2=0; //右側7セグLED表示用LED
//LEDレイアウトを定義
boolean Num_Array[10][7]={
{0,0,0,0,0,0,1},{1,0,0,1,1,1,1},{0,0,1,0,0,1,0},{0,0,0,0,1,1,0},
{1,0,0,1,1,0,0},{0,1,0,0,1,0,0},{1,1,0,0,0,0,0},{0,0,0,1,1,1,1},
{0,0,0,0,0,0,0},{0,0,0,1,1,0,0}
};
//LED表示関数を定義
void NumPrint(){
static int DigitFlag=2; //表示している桁 1の時は左側、2の時は右側
int Number;
if(DigitFlag==1){
digitalWrite(8,HIGH);
digitalWrite(9,LOW);
Number=Digit1;
DigitFlag=2;
}else{
digitalWrite(8,LOW);
digitalWrite(9,HIGH);
Number=Digit2;
DigitFlag=1;
}
for (int w=0; w<=6; w++){
digitalWrite(w+1,Num_Array[Number][w]);
}
}
//LED2桁表示
void NumPrintEx2(int Number){
Digit1=Number / 10; //十の位を指定
Digit2=Number % 10; //一の位を指定 %は余りを計算
}
void setup(){
//1~7番ピン デジタル出力へセット
for (int i=1; i<=7; i++){
pinMode(i,OUTPUT);
}
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
MsTimer2::set(10, NumPrint); // 10ms period
MsTimer2::start();
}
void loop(){
NumPrintEx2(23);
delay(1000);
}
NumPrintEx2関数の引数には、もちろん、変数も使えます。
0から99まで、順に表示したい場合には、次のようにスケッチを書くことも可能です。
void loop(){
for (int t=0 ; t<100 ;t++){
NumPrintEx2(t);
delay(100);
}
}
このようなスケッチで、高速でカウントアップしていきます。もし、お手元の実験できる環境があったら是非、試してみてください。なかなかのものですよ。
2桁の7セグメント発光ダイオードの表示関数の完成です。
・電子工作の基本100
・図解でわかるはじめての電子回路
・Android×Arduinoでつくるクラウド連携デバイス―Android ADKで電子工作
0 件のコメント:
コメントを投稿