ここでは、タイマー割り込み機能を利用して、3桁の数字を動的表示する手法を紹介します。この方法は、4〜6桁の表示に応用できます。


#include <MsTimer2.h>次の命令で割り込みの間隔(m秒単位)と割り込む関数を指定します。
MsTimer2::set(10, intr );//10mS間隔で intr メソッドを呼び出す実際の割り込みの開始と、終了には以下のメソッドを利用します。
MsTimew2(start); MsTimer3(stop);
//タイマー表示
#include <MsTimer2.h>
//下位7bitがセグメントのパターン
byte segment[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7F,0x67,0x0};
int val[3];
byte dg,pdg,isg;
byte data;
int secc;
int cnt;
long pt,ct;
void setup(){
Serial.begin(9600);
byte i;
for(i = 2; i <= 15; i++){
pinMode(i,OUTPUT);
}
//タイマー割り込みの設定
MsTimer2::set(4, intr );
MsTimer2::start();
secc = 0;
pt=millis();
val[0]=0;
val[1]=10;
val[2]=10;
dg=0;
pdg=2;
}//setup
void loop(){
ct=millis();
if((ct-pt)>1000) {
secc++;
val[2] = secc/100;
val[1] = (secc-val[2]*100)/10;
val[0] = secc % 10;
if(val[2]==0) val[2]=10;
if((val[2]==10) && (val[1]==0)) val[1]=10;
pt=ct;
if(secc>1000) secc=0;
}
}//loop
void intr(){
//割り込みでLEDを表示
dg++;
if(dg==2) dg=0;
data = segment[val[dg]];
//各セグメントを点灯する
for(isg=0;isg<7;isg++){ //a-gのセグメント設定
//>>は右シフト、& はand演算 、isg番のbitを表示
digitalWrite(6+isg,bitRead(data,isg));
}
digitalWrite(2+pdg,HIGH);
digitalWrite(2+dg,LOW);
pdg=dg;
}

