あらやんズDiaryリターンズ

ビットフィールドアクセスの共通化

汎用ポートのアクセスに、ビットフィールドを利用していたんだけど
ポートの番号とビットの番号(意味わかるかなあ?)を指定して
目的のデータビットにアクセスする処理を作ることになって。

(個人的には(せっかく?)定義されてるビットフィールドを
 無駄にする気がしてしかたがないのだけれど。)

ーー(省略)ーー struct st_p1 {   union {   unsigned char BYTE; struct {   unsigned char B7:1; unsigned char B6:1; unsigned char B5:1; unsigned char B4:1; unsigned char B3:1; unsigned char B2:1; unsigned char B1:1; unsigned char B0:1; } BIT; }DR; } ーー(省略)ーー #define P1(*(volatile struct st_p1 *)ポートのアドレス); #define P2(*(volatile struct st_p2 *)ポートのアドレス); #define P3(*(volatile struct st_p3 *)ポートのアドレス); ・ ーー(省略)ーー ・
↑みたいな構造体を使ってアクセスしてたのを、 ポート番号、ビット番号を指定して共通の関数で アクセスするように変更するんだけど・・・

P1.DR.BIT.B1= ON、をSetPort(PORT1,BIT1,ON);こんな感じ?

問題はどうやって実現しようかなあ、というところで。

//const unsigned char *PortTbl[ ] = {
※コメントで間違いを指摘していただきましたが、よく考えたらconstつけちゃうと、参照先に書き込みができないですね?・・・orz
unsigned char * const PortTbl[ ] = {

&(P1.DR.BYTE),
&(P2.DR.BYTE),
&(P3.DR.BYTE),
 ・
 ・
};

const unsigned char BitCheck[ 8 ] = {
0x01,
0x02,
0x04,
0x08,
0x10,
0x20,
0x40,
0x80
};

void SetPort( UI_8 port,UI_8 bit, B_8 data ){
UI_8 temp;
ーー(省略)ーー
 temp = *PortTbl[port];
 temp |= BitCheck[bit];
 *PortTbl[port] = temp;
ーー(省略)ーー
 return;
}

こんな感じのを考えてみたんだけど、どうだろう?
もっといい手があれば知りたいデス。

Comments

※コメントの受け付けは終了しています。