#include "Timer.h" //載入計時器程式庫
Timer t0,t1,t2; //建立計時器(Timer)物件
int LED_L[] = {11,10,9,8};//LED陣列 左側4顆 接腳
int LED_R[] = {7,6,5,4}; //LED陣列 右側4顆 接腳
int SEG[] = {22,24,26,28,30,32,34}; //七段顯示器之a,b,c,d,e,f,g 接腳
int t0_state=0,t1_state=0,t2_state=0; //記錄各計時器執行之狀態
int IN_state[]={0,0,0}; //記錄各計時器輸入之狀態
//char keyin; //記錄序列埠輸入之字元
void t0_ISR(){ //t0計時副程式
if(t0_state >= 4) //若超出範圍時
t0_state=0; //回復狀態0
for(int i=0;i<4;i++)
digitalWrite(LED_L[i],1);//使LED陣列左側4顆不亮
switch(IN_state[0]){//切換模式
case 0: digitalWrite(LED_L[t0_state],0);break;//模式0,左至右,單燈亮
case 1: for(int i=0;i<=t0_state;i++)
digitalWrite(LED_L[i],0);break;//模式1,左至右,逐燈亮
case 2: digitalWrite(LED_L[3-t0_state],0);break;//模式2,右至右,單燈亮
case 3: for(int i=0;i<=t0_state;i++)
digitalWrite(LED_L[3-i],0);break;//模式3,右至左,逐燈亮
}//switch(IN_state[0])結束
t0_state++;//下次進入之狀態
}//t0_ISR()結束
void t1_ISR(){//t1計時副程式
if(t1_state>=4)
t1_state=0; //超出範圍時回復狀態0
for(int i=0;i<4;i++)
digitalWrite(LED_R[i],1); //LED陣列右側4顆不亮
switch(IN_state[1]){ //切換模式
case 0:digitalWrite(LED_R[t1_state], 0);break; //模式0,左至右,單燈亮
case 1:for(int i=0;i<=t1_state;i++) digitalWrite(LED_R[i],0);break;//模式1,左至右,逐燈亮
case 2:digitalWrite(LED_R[3-t1_state], 0);break;//模式2,右至右,單燈亮
case 3:for(int i=0;i<=t1_state;i++) digitalWrite(LED_R[3-i],0);break;//模式3,右至左,逐燈亮
}
t1_state++;} //進入下次狀態
void t2_ISR(){ //t2計時副程式
if(t2_state>=8) t2_state=0; //超出範圍時回復狀態0
for(int i=0;i<7;i++) digitalWrite(SEG[i],0); //七段顯示器不亮
switch(IN_state[2]){ //切換模式
case 0:digitalWrite(SEG[t2_state], 1);break;//模式0,a至g,單燈亮
case 1:for(int i=0;i<=t2_state;i++) digitalWrite(SEG[i],1);break;//模式1,a至g,逐燈亮
case 2:digitalWrite(SEG[6-t2_state], 1);break;//模式2,g至a,單燈亮
case 3:for(int i=0;i<=t2_state;i++) digitalWrite(SEG[6-i],1);break;//模式3,g至a,逐燈亮
}
t2_state++;} //下次進入之狀態
void setup() { //初值化設定
Serial.begin(9600); //串列埠傳輸鮑率為9600
for(int i=0;i<4;i++) {
pinMode(LED_L[i], OUTPUT); //LED陣列之左側4顆為輸出
digitalWrite(LED_L[i],1); //LED陣列之左側4顆為不亮
pinMode(LED_R[i], OUTPUT); //LED陣列之右側4顆為輸出
digitalWrite(LED_R[i],1); //LED陣列之右側4顆為不亮
}//for迴圈結束
for(int i=0;i<7;i++) {
pinMode(SEG[i], OUTPUT); //七段顯示器之a,b,c,d,e,f,g為輸出
digitalWrite(SEG[i],0); //七段顯示器之a,b,c,d,e,f,g為輸出為不亮
}//for迴圈結束
t0.every(800,t0_ISR);//設定LED左4顆顯示方式,固定每0.8秒,呼叫副程式t0_ISR()
t1.every(200,t1_ISR);//設定LED右4顆顯示方式,固定每0.2秒,呼叫副程式t1_ISR()
t2.every(100,t2_ISR);//設定七段顯示器顯示方式,固定每0.1秒,呼叫副程式t2_ISR()
Serial.println("Input Device Numer 0-2 into next state.");//印出字串不換行
}//setup()結束
void loop() {//無窮迴圈
if(Serial.available()){ //若序列埠有輸入
char keyin=Serial.read(); //讀序列埠輸入之字元
if(keyin>='0' && keyin<='2') { //若輸入字元為'0'~'2'
Serial.print("Change State Device = ");//印出字串不換行
Serial.println(keyin); //印出輸入之字元並換行
IN_state[keyin-'0']++; //輸入之裝置進入下一模式
if(IN_state[keyin-'0']>4) //若模式超過4(在5以上)
IN_state[keyin-'0']=0; //回復為模式0
for(int i=0;i<3;i++){ //印出0:LED左4顆、1:右4顆及2:七段顯示器之模式
Serial.print("Device"); Serial.print(i);
Serial.print(",State="); Serial.println(IN_state[i]);
}//for迴圈結束
}//if結束
}
t0.update(); //檢查更新計時器t0
t1.update(); //檢查更新計時器t1
t2.update(); //檢查更新計時器t2
}//loop()結束