1

我正在使用 XC8 编译器开发一个带有 PIC 的小型嵌入式应用程序。在 XC8 中设置引脚的使用(输出或输入),程序员应该执行如下指令:

TRISAbits.RA0 = 1;

尤其是:

  • 寄存器前缀中的 TRIS(常量)
  • A是端口
  • bits 是后缀(常量)
  • RA0 是引脚的名称

我想要做的是用人类可读的名称定义所有引脚,例如:

#define LED_1     A,RA0
#define LED_2     A,RA1
#define SWITCH_1  B,RB5
...

并以这种方式定义一些类似SET_OUTPUT或使用的宏: .SET_INPUTSET_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

没有成功。

本质上与这个问题相反:Comma in C/C++ macro

它是否存在解决方案或更方便的方法来做到这一点?

4

1 回答 1

3

你很接近:

#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)
于 2016-06-12T21:18:44.003 回答