CC-RXのBIT操作の挙動
#include "platform.h" // for PORTF // 引数をそのままBITフィールド値にセットする方法 void dio_F5_set(int x) { PORTF.PODR.BIT.B5 = x; /* 一回読み出してORして書き戻すので排他が必要 MOV.L #000000DFH, R15 MOV.L #0008C02FH, R14 AND [R14].UB, R15 SHLL #05H, R1 AND #20H, R1 OR R1, R15 MOV.B R15, [R14] RTS*/ } // 定数1をBITフィールドにセットする方法 static inline void dio_F5_ON(void) { PORTF.PODR.BIT.B5 = 1; /* 定数を代入する分にはBSET命令に展開される。 MOV.L #0008C02FH, R14 BSET #05H, [R14].B RTS */ } // 定数0をBITフィールドにセットする方法 static inline void dio_F5_OFF(void) { PORTF.PODR.BIT.B5 = 0; /* 定数を代入する分にはBCLRに展開される MOV.L #0008C02FH, R14 BCLR #05H, [R14].B RTS */ } // 引数で事前に条件分岐して定数を書く方法 void dio_F5_set2(int x) { if (x) { PORTF.PODR.BIT.B5 = 1; } else { PORTF.PODR.BIT.B5 = 0; } /* これならBSET,BCLRが呼ばれるため排他不要で使い勝手が良さそう CMP #00H, R1 MOV.L #0008C02FH, R14 BNE L356 L355: ; if_else_bb BCLR #05H, [R14].B RTS L356: ; if_then_bb BSET #05H, [R14].B RTS */ } void dio_F5_set3(int x) { if (x) { dio_F5_ON(); } else { dio_F5_OFF(); } }