1

我在为我的 PIC构建C宏时遇到问题。其他基于 C 的系统也是如此,因此也非常欢迎非 PIC C专家。

假设我已经定义了我的 LED_1 引脚:

#define LED_1 A1    //A1 as output for LED_1

所以如果我想点亮一个 LED,我会写:

PORTAbits.RA1 = 1;

如果我想使用我的 LED_1 定义来完成它,我必须再添加两个宏:

#define change_PORT_(var) PORTAbits.R##var
#define change_PORT(var) change_PORT_(var

并使用它:

change_PORT(LED_1) = 1;

它就像一个魅力。但问题是在上面的定义中我有

端口A位。##var

那么如果我想改变 PORTB 的值呢?我将不得不为端口 A 和 B 构建单独的宏。但它甚至不是一个强大的解决方案。我想出了一个主意,我不知道为什么,它不起作用。

#define LED_1 A1
#define LED_2 B1

#define __A1 A   //This would be defined for all PORTA's pins such as A2,A3,A4 etc
#define __B1 B

#define ___change_PORT(var,var2)    PORT##var2 bits.R##var
#define __change_PORT(var,var2)   ___change_PORT(var,var2)
#define _change_PORT(var)    __change_PORT(var,__##var) // creating e.g. __A1
#define change_PORT(var)   _change_PORT(var)

当我尝试运行它时:

change_PORT(LED_1);

编译器将__##var更改为___A1但它永远不会将__A1更改为A,因此此 MACRO 无法按预期工作。

我花了很多时间试图修复它,所以我很感激任何帮助:)


编辑::


我可能已经找到解决问题的方法:
(LAT 只是另一个寄存器名称,但它与 PORT 的工作方式相同,因此此名称更改无关紧要)

#define ___PORTchange(var,var2) PORT##var2##bits.R##var
#define __PORTchange(var,var2)  ___PORTchange(var,var2)
#define CHANGE_TO_PORT_NAME(var) ___##var
#define _PORTchange(var)    __PORTchange(var,CHANGE_TO_PORT_NAME(var))
#define PORTchange(var) _PORTchange(var)

但我得到一个编译器错误:

100:PORTAbits.RA0 = 1;
^ (374) 缺少基本类型;int 假定(警告)
^(983)存储类重新声明
^(984)类型重新声明
^(239)标识符“PORTAbits”重新定义(从第3900行)
^(314)“;” 预期的

所以不,它确实正确地替换了它,但我收到一个编译器警告,告诉我我重新定义了我无法理解的 PORTAbits。我只是想让预处理器将PORTchange(var)更改为PORTxbits.Rvar,其中 x 是 A 或 B。但似乎我正在重新声明一些东西。

我不明白。

4

1 回答 1

2

如果我预处理(尝试了几个 gcc 版本和 sun cc)

#define LED_1 A1
#define LED_2 B1

#define __A1 AX
#define __B1 BX

#define ___change_PORT(var,var2)    PORT##var2##bits.R##var
#define __change_PORT(var,var2)   ___change_PORT(var,var2)
#define _change_PORT(var)    __change_PORT(var,__##var)
#define change_PORT(var)   _change_PORT(var)

change_PORT(LED_1);
change_PORT(LED_2);

我明白了

PORTAXbits.RA1;
PORTBXbits.RB1;

这显然是你想要的。您的编译器中的错误?

于 2011-04-16T16:53:33.883 回答