int LED[]={11,10,9,8,7,6,5,4}; //8顆LED_BAR腳(左至右)
int SW[]={2,3,21,20,19,18,13}; //外部中斷腳(MEGA板int0~5)及控制是否中斷腳(13)
int dt=200; //延遲時間為0.2s
volatile char action=0x10; //宣告控制LED動作之變數為全域,預設全部燈熄
void flash(){ //LED閃爍控制副程式,由參數action控制執行動作
for(int i=0;i<8;i++){ //使i=0~7
if (action & 0x01) digitalWrite(LED[i],0);//由左向右亮
if (action & 0x02) digitalWrite(LED[7-i],0);//由右向左亮
if (action & 0x04) delay(dt); //亮燈後延遲0.2s
if (action & 0x10) digitalWrite(LED[i],1);//由左向右熄
if (action & 0x20) digitalWrite(LED[7-i],1);//由右向左熄
if (action & 0x40) delay(dt);//熄燈後延遲0.2s
}//i=0~7之for迴圈結束
}//flash()副程式結束
void clear(){
for(int i=0;i<8;i++) //使i=0~7
digitalWrite(LED[i],1);
}
void int0() {action=0x01;flash();} //外部中斷0副程式,全部_燈亮
void int1() {action=0x01;flash();} //外部中斷1副程式,全部_燈亮
void int2() {action=0x10;} //外部中斷2副程式,全部_燈熄
void int3() {action=0x15;clear();} //外部中斷3副程式,由左向右_單1燈亮
void int4() {action=0x26;clear();} //外部中斷4副程式,由右向左_單1燈亮
void int5() {action=0x37;clear();} //外部中斷5副程式,2燈由兩側向中央再向兩側
void setup() {//初始化設定函數
for(int i=0;i<8;i++)
pinMode(LED[i], OUTPUT); //設定8顆LED_BAR腳為輸出
for(int i=0;i<7;i++)
pinMode(SW[i], INPUT_PULLUP); //設定開關接腳為輸入,加提升電阻
attachInterrupt(0, int0, LOW); //外部中斷0啟用,中斷程式為int0,低準位觸發
attachInterrupt(1, int1, CHANGE); //外部中斷1啟用,中斷程式為int1,邊緣改變時觸發
attachInterrupt(2, int2, RISING); //外部中斷2啟用,中斷程式為int2,正緣觸發
attachInterrupt(3, int3, FALLING);//外部中斷3啟用,中斷程式為int3,負緣觸發
attachInterrupt(4, int4, FALLING);//外部中斷4啟用,中斷程式為int4,負緣觸發
attachInterrupt(5, int5, FALLING);//外部中斷5啟用,中斷程式為int5,負緣觸發
}//setup()結束
void loop() {//無窮迴圈函數
if(digitalRead(SW[6]) == 0) //若當最右指撥開關(D13)上撥(on),讀入值為0
noInterrupts(); //停止中斷功能
else//若當最右指撥開關(D13)未撥,即D13為HIGH
interrupts();//啟用全部中斷功能
flash();//執行燈閃爍控制
}//loop()結束