Suma y Resta de Números Binarios con
Arduino y PIC
Parte 1: Suma y Resta de Números Binarios con Arduino UNO y LEDs
Materiales:
- Arduino UNO
- 4 LEDs
- Resistencias para los LEDs
- Cables de conexión
Conexiones:
- LEDs conectados a los pines 13, 12, 11 y 10
- Pines de entrada conectados a los pines 2, 3, 4, 5, 6, 7
Código para Arduino UNO:
int ledPins[] = {13, 12, 11, 10}; // Pines para los LEDs
int inputPins[] = {7, 6, 5, 4}; // Pines de entrada para los números binarios
int pin0 = 2; // Pin de control 0
int pin1 = 3; // Pin de control 1
int carryPin = 8; // Pin para el acarreo
int num1 = 0;
int num2 = 0;
bool num1Stored = false;
void setup() {
for (int i = 0; i < 4; i++) {
pinMode(ledPins[i], OUTPUT);
pinMode(inputPins[i], INPUT);
}
pinMode(pin0, INPUT);
pinMode(pin1, INPUT);
pinMode(carryPin, OUTPUT);
}
void loop() {
int state0 = digitalRead(pin0);
int state1 = digitalRead(pin1);
if (state1 == HIGH && state0 == LOW) {
if (!num1Stored) {
num1 = readBinaryInput();
digitalWrite(13, HIGH); // Indica que el primer número está guardado
num1Stored = true;
} else {
num2 = readBinaryInput();
int result = num1 + num2;
displayResult(result);
digitalWrite(13, LOW); // Apaga el LED indicador
num1Stored = false;
}
} else if (state1 == LOW && state0 == HIGH) {
if (!num1Stored) {
num1 = readBinaryInput();
digitalWrite(13, HIGH); // Indica que el primer número está guardado
num1Stored = true;
} else {
num2 = readBinaryInput();
int result = num1 - num2;
displayResult(result);
digitalWrite(13, LOW); // Apaga el LED indicador
num1Stored = false;
}
}
}
int readBinaryInput() {
int value = 0;
for (int i = 0; i < 4; i++) {
value |= (digitalRead(inputPins[i]) << i);
}
return value;
}
void displayResult(int result) {
for (int i = 0; i < 4; i++) {
digitalWrite(ledPins[i], (result >> i) & 1);
}
digitalWrite(carryPin, (result >> 4) & 1); // Muestra el acarreo si es necesario
}
Parte2: Suma y Resta de Números Binarios con PIC16F877A y LEDs
Materiales:
- PIC16F877A
- Pantalla LCD16x2
- Resistencias y cables de conexión
Código para PIC16F877A:
#include <xc.h>
#define _XTAL_FREQ20000000 // Frecuencia del oscilador
// Configuración de los fusibles
#pragma config FOSC=HS // Oscilador externo de alta velocidad
#pragma config WDTE=OFF // Watchdog Timer deshabilitado
#pragma config PWRTE=ON // Power-up Timer habilitado
#pragma config BOREN=ON // Brown-out Reset habilitado
#pragma config LVP=OFF // Low Voltage Programming deshabilitado
#pragma config CPD=OFF // Data EEPROM Memory Code Protection deshabilitado
#pragma config WRT=OFF // Flash Program Memory Write Protection deshabilitado
#pragma config CP=OFF // Flash Program Memory Code Protection deshabilitado
int readBinaryInput();
void displayResult(int result);
int num1=0;
int num2=0;
bit num1Stored=0;
void main() {
TRISB=0x00; // Configura el puerto B como salida para los LEDs
TRISD=0xF3; // Configura RD4,RD5,RD6,RD7 como entradas y RD0,RD1 como entradas de
control
while(1) {
int state0=RD0;
int state1=RD1;
if(state1==1&&state0==0) {
if(!num1Stored) {
num1=readBinaryInput();
RB7=1; // Indica que el primer número está guardado
num1Stored=1;
} else {
num2=readBinaryInput();
int result=num1+num2;
displayResult(result);
RB7=0; // Apaga el LED indicador
num1Stored=0;
}
} else if(state1==0&&state0==1) {
if(!num1Stored) {
num1=readBinaryInput();
RB7=1; // Indica que el primer número está guardado
num1Stored=1;
} else {
num2=readBinaryInput();
int result=num1-num2;
displayResult(result);
RB7=0; // Apaga el LED indicador
num1Stored=0;
}
}
}
}
int readBinaryInput() {
int value=0;
value|=(RD4<<0);
value|=(RD5<<1);
value|=(RD6<<2);
value|=(RD7<<3);
return value;
}
void displayResult(int result) {
PORTB=result&0x0F; // Muestra el resultado en los LEDs conectados al puerto B
RB4=(result>>4)&1; // Muestra el acarreo si es necesario
}