Sumador/Restador Binario de 4 Bits

Hola a toda la Comunidad, soy nuevo en el foro y en el mundo Arduino.
Soy estudiante de Ing Electrónica y estoy a sus ordenes en lo que pueda ayudarles y compartir.

En mis futuros post tratare de contribuir y ayudar a esta comunidad Latina con proyectos que yo mismo he probado, unos serán de mi autoria y otros que he encontrado de Internet.

En este caso les comparto un Código que encontré en Youtube, el cual es un Sumador binario de 4 bits.

//Sumando 1
int A =12;
int B=11;
int C=10;
int D=9;

//Sumando 2
int E=8;
int F=7;
int G=6;
int H=5;

// Resultado
int Carry = 4;
int I =3;
int J=2;
int K=1;
int L=0; 

//Variables booleanas
bool a,b,c,d,e,f,g,h,i,j,k,l,carry1,carry2,carry3,carry4; 



void setup() {

 
  //Sumando 1
  pinMode(A, INPUT);
  pinMode(B, INPUT);
  pinMode(C, INPUT);
  pinMode(D, INPUT);
  
  //Sumando 2
  pinMode(E, INPUT);
  pinMode(F, INPUT);
  pinMode(G, INPUT);
  pinMode(H, INPUT);
  
  //Resultado
  pinMode(Carry, OUTPUT);
  pinMode(I, OUTPUT);
  pinMode(J, OUTPUT);
  pinMode(K, OUTPUT);
  pinMode(L, OUTPUT);
  
  
}


void loop() { 

  //Lee los valores de las entradas digitales
  a = digitalRead(A);
  b = digitalRead(B);
  c = digitalRead(C);  
  d = digitalRead(D);
  e = digitalRead(E);
  f = digitalRead(F);
  g = digitalRead(G);
  h = digitalRead(H);
  
  //Le asigna el valor al primer bit y al carry que genera
  l = (!d && h) || (d && !h);
  carry1 = d&&h;
  
  //Le asigna el valor al segundo bit y al carry que genera
  k = (c && g && carry1) || (c && !g && !carry1) || (!c && g && !carry1) || (!c && !g && carry1);
  carry2 = (c && g && carry1) || (c && g && !carry1) || (c && !g && carry1) || (!c && g && carry1);
  
  //Le asigna el valor al tercer bit y al carry que genera 
  j = (b && f && carry2) || (b && !f && !carry2) || (!b && f && !carry2) || (!b && !f && carry2);
  carry3 = (b && f && carry2) || (b && f && !carry2) || (b && !f && carry2) || (!b && f && carry2);
  
  
  //Le asigna el valor al cuarto bit y al carry que genera
  i = (a && e && carry3) || (a && !e && !carry3) || (!a && e && !carry3) || (!a && !e && carry3);
  carry4 = (a && e && carry3) || (a && e && !carry3) || (a && !e && carry3) || (!a && e && carry3);
  
  
  
  //Enciende los leds correspondientes, segun el valor booleano de su variable correspondiente
  
  //Bit 1
  if(l)
    digitalWrite(L, HIGH);
  else 
    digitalWrite(L,LOW);
    
  //Bit 2
  if(k)
    digitalWrite(K, HIGH);
  else 
    digitalWrite(K,LOW);
  
  //Bit 3
  if(j)
    digitalWrite(J, HIGH);
  else 
    digitalWrite(J,LOW);
  
  //Bit 4
  if(i)
    digitalWrite(I, HIGH);
  else 
    digitalWrite(I,LOW);
  
  //Carry
  if(carry4)
    digitalWrite(Carry, HIGH);
  else 
    digitalWrite(Carry,LOW);
 
  //Delay para el loop de 100 ms
  delay(100);
}

Autor:Diego Toledo

Ahora bien, si se desea hacerlo Restador, solo es cuestión de poner compuertas orex(or exclusiva) en nuestras entradas de B, y las segundas entradas de nuestras compuertas puentiarlas y mandarlas a un a un swich, anexo imagen .

Yo he echo esa configuración y en la suma la da perfecto, pero en la resta algo esta mal.
Por ejemplo si se suman 2+2=4 pero si se restan 2-2=da 1 en vez de cero.
Por si alguien gusta corregir ese pequeño error en la resta.

Saludos

Hola.
Para restar lo que se hace es sumar el negativo del segundo número, esto es, el complemento a dos, que es como se representan los números negativos en binario. El xor es el complemento a uno. Súmale uno a dicho número y tienes el complemento a dos. En cuatro bits, -2 sería:
0010 -> complemento a uno = 1101 -> complemento a dos -> 1110
0010 + 1110 = 10000, que como trabajamos con 4 bits = 0000 :wink:

Hola, soy nueva en Arduino igual, para realizar el sumador con un Dip Switch de 6 entradas me sirve tu código, ya realizé uno pero no me da el resultado esperado, no si sea por el código o por otros factores.. de Antemano gracias!! :wink: :smiley:

Daniel, Bienvenida al Foro Arduino!!

**La próxima vez no respondas un hilo que tiene 1 año sin movimientos. **
De hecho antes de responder recibiste una Advertencia en letras rojas que ignoraste.
Si vas a seguir en este foro lee las normas por favor y respétalas.