用switch case 改寫

ISR(TIMER1_COMPA_vect)

{

if ((PINC & 0x08) == 0x08)

{

if (T_10ms_01 > 0)

T_10ms_01--;

else

{

T_10ms_01 = 50;

if (Flag.R_ONOFF_10ms == 0)

{

OCR0B = 0;

}

else

{

OCR0B = 0xff;

}

Flag.R_ONOFF_10ms ^= 1;

}

OCR0A = 0;

OCR2B = 0;

}

else if ((PINC & 0x04) == 0x04)

{

if (T_10ms_02 > 0)

T_10ms_02--;

else

{

if (T_10ms_01 > 0)

T_10ms_01--;

else

{

T_10ms_01 = 50;

if (Flag.R_ONOFF_10ms == F_OFF)

{

OCR0A = D_LED_OFF;

OCR0B = D_LED_OFF;

}

else

{

OCR0A = D_LED_Y;

OCR0B = D_LED_R;}

Flag.R_ONOFF_10ms ^= 1;

}

}

OCR2B = 0;

}

else if ((PINC & 0x01) == 0x01)

{

OCR0A = 0;

OCR0B = 0;

OCR2B = 255;

Flag.R_ONOFF_10ms = F_ON;

}

else if ((PINC & 0x02) == 0x02)

{

OCR0A = 255;

OCR0B = 0;

OCR2B = 0;

Flag.R_ONOFF_10ms = F_ON;

}

else

{

if (T_10ms_01 > 0)

T_10ms_01--;

else

{

T_10ms_01 = 100;

if (ABC ==0)

{

OCR0B = D_LED_R;

OCR2B = D_LED_OFF;

OCR0A = D_LED_OFF;

ABC++;

}

else if(ABC==1)

{

OCR0A = D_LED_G;

OCR0B = D_LED_OFF;

OCR2B= D_LED_OFF;

ABC++;

}

else

{

OCR2B = D_LED_B;

OCR0B = D_LED_OFF;

OCR0A = D_LED_OFF;

ABC=0;

}

}

}

}

ISR(TIMER2_COMPA_vect)

{

}

4 Answers

Rating
  • 其威
    Lv 7
    7 years ago
    Favorite Answer

    要不要把 if((PINC & 0x08) == 0x08) 改成 if(PINC & 0x08),其實沒必要,因為編譯器會幫你做這件事......

    ISR 停留時間應該也還好,提問中的 ISR 只是幾個比較跟設定變數而已。

    2014-05-23 22:27:27 補充:

    程式碼在:

    http://codepad.org/J2cmcVge

    不知道有沒有打錯或少括號之類的,你可能要自己注意一下。

    重點是,你的 PINC 有優先順序,依序是

    0x08 => 0x04 => 0x01 => 0x02 => 其他,所以:

    1. 遇到 0x08 的,其他 bit 都是 don't care 項,必須全部列出來:

    B1000, B1001, B1010, B1011, B1100, B1101, B1110, B1111 八個

    剩下的有 B0000, B0001, B0010, B0011, B0100, B0101, B0110, B0111 八個。

    2. 遇到剩下中有 0x04 的,其他 bit 都是 don't care 項:

    B0100, B0101, B0110, B0111

    剩下 B0000, B0001, B0010, B0011

    3. 遇到 0x01 的,其他 bit 都是 don't care 項:

    B0001, B0011

    剩下 B0000, B0010

    4. 遇到 0x02 的,其他 bit 都是 don't care 項(但是已經沒有其他剩下的了,所以只有一個):

    B0010

    5. default case 處理所有其他輸入,例如 Bxxxxyyyy 與 B00000000 等。

  • Anonymous
    7 years ago

    到下面的網址看看吧

    ▶▶http://candy5660601.pixnet.net/blog

  • 7 years ago

    參考下面的網址看看

    http://phi008780520.pixnet.net/blog

  • ㄚ旺
    Lv 5
    7 years ago

    這段程式碼的判斷邏輯.幾乎都只有單向出口.因此不需要改成switch case .

    可以把

    if ((PINC & 0x08) == 0x08)

    改成

    if (PINC & 0x08)

    達到相同效果.

    另外是...ISR進入與出去的時間不能停留太久.儘可能把一些不需要的邏輯移除即可.

Still have questions? Get your answers by asking now.