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