| (OR)原文C++のOR(論理和)演算子|は2つの整数の間で使われます。OR演算子は値の各ビットに対して個別に、次のようなルールで計算を行います。 どちらのビットも1なら1 どちらか一方が1のときも1 どちらも0のときは0 0 0 1 1 値1 0 1 0 1 値2 ---------- 0 1 1 1 (値1 | 値2) の結果 int a = 92; // 二進数の 0000000001011100 int b = 101; // 二進数の 0000000001100101 int c = a | b; // 計算結果 0000000001111101 (十進数の125) 【例】 ビット演算子ANDとORは、ポートに対するRead-Modify-Writeと呼ばれる処理によく使われます。 マイクロコントローラのポートはピンの状態を示す8ビットの数値で表されます。ポートに対して(数値を)書き込むことで、それらのピンを一度にコントロールできます。 PORTDはデジタルピン0〜7の出力の状態を参照するための組み込み定数です。あるビットが1だとすると、そのピンはHIGHです(そのピンはあらかじめpinModeでOUTPUTに設定されている必要があります)。 さて、試しにPORTD = B10001100と書き込んでみましょう。ピン2、3、7がHIGHになりましたが、ここで1つひっかかることがあります。この処理によって、Arduinoがシリアル通信に使うピン0と1の状態まで変えてしまったかもしれません。そうすると、シリアル通信に悪影響が出ます。 アルゴリズム: ・PORTDの状態を取得してコントロールしたいピンに一致するビットだけをクリア(AND演算子を使用) ・変更されたPORTDの値と新しい値を結びつける(OR演算子を使用) 次の例では、6本のピンにつながったLEDに二進数の値を表示します。 int i; // カウンタ
int j;
void setup(){
// ピン2から7のdirection bitをセット
// ただし、ピン0,1には触らない(xx | 00 == xx)
// これはピン2〜7にpinMode(pin, OUTPUT)をするのと同じ
DDRD = DDRD | B11111100;
Serial.begin(9600);
}
void loop(){
for (i=0; i<64; i++){
// ビット2〜7をクリア
// ただし、ピン0,1には触らない(xx & 11 == xx)
PORTD = PORTD & B00000011;
// ピン0,1を避けるため変数をピン2〜7の位置へ左シフト
j = (i << 2);
// LEDが繋がっているポートの値に、新しい値を結びつける
PORTD = PORTD | j;
Serial.println(PORTD, BIN); // デバッグ用
delay(100);
}
}
[目次へ戻る] |
Creative Commons Attribution-ShareAlike 3.0 License.
このドキュメントはArduino Teamにより執筆され、Takumi Funadaが翻訳し、一部加筆修正したものです
ご意見はtf at musashinodenpa.comまでお送りください
[ドキュメント一覧]