Last active
September 30, 2015 01:23
-
-
Save rcotrina94/289c9dafae56b54fe372 to your computer and use it in GitHub Desktop.
Alu Arduino
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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