我正在尝试使用宏轻松更改我的头文件。我正在调试我的代码,似乎这些宏没有做它们应该做的事情。有人能告诉我如何达到以下效果吗? LED_ID_AMS等
#define LED_NUMBER (2)
#define LED_ID_X (0)
#define LED_ID_Y (1)
#define LED_PIN_X (0)
#define LED_PIN_Y (3)
#define LED_PORT_X (PORTE)
#define LED_PORT_Y (PORTG)
#define LED_DD_X (DDRE)
#define LED_DD_Y (DDRG)
#define LED_PORT(LED_ID_X) (LED_PORT_X)
#define LED_PORT(LED_ID_Y) (LED_PORT_Y)
#define LED_PIN(LED_ID_X) (LED_PIN_X)
#define LED_PIN(LED_ID_Y) (LED_PIN_Y)
#define LED_DD(LED_ID_X) (LED_DD_X)
#define LED_DD(LED_ID_Y) (LED_DD_Y)
我想要实现什么目标?
我正在尝试这样做,以便我可以像这样循环访问端口初始化:
for(i=0;i<LED_NUMBER;i++){
/* set data direction to output*/
LED_DD(i)|=((0x01)<<LED_PIN(i));
/* turn on led */
LED_PORT(i)|=((0x01)<<LED_PIN(i));
}
最佳答案
以后你会后悔使用了太多的宏。实际上,您已经后悔了,因为它们不起作用,而且作为宏,它们非常难以调试。
简单说几点:
- 您的
LED_PIN(i)
表达式始终扩展为0
- 您的
LED_PORT(i)
表达式始终会扩展为PORTE
,无论它是什么
例如,LED_PIN(LED_ID_X)
扩展为 LED_PIN_X
。请注意,根本没有使用宏参数LED_ID_X
。相反,LED_PIN_X
只是扩展为 0
。
关于C 宏产生意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22439987/