I/Oピンのバイト幅での入出力の方法は?

2つの方法を下記に示します。:

#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の値を含む
}

#BYTEを使用するときは、作成された変数はメモリーのように扱われます。 ユーザーはSET_TRIS_X関数によりトライステート・コントロール・レジスターを メンテして下さい。 すなわち、#BYTEでポートレジスタを指定します。(メモリー・マップドI/Oと同じ)トライステート・レジスター設定を入力(0)出力(1)に指定し、あとはポートに書き込むことで出力。ポートから読み込むと入力となります。

次に構造体を用いたI/Oアクセスの例を示します。:

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
}