c - 虚拟端口在atmega MCU中运行,可能吗?

标签 c atmega

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

相关文章:

python - 如何对 2D 依赖表进行排序/排序

c# - 将固定大小数组编码为 C# 类的成员不起作用

c - 命名管道和 fork 头痛

c# - zlib.c Adler 实现和 Deflate、Ionic Deflate 之间的 Zlib 压缩差异

c - AVR super 终端不显示传感器值

c - Atmega328 上的韦根协议(protocol)实现

objective-c - 基于浏览器的 C 和 Objective-C 教程

assembly - 如何反转一个字节

尽管具有相同的值,但在 Arduino 中使用 C 控制电机的速度会导致不同的速度

c - 代码 ATMEGA328p 中的 ADC 转换错误