I/Oピンのバイト幅での入出力の方法は?
2つの方法を下記に示します。: #BYTEを使用するときは、作成された変数はメモリーのように扱われます。
ユーザーはSET_TRIS_X関数によりトライステート・コントロール・レジスターを
メンテして下さい。
すなわち、#BYTEでポートレジスタを指定します。(メモリー・マップドI/Oと同じ)トライステート・レジスター設定を入力(0)出力(1)に指定し、あとはポートに書き込むことで出力。ポートから読み込むと入力となります。
次に構造体を用いたI/Oアクセスの例を示します。: #byte PORTB = 6
#define ALL_OUT 0
#define ALL_IN 0xff
main() {
int i;
set_tris_b(ALL_OUT);
PORTB = 0; // すべてのピンをローにセット
for(i=0;i<=127;++i) // 0 〜 127を即座にカウント
PORTB=i; // I/O ポート・ピン
set_tris_b(ALL_IN);
i = PORTB; // i はportbの値を含む
}
struct port_b_layout {int data : 4; int rw : 1; int cd : 1; int enable : 1; int reset : 1; };
struct port_b_layout port_b;
#byte port_b = 6
struct port_b_layout const INIT_1 = {0, 1,1,1,1};
struct port_b_layout const INIT_2 = {3, 1,1,1,0};
struct port_b_layout const INIT_3 = {0, 0,0,0,0};
struct port_b_layout const FOR_SEND = {0,0,0,0,0}; // すべて出力
struct port_b_layout const FOR_READ = {15,0,0,0,0}; // データは入力
main() {
int x;
set_tris_b((int)FOR_SEND); // 定数の構造は
// バイトのように扱われ、そして、
// データの方向をセットするために使用されます。
port_b = INIT_1;
delay_us(25);
port_b = INIT_2; // これらの定数の構造は
delay_us(25); // ポート上のすべてのフィールドで
port_b = INIT_3; // シングル・コマンドとしてセットするために使用されます。
set_tris_b((int)FOR_READ);
port_b.rw=0; // ここで
port_b.cd=1; // 各フィールドは
port_b.enable=0; // 別個にアクセスされます。
x = port_b.data;
port_b.enable=0
}