2016-11-17 36 views
1

私はコード・コンポーザー・スタジオでこのCプログラムを書いています。なぜ私のCプログラムはこのif文をスキップしますか?

#include <msp430.h> 

/* 
* main.c 
*/ 
int main(void) 
{ 
    WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer 

    int R5_SW=0, R6_LED=0, temp=0; 

    P1OUT = 0b00000000;  // mov.b #00000000b,&P1OUT 
    P1DIR = 0b11111111;  // mov.b #11111111b,&P1DIR 
    P2DIR = 0b00000000;  // mov.b #00000000b,&P2DIR 

    while (1) 
    { 
     // read all switches and save them in R5_SW 
    R5_SW = P2IN; 

    // check for read mode 
     if (R5_SW & BIT0) 
      { 
      R6_LED = R5_SW & (BIT3 | BIT4 | BIT5); // copy the pattern from the switches and mask 
      P1OUT = R6_LED;   // send the pattern out 
      } 

     // display rotation mode 
     else 
      { 
      R6_LED = R5_SW & (BIT3|BIT4|BIT5); 
      // check for direction 
      if (R5_SW & BIT1) {// rotate left 
       R6_LED << 1; 
      } else { 
       R6_LED >> 1; 
      } // rotate right 

      // mask any excessive bits of the pattern and send it out 
      R6_LED &= 0xFF;    // help clear all bits beyound the byte so when you rotate you do not see garbage coming in 
       P1OUT = R6_LED; 

       // check for speed 
      if (R5_SW & BIT2) {__delay_cycles(40000); } //fast 
       else   {__delay_cycles(100000); } //slow 
     } 
    } 
} 

なステートメントあれば、それは

if (R5_SW & BIT1) {// rotate left 
    R6_LED << 1; 
} else { 
    R6_LED >> 1; 
} // rotate right 

デバッグモードでこれになるとそれはそれをスキップし、それがあればまたはelseブロックを実行しません。コードR5_SWのこの時点では22であり、0010 0010は2進数なので、R5_SW & BIT1はtrueと評価されます。私はここで何が欠けていますか?

+1

あなたはあなたの計算を格納していないifまたはelseのいずれかを確実に実行しています。私はあなたが 'R6_LED << = 1;'と 'R6_LED >> = 1;'を意味すると思います。 – quamrana

+0

小数点では「22」は「00010110」です。 '0x22 'は' 00100010' –

答えて

5

<<または>>のような操作を割り当てずに使用すると、結果は破棄されます。

if (R5_SW & BIT1) {// rotate left 
      R6_LED = R6_LED << 1; 
     } else { 
      R6_LED = R6_LED >> 1; 
     } // rotate right 

または、簡潔にするために::このお試しくださいコードのこの作品

if (R5_SW & BIT1) {// rotate left 
      R6_LED <<= 1; 
     } else { 
      R6_LED >>= 1; 
     } // rotate right 
3

を...

if (R5_SW & BIT1) {// rotate left 
    R6_LED << 1; 
} else { 
    R6_LED >> 1; 
} // rotate right 

R6_LED >> 1または式R6_LED << 1のいずれかを評価しますが、それはしませんその結果に何かをするので、コンパイラはIF文全体をそれを投げ捨てることを選択します。

a>>bなどの行は、それ自体ではaを変更しません。例えばa++のようなものではなく、aを修正したものではありません。

関連する問題