Skip to content

Instantly share code, notes, and snippets.

@rcotrina94
Last active September 30, 2015 01:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rcotrina94/289c9dafae56b54fe372 to your computer and use it in GitHub Desktop.
Save rcotrina94/289c9dafae56b54fe372 to your computer and use it in GitHub Desktop.
Alu Arduino
//Entradas para A
int iA0 = 13;
int iA1 = 12;
int iA2 = 11;
int iA3 = 10;
//Entradas para B
int iB0 = 9;
int iB1 = 8;
int iB2 = 7;
int iB3 = 6;
//Entradas para Operaciones
int iX0 = 5;
int iX1 = 4;
int iX2 = 3;
int iX3 = 2;
// Salidas
int o0 = 14; // 2^0
int o1 = 15; // 2^1
int o2 = 16; // 2^2
int o3 = 17; // 2^3
// Latch disable
int LDU = 18; // Unidades
int LDD = 19; // Decenas
void setup() {
// INPUT_PULLUP para GND=0; OPEN=1;
pinMode(iA0, INPUT_PULLUP);
pinMode(iA1, INPUT_PULLUP);
pinMode(iA2, INPUT_PULLUP);
pinMode(iA3, INPUT_PULLUP);
pinMode(iB0, INPUT_PULLUP);
pinMode(iB1, INPUT_PULLUP);
pinMode(iB2, INPUT_PULLUP);
pinMode(iB3, INPUT_PULLUP);
pinMode(iX0, INPUT_PULLUP);
pinMode(iX1, INPUT_PULLUP);
pinMode(iX2, INPUT_PULLUP);
pinMode(iX3, INPUT_PULLUP);
pinMode(o0, OUTPUT);
pinMode(o1, OUTPUT);
pinMode(o2, OUTPUT);
pinMode(o3, OUTPUT);
pinMode(LDU, OUTPUT);
pinMode(LDD, OUTPUT);
}
int rpin(int numPin) { // Leer estado del pin
return digitalRead(numPin);
}
void escribirDigito(int digito, int a, int b, int c, int d) {
// Manda a los pines de salida el valor BCD de 'digito'
int n = digito;
if (n % 2 == 1) {
digitalWrite(a, HIGH);
n = n-1;
} else {
digitalWrite(a, LOW);
}
switch (n) {
case 8: digitalWrite(d, HIGH); digitalWrite(c, LOW); digitalWrite(b, LOW); break;
case 6: digitalWrite(d, LOW); digitalWrite(c, HIGH); digitalWrite(b, HIGH); break;
case 4: digitalWrite(d, LOW); digitalWrite(c, HIGH); digitalWrite(b, LOW); break;
case 2: digitalWrite(d, LOW); digitalWrite(c, LOW); digitalWrite(b, HIGH); break;
case 0: digitalWrite(d, LOW); digitalWrite(c, LOW); digitalWrite(b, LOW); break;
}
}
int decodificar(int d , int c, int b , int a) {
// BCD -> DECIMAL
return a + 2 * b + 4 * c + 8 * d;
}
void enviarSalida(int n) {
// Envía las señales correspondientes a cada decodificador BCD
// para que se muestre en el display de 7 segmentos.
if (n <= 99) {
int u = n % 10;
int d = (n - u) / 10;
digitalWrite(LDU, LOW);
escribirDigito(u, o0, o1, o2, o3);
digitalWrite(LDU, HIGH);
digitalWrite(LDU, LOW);
delay(10);
digitalWrite(LDD, LOW);
escribirDigito(d, o0, o1, o2, o3);
digitalWrite(LDD, HIGH);
digitalWrite(LDD, LOW);
delay(10);
}
}
void loop() {
int operacion = decodificar(rpin(iX0), rpin(iX1), rpin(iX2), rpin(iX3));
int A = decodificar(rpin(iA0), rpin(iA1), rpin(iA2), rpin(iA3));
int B = decodificar(rpin(iB0), rpin(iB1), rpin(iB2), rpin(iB3));
switch (operacion) {
case 0: enviarSalida(A+B); break;
case 1: enviarSalida(A-B); break;
case 2: enviarSalida(A+1); break;
case 3: enviarSalida(A-1); break;
case 4: enviarSalida(A<B?A:0); break;
case 5: enviarSalida(A>B?B:0); break;
case 6: enviarSalida(A==B?0:1); break;
case 7: enviarSalida(A<B?A:0); break;
case 8: enviarSalida(A==10?1:0); break;
case 9: enviarSalida(A==12?0:1); break;
case 10: enviarSalida(A==15?B:0); break;
case 11: enviarSalida(A==9?15-B:0); break;
case 12: enviarSalida(A^B); break;
case 13: enviarSalida(A&B); break;
case 14: enviarSalida(~A); break;
case 15: enviarSalida(~(A^B)); break;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment