2012年9月19日水曜日

2桁の7セグメント発光ダイオードに挑戦(スケッチ完成編)

前回、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 件のコメント:

コメントを投稿