マイコンを使ってハードウエアの制御をすると、bit単位で値を書き換えたい事が良くある。例えば、LEDの点灯・消灯(PB3~PB0)などの制御では、PB_DRレジスタのbit0を0にするとLED(PB0)が点灯、1にすると消灯する。
一般的なC言語のプログラミングでは、この様なbit操作は、行わない事が多いが、マイコン制御では良く出てくるのでマスターしておく必要がある。
※ちなみに、bitを1にすることを「bitをセットする」、0にすることを「bitをリセットする」と言う。
例えば、次のようなプログラムを考えてみる。
|
#include "monitor.h"
#define PB_DDR (*(volatile unsigned char *)0xFFFFD4)
//アドレス0xFFFFD4へのポインタを定義
#define PB_DR (*(volatile unsigned char *)0xFFFFD6) //アドレス0xFFFFD6へのポインタを定義
int main()
{
PB_DDR = 0x0F; // PBのbit7~4を入力、PBのbit3~0を出力に設定
PB_DR = 0x0D; // ① LED(PB1)を点灯
PB_DR = 0x0B; // ② LED(PB2)を点灯
return 0;
}
|
①では、PB1のみ点灯、②ではPB2のみ点灯となるが、PB1とPB2を両方点灯したいとしたらどうするか。
ビット演算で、特定のビットを1または0にすれば、個別にLEDを制御できる。例えば、
|
#include "monitor.h"
#define PB_DDR (*(volatile unsigned char *)0xFFFFD4)
//アドレス0xFFFFD4へのポインタを定義
#define PB_DR (*(volatile unsigned char *)0xFFFFD6) //アドレス0xFFFFD6へのポインタを定義
int main()
{
PB_DDR = 0x0F; // PBのbit7~4を入力、PBのbit3~0を出力に設定
PB_DR = 0x0D; // ① LED(PB1)のみを点灯
PB_DR = 0x0B; // ② LED(PB2)のみを点灯
PB_DR &= 0x0D; // LED(PB1)とLED(PB2)を点灯
return 0;
}
|
のようにする。ビット演算の詳細については、
最終更新:2014年10月07日 16:16