[英]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.