【问题标题】:How to refer to a specific GPIO pin in an Arduino Uno using C code?如何使用 C 代码引用 Arduino Uno 中的特定 GPIO 引脚?
【发布时间】:2019-06-01 07:33:36
【问题描述】:

我正在尝试设计一个 4 位加法器。我已经设置了输入和输出端口,但不知道从那里去哪里。

我的“B”输入端口是端口D,我的“A”输入端口以及我的“Cin”是端口B,我的“S”输出端口以及我的“Cout”是端口C。我是无法弄清楚如何隔离各个端口(例如进位纹波),并且除了嵌套的 if 语句之外几乎没有想法。

我的代码目前如下:

#include <avr/io.h>//library used to access the pin addresses

int main () {
    DDRD &= ~(0b00111100);//B inputs
    DDRB &= ~(0b00011111);//Carry-in + A inputs
    DDRC |= 0b00011111;//Carry-out + S outputs
    while (1) {
        //PORTC |= PIND + PINB;
        //PORTC &= ~(PIND + PINB);
        if ((PIND & 0b00000000)&&(PINB & 0b00000000)) {
            PORTC |= 0b00000000;
            PORTC &= ~(0b00000000);
        }
        else if ((((PIND & 0b00000100)||(PIND & 0b00001000)||(PIND & 0b00010000)||(PIND & 0b00100000))&&(PINB & 0b00000000))||(((PINB & 0b00000100)||(PINB & 0b00001000)||(PINB & 0b00010000)||(PINB & 0b00100000))&&(PIND & 0b00000000)))
            PORTC |= 0b00000001;
            PORTC &= ~(0b11111110);
        }
    }
    return 0;
}

【问题讨论】:

  • PORTx是设置管脚高低的寄存器名称(配置为输出时)。
  • 如何引用该特定引脚?例如,如果我想对位于 D 中的数字引脚 4 而不是整个 PIND 执行按位异或。
  • 首先找到pin 4所在的位置。要执行 XOR 或切换引脚,请使用带有端口寄存器和掩码的 xor 运算符。我没有你想要达到的细节。
  • 如果你做4位加法器,为什么你在DDRB中有进位?进位只是为了结果? 15 + 15 = 30 作为最大总和
  • 如果您想要对单个引脚进行抽象引用的东西,您可以使用 Arduino 层 - 它们效率低下,但它们至少为您提供了单引脚抽象。否则你可能最终会做很多位屏蔽......

标签: c embedded avr gpio atmega


【解决方案1】:

如果你想引用一个特定的引脚,那么它相对容易(假设寄存器被设置为输出):

例如,要隔离 PORTD 上的引脚 4,您可以:

PORTD |= (1 << PIND4);

这会将 PORTD 中的引脚 4 设置为高电平。

PORTD |= (1 << PIND4) | (1 << PIND5);

这会将 PORTD 中的引脚 4 和 5 设置为高电平。

PORTD &= ~(1 << PIND4);

这会将 PORTD 中的引脚 4 设置为低电平。

PORTD &= ~(1 << PIND4) & ~(1 << (PIND5);

这会将 PORTD 中的引脚 4 和 5 设置为低电平。

还可以为 (1

#define _BV(n) (1 << (n))

这些教程已经很好地解释了这一切:http://maxembedded.com/2011/06/port-operations-in-avr/https://efundies.com/avr-bitwise-operations-in-c/

如果你在一张纸上一步一步地按位逻辑,它会变得更清楚!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    相关资源
    最近更新 更多