为微控制器编程可重用模块(在我的情况下为AVR)需要一般IO引脚的灵活性.每个引脚由字母(AG)和数字(0-7)定义.然而,它由三个寄存器中相同位置的一位控制.因此配置文件需要包含四个条目(指向寄存器的3个指针+ 1个位置),这不是那么优雅.
简单的解决方法是简单地接受这个,但由于这是一个常见的问题,它至少应该得到一点关注.
让预编译器像这样重复工作会很好:
//CONFIGURATION
#define IO_NAME B5
//MACRO
#define PORT_(ID)
#define PIN_(ID)
#define DDR_(ID)
#define BIT_(ID)
Run Code Online (Sandbox Code Playgroud)
结果应如下所示
PORT_(IO_NAME) => PORTB
PIN_(IO_NAME) => PINB
DDR_(IO_NAME) => DDRB
BIT_(IO_NAME) => 5
Run Code Online (Sandbox Code Playgroud)
结果表达式在AVR Studio中定义.
我无法弄清楚如何忽略字母而不是数字,所以我尝试了连接:
#define PORT_(REG, BIT) PORT_2(REG, BIT)
#define PIN_(REG, BIT) PIN_2(REG, BIT)
#define DDR_(REG, BIT) DDR_2(REG, BIT)
#define PORT_2(REG, BIT) (PORT ## REG)
#define PIN_2(REG, BIT) (PIN ## REG)
#define DDR_2(REG, BIT) (DDR ## REG)
#define BIT(REG, BIT) (BIT)
Run Code Online (Sandbox Code Playgroud)
额外的层需要使用任何#defined值作为REG或BIT.
以下代码按预期工作:
#define IO_NAME_REG B
#define IO_NAME_BIT …Run Code Online (Sandbox Code Playgroud)