アットウィキロゴ

特定のビットを書き換える方法

 マイコンを使ってハードウエアの制御をすると、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