繁体   English   中英

如何使用C代码引用Arduino Uno中的特定GPIO引脚?

[英]How to refer to a specific GPIO pin in an Arduino Uno using C code?

我正在尝试设计一个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;
}

如果要引用一个或多个特定引脚,则相对容易(假设将寄存器设置为输出):

例如,要隔离PORTD上的引脚4,请执行以下操作:

PORTD |= (1 << PIND4);

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

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

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

PORTD &= ~(1 << PIND4);

这会将PORTD中的引脚4设置为LOW。

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

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

您还可以为(1 << n)逻辑定义一个宏:

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

这些教程对此进行了很好的解释: http : //maxembedded.com/2011/06/port-operations-in-avr/https://efundies.com/avr-bitwise-operations-in-c/

如果逐步在纸上进行按位逻辑,它将变得更加清晰!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM