但根據Cortex-M3硬體結構當使用PA0當外部中斷時,PB0、PC0等即無法設為外部中斷。本實驗使用PA0、PA1當搶答外部中斷,PA2為復位外部中斷。PB0與PB1連接LED顯示誰先搶到答題權。
連接按鈕部分使用硬體RC debounce線路,整個線路連接如下圖所示
完成展示影片如下,最右邊的按鈕為復位按鈕,關掉LED,回到可搶答狀態。
軟體主要使用API
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);來設定外部中斷ISR(Interrupt Service Routine),因為按鈕設計平時為高電位,偵測按下時的Mode為FALLING。
完整程式如下:
uint16_t ip1 = PA0; uint16_t led1 = PB0; uint16_t ip2 = PA1; uint16_t led2 = PB1; uint16_t ip_init = PA2; volatile bool i1_pressed, i2_pressed; void setup() { // put your setup code here, to run once: Serial.begin(9600); pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(ip1, INPUT); pinMode(ip2, INPUT); pinMode(ip_init, INPUT); led_init(); attachInterrupt(digitalPinToInterrupt(ip1), ip1_isr, FALLING); attachInterrupt(digitalPinToInterrupt(ip2), ip2_isr, FALLING); attachInterrupt(digitalPinToInterrupt(ip_init), led_init, FALLING); } void led_init(void) { i1_pressed=false; i2_pressed=false; digitalWrite(led1, LOW); digitalWrite(led2, LOW); Serial.println("ip_init"); } void ip1_isr(void) { if (i2_pressed) return; i1_pressed=true; digitalWrite(led1, HIGH); Serial.println("ip1"); } void ip2_isr(void) { if (i1_pressed) return; i2_pressed=true; digitalWrite(led2, HIGH); Serial.println("ip2"); } void loop() { // put your main code here, to run repeatedly: }