構造体・変数中の特定のビットに名前をつける



1.配列の中身をわかりやすくする

配列は便利ですが、中に入っている値が、各個別々の意味を持った配列の場合
インデックスだけではわかりにくいことがあります。

そういうときには配列ではなく、構造体を使ったほうがわかりやすいです。


構造体は

struct aData {
BYTE LeftV;
BYTE RightV;
BYTE LeftH;
BYTE RightH;
}AData;

こんな風に書きますが、たくさんの変数を使いたい場合は、構造体の型を定義したほうが楽です。

typedef struct aDataType {
BYTE LeftV;
BYTE RightV;
BYTE LeftH;
BYTE RightH;
}ADataType;

こう書くと、

ADataType a;

などと複数の変数を記述することができます。
また、最初は配列としてデータが入ってくるけど、
実際には構造体を使ったほうが楽に編集できるという場合、
ポインタをキャストして使うと便利です。

void someproc(char data[]){
ADataType * trueData = (ADataType *)data;

trueData->LeftV = ...

のような感じですね。

2.変数中の特定のビットに名前をつける

XC8ではビット単位で名前をつけて構造体にすることができます。

CS8416のコントロールレジスタ1を参考にすると



union {
BYTE all;
struct {
unsigned CHS:1; // bit0
unsigned RMCKF:1;
unsigned HOLD:2;
unsigned INT:2;
unsigned MUTESAO:1;
unsigned SWCLK:1; // bit7
} bits;
}CS8416_Control1 = { CS8416_Control1_Default };


と書けます。
共用体にしているのは、変数全bitにアクセスするときに使うためです。
また、allの方を先にしているのは、最後に変数の初期値を与えるときに
共用体の最初に定義されているものが使われるからです。