虚拟端口可以在atmega MCU上运行吗?

时间:2013-02-06 09:55:25

标签: c atmega

因为我无法在我的设计中找到整个端口,但我希望我的程序变得统一(当我更改引脚时我只需要更改此数组),所以我想通过在数组中定义它们来创建虚拟端口。操作时我想在循环中设置每个虚拟引脚。这就像下面的宏代码(当然我可以分别为端口和引脚定义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
    }

如果可能的话?使用功能还是宏?或指向指针操作的指针?

1 个答案:

答案 0 :(得分: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解决方案。