こんにちは。8051 などではビット別に制御する関数がありましたが、AVRではそのような関数があまりないため、ご不便を感じる方々を多く見かけました。例えば、8051では P1.0 = 1; のようにすれば、ポート 1の 0番ビットを1で使うことができたのです。非常に便利でした。
ところが、そのようにすると、ヘキサコードが大きくなり、ICCAVRではそのような関数がありません。自主的に製作して使わなければなりません。それで、下記のように作って使ったりします。下記はビット制御を行う入出力関連の定義です。 関数にして使うこともできますが、下記のようにディファイン(define)文章にして使えば便利で速くなります。関数に入らなくても済むからです。
関数に入る時間が省かれることになるでしょう。ご参考ください。
-下記1-
#define sbi(port, bit) (port) |= (1 << (bit))
#define cbi(port, bit) (port) &= ~(1 << (bit))
- 下記2-
#define OUTPORT PORTC
#define BIT_4 0x10
#define BIT_5 0x20
#define BIT4(m) m?(OUTPORT|=BIT_4):(OUTPORT&=~BIT_4)
#define BIT5(m) m?(OUTPORT|=BIT_5):(OUTPORT&=~BIT_5)
下記2のようにすると、それなりに便利である場合もあります。しかし、通常は下記1にして多く使います。 入力を受ける場合には
#define INPORT PINC
unsigned char test4, test5;
test4=INPORT&(0x10);
test5=INPORT&(0x20);
このようにすればいいです。ありがとうございます。