【发布时间】:2020-09-26 02:27:35
【问题描述】:
我知道,上面有很多帖子,但我还是不明白。 我想用#define 简化对微控制器的端口处理。通常你会这样做
DDRA |= (1 << PORTA0) // set pin 0 at port A as OUTPUT
PORTA |= (1 << PORTA0) // set pin 0 at port A
“PORTA”、“DDRA”和“PORTA0”是 avr/io.h 扩展为数字的宏。
目前我喜欢这样:
// pinControl.h
#define setPin(port, pin) (port |= (1 << pin))
#define setOutput(ddr, pin) (ddr |= (1 << pin))
// some other file.h
#define myPinPort PORTA
#define myPinDDR DDRA
#define myPin PORTA0
setOutput(myPinDDR, myPin)
setPin(myPinPort, myPin)
现在,如果端口更改并且我有很多引脚,我需要始终将每个 DDRA 和 PORTA 更改为例如到 DDRB 和 PORTB。 我想像这样简化它:
// pinControl.h
#define stringify1(x) #x
#define stringify(x) stringify1(x)
#define setPin(port, pin) (stringify(PORT)##port |= (1 << stringify(PORT)##port##pin))
#define setOutput(port, pin) (stringify(DDR)##port |= (1 << stringify(PORT)##port##pin))
// some other file.h
#define myPinPort A
#define myPin 0
setOutput(myPinPort, myPin); // shall expand to "DDRA |= (1 << PORTA0)";
setPin(myPinPort, myPin); // shall expand to "PORTA |= (1 << PORTA0);"
我真的对得到这个结果的语法感到困惑:(:(
【问题讨论】:
标签: po