(5)レジスタの記述とI/O制御


MPLAB XCコンパイラでレジスタの記述方法について説明します。


A) ヘッダファイルでのSFRの定義
 
XCファミリのCコンパイラを使って基本的なディジタル入出力を行う為には
 レジスタの読み書きで行います。
 この場合I/O関連のレジスタの定義は、ヘッダファイル内で下記のように
 行われています。
 つまり、まずPORTAやPORTBなどの8ビットのレジスタとして定義されているので、
 8ビットレジスタで扱う場合にはPORTAとかPORTBのレジスタ名で直接扱う
 ことができます。
 さらに、下側のようにビットフィールド定義でビットごとに名前が付けられていて
 その場合のレジスタ名をPORTAbits、LATBbitsのようにレジスタ名にbitsを付加
 して定義することになっています。したがって1ビットだけで扱う場合にはbitsの後に
 ドット演算子を付加してからRA0とかRA1とかのビットの名前を付加する必要があり
 ます。

( 例1 :OSCCONレジスタの定義)
 この場合ビットに複数の名前が付けられているのでビットフィールドの定義が
 複数になっています。さらにビットフィールドはIRCFのように複数ビットをまとめて
 一つの名前にできます。


(例2 :PORTCレジスタの定義)
  PORTxレジスタの場合はビット名のPORTがRに省略されます。


(例3 :LATCレジスタの定義)
  この場合はレジスタ名とビット名がLATCと同じになっています。




B) XCコンパイラでのレジスタ記述方法

 (1) レジスタ全体の8ビットに一括で書き込む場合
  この場合には、単純にレジスタ名に8ビットのデータを代入するだけです。

  TRISA = 0;        // ポートAをすべて出力ピンにする
 
 // タイマ2の初期設定の例
  T2CON = 0x7F

  LATA = 0xFF;       // ポートAにFFを出力
  LATC = portc_out;    // portc_outの内容をポートCに出力
  LATB = 0x02;       // ポートBに02を出力


 (2) 1ビットで出力する場合
  上記のようにPORTの各ビットは、xxxbitsというレジスタ名で定義されていますので、
  ドットを付加してビット名称を追加します。

  TRISCbits.TRISC = 0;       //ポートCのビット0を出力モードに設定
  LATAbits.LATA2 = 1;       //ポートAのビット2に1を出力
  LATCbits.LATC3 = 0       //ポートCのビット3に0を出力
 
 //内蔵クロックの周波数の設定の例
  OSCCONbits.IRCF = 14;    // IRCF<3:0>を14に設定


 (3) レジスタの8ビット全体を読み込む場合
  この場合には、レジスタ名をそのまま変数として扱うことができます。
  
  datab = PORTB;         //PORTBを入力して変数databに格納

  if((PORTB & 0x80) == 1)    //PORTBの8ビット目が0か1かの判定



 (4) レジスタの1ビットだけを入力する場合
  この場合にも出力と同様、レジスタ名がxxxbitsとして定義されていますから、
  ドット演算子を付加してからビット名を付加します。
  例えば、指定ピンを入力して0か1で判定する場合には下記のようにします。

   if(PORTCbits.RC7)         //ポートCの8ビット目を入力しテスト
     LATCbits.LATC0 = 0;     // ポートCの1ビット目に0を出力する
   else
     LATCbits.LATC0 = 1     //ポートCの1ビット目に1を出力する


   // タイマ2の割り込みフラグの判定の場合の例
   if(PIR1bits.TMR2IF == 1)