#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 led_state[]={0,0,0};//記錄各裝置之目前點亮燈號狀態(LED為0-3,七段為0-6)
int MODE[]={0,0,0}; //記錄各裝置之亮燈模式(0-4)
//亮燈模式,0:左至右單燈,1:左至右逐燈,2:右至左單燈,3:右至左逐燈,4:全亮
void t0_ISR(){ //t0計時器中斷副程式,改變LED左側4燈狀態
if(led_state[0] > 3) //若點亮之LED燈號,超出範圍(0-3)時
led_state[0]=0; //回到點亮燈號0(最左)
int state=led_state[0]; //記錄點亮燈號狀態至變數state
for(int i=0;i<4;i++) //使LED燈全不亮
digitalWrite(LED_L[i],1);
switch(MODE[0]){//依照裝置之模式選不同亮法
case 0: digitalWrite(LED_L[state],0);break; //模式0,左至右,單燈亮
case 1: for(int i=0;i<=state;i++) //模式1,左至右,逐燈亮
digitalWrite(LED_L[i],0);break;
case 2: digitalWrite(LED_L[3-state],0);break;//模式2,右至右,單燈亮
case 3: for(int i=0;i<=state;i++) //模式3,右至左,逐燈亮
digitalWrite(LED_L[3-i],0);break;
case 4: for(int i=0;i<4;i++) //模式4,全亮
digitalWrite(LED_L[i],0);
}//switch()結束
led_state[0]++;//改成亮下個燈
}//t0_ISR()結束
void t1_ISR(){ //t1計時器中斷副程式,改變LED右側4燈狀態
if(led_state[1] > 3) //若點亮之LED燈號,超出範圍(0-3)時
led_state[1]=0; //回到點亮燈號0(最左)
int state=led_state[1];//記錄點亮燈號狀態至變數state
for(int i=0;i<4;i++) //使LED燈全不亮
digitalWrite(LED_R[i],1);
switch(MODE[1]){//依照裝置之模式選不同亮法
case 0: digitalWrite(LED_R[state],0);break; //模式0,左至右,單燈亮
case 1: for(int i=0;i<=state;i++) //模式1,左至右,逐燈亮
digitalWrite(LED_R[i],0);break;
case 2: digitalWrite(LED_R[3-state],0);break;//模式2,右至右,單燈亮
case 3: for(int i=0;i<=state;i++) //模式3,右至左,逐燈亮
digitalWrite(LED_R[3-i],0);break;
case 4: for(int i=0;i<4;i++) //模式4,全亮
digitalWrite(LED_R[i],0);
}//switch()結束
led_state[1]++;//改成亮下個燈
}//t1_ISR()結束
void t2_ISR(){ //t2計時器中斷副程式,改變七段顯示器狀態
if(led_state[2] > 6) //若點亮之LED燈號,超出範圍(a-g,即0-6)時
led_state[2]=0; //回到點亮燈號0(a段)
int state=led_state[2];//記錄點亮燈號至變數state
for(int i=0;i<7;i++) //使七段全不亮
digitalWrite(SEG[i],0);
switch(MODE[2]){//依照裝置之模式選不同亮法
case 0: digitalWrite(SEG[state],1);break; //模式0,a至g,單燈亮
case 1: for(int i=0;i<=state;i++) //模式1,a至g,逐燈亮
digitalWrite(SEG[i],1);break;
case 2: digitalWrite(SEG[6-state],1);break; //模式2,g至a,單燈亮
case 3: for(int i=0;i<=state;i++) //模式3,g至a,逐燈亮
digitalWrite(SEG[6-i],1);break;
case 4: for(int i=0;i<7;i++) //模式4,全亮
digitalWrite(SEG[i],1);
}//switch()結束
led_state[2]++;//改成亮下個燈
}//t2_ISR()結束
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("輸入裝置號碼(0-2)可進入不同模式(0-4)");//印出字串換行
Serial.println("模式0:左至右單燈亮,模式1:左至右逐燈亮");//印出字串換行
Serial.println("模式2:右至左單燈亮,模式3:右至左逐燈亮,模式4:全亮");//印出字串換行
}//setup()結束
void loop() {//無窮迴圈
if(Serial.available()){ //若序列埠有輸入
char keyin=Serial.read(); //讀序列埠輸入之字元
if(keyin>='0' && keyin<='2') { //若輸入字元為'0'~'2'
int device = keyin-'0'; //輸入之字元轉成裝國號碼
Serial.print("=>改變裝置號"); //印出字串,不換行
Serial.print(device); //印出裝置號,不換行
MODE[device]++; //輸入之裝置,進入下一模式
Serial.print("=>至模式"); //印出字串,不換行
Serial.println(MODE[device]); //印出裝置之模式,並換行
if(MODE[device]>4) //若超出模式範式(0-4)
MODE[device]=0; //回到模式0
for(int d=0;d<3;d++){ //印出0:LED左4顆、1:右4顆及2:七段顯示器之模式
Serial.print("裝置");Serial.print(d);
Serial.print("目前為模式");Serial.println(MODE[d]);
}//for結束
}//if(keyin>='0'&&keyin<='2')結束
}//if(keyiSerial.available())結束
t0.update(); //檢查更新計時器t0
t1.update(); //檢查更新計時器t1
t2.update(); //檢查更新計時器t2
}//loop()結束