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)