3

Keil uVision 4 でプログラミングしています。

次のようなコードがあります。

sbit X = P3 ^ 3; // X is third bit of P3 register

...

    while (1) {
      X = !X; // X equals not X ?!

      if (X == 0)
        printf("0");
      else
        printf("1");
    }

`P3^3このピンにはPIR(パルス赤外線センサー)があるため、汎用入力ピンを制御できます。点滅しているときはその行に1が表示され、眠っているときは0になります。

P3^3プルアップすると1、出力は(予想どおり)10101010101010..

まだ0の場合、出力は(予想外)0000000000000..

私が取得している動作は、sbit XPIRによって設定/設定解除されていることを考慮して、上記で説明したものです..

!質問は、 Keil C51 コンパイラの演算子の意味は何ですか?

4

2 に答える 2

4

Keil C51 で、マニュアルを引用するには:

sbit 型は、特殊機能レジスタ (SFR)内のビットを定義します。

したがって、変数 X を宣言してループの前に一度読み取るのではなく、P3.3 への参照を定義し、ループの反復ごとにその状態を読み取ります。つまり、X はハードウェア I/O ピン レジスタへの参照であり、変数ではありません。

見た目にもかかわらsbitず、単純なtypedefエイリアスで^はなく、ビットごとの XOR 演算子でもありません。むしろ、ビット アドレス指定可能なレジスタへの参照を定義します。ハードウェア レジスタへの書き込みの割り当てX- この場合、動作は言語ではなくハードウェアによって定義されます。!外部からハイにプルされたときに X の値を明らかに変更する機能は、オペレーターの奇妙な動作ではなく、GPIO ハードウェアの性質にあると推測しています。ハードウェアのドキュメントで I/O ピンの動作を確認してください。

動作を取得するには(私は想像します)、次のようにコーディングすることを期待しています:

sbit p = P3 ^ 3; // p is third bit of P3 register


...
int X = p ; // get p's current value

while (1) {
  X = !X; // X equals not X ?!

  if (X == 0)
    printf("0");
  else
    printf("1");
}
于 2013-06-18T19:12:10.737 に答える