【发布时间】: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