0

因为我在我的设计中找不到整个端口,但我希望我的程序变得统一(当我更改引脚时,我只需要更改这个数组),所以我想通过在数组中定义它们来创建一个虚拟端口。操作时,我想将每个虚拟引脚设置为循环。这就像下面的那些宏代码(当然我可以为端口和引脚分别定义 2 个数组)。数组(引脚)的长度在编译之前是可变的(可能是 2/3/4 引脚),但这并不重要。

unsigned char bitorder[]={PORTC,6,PORTD,2};
    foreach i,j in (bitorder){
        asm SBI i,j
        // some delay or operation here
        asm CBI i,j
    }

如果这可能?使用函数还是宏?还是指向指针操作的指针?

4

1 回答 1

0

这是可能的,但只能通过获取端口地址,如以下代码所示:

#define PINS_COUNT  2
volatile uint8_t *  ports[PINS_COUNT] = {&PORTB, &PORTD};
uint8_t pins[PINS_COUNT] = {1, 2};
int i;
for (i=0; i<PINS_COUNT; i++) {
    *ports[i] |= pins[i];  //
    /* do something */
    *ports[i] &= ~pins[i];
}

您可以将端口指针和引脚填充到同一个数组中,但请记住 ATmega 指针是 16 位宽的。我确信在汇编中也有这样做的方法,但是由于问题被标记为“C”,我假设您正在寻找 C 解决方案。

于 2013-03-09T01:57:09.280 回答