因为我在设计中找不到整个端口,但我希望我的程序变得统一(当我更改引脚时,我只需要更改这个数组),所以我想通过在数组中定义它们来创建一个虚拟端口。操作时,我想将每个虚拟引脚设置为循环。这就像下面的宏代码一样(当然我可以为端口和引脚分别定义2个数组)。数组(引脚)的长度在编译前是可变的1(可能是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
}
如果可以的话?使用函数还是宏?或者指针到指针的操作?
最佳答案
这是可能的,但只能通过获取端口地址来实现,如以下代码所示:
#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 解决方案。
关于c - 虚拟端口在atmega MCU中运行,可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14726077/