我正在使用XC8编译器开发一个带有PIC的小型嵌入式应用程序。在XC8中设置引脚(输出或输入)的用法,程序员应该执行如下指令:
TRISAbits.RA0 = 1;
特别:
- 寄存器前缀中的 TRIS(常量)
- A 是端口
- 位是后缀(常量)
- RA0 是引脚的名称
我想做的是用人类可读的名称定义所有引脚,例如:
#define LED_1 A,RA0
#define LED_2 A,RA1
#define SWITCH_1 B,RB5
...
并定义一些宏,如SET_OUTPUT
或SET_INPUT
以这种方式使用:SET_OUTPUT(LED_1)
。
我尝试做的是这两个宏:
#define SET_INPUT(port, pin) TRIS ## port ## bits. ## pin ## = 0
但是,先前定义的常量内的逗号不会扩展并解释为单个参数。我也试过:
#define SET_INPUT(X) SET_INPUT_(X ## "")
#define SET_INPUT_(port, pin) TRIS ## port ## bits. ## pin ## = 0
没有成功。
本质上与这个问题相反:C/C++ 宏中的逗号
是否存在解决方案或更方便的方法?
你很接近:
#define SET_INPUT(X) SET_INPUT_(X)
#define SET_INPUT_(port, pin) TRIS ## port ## bits.pin = 1
##
仅用于粘贴两个令牌以形成另一个令牌。 对于您没有形成新令牌的情况(例如 bits.pin
)你不需要做任何特别的事情。
我建议对宏进行语句化:
#define SET_INPUT_(port, pin) do { TRIS ## port ## bits.pin = 1; } while (0)