#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd1(0x27, 20, 4); // Alamat I2C untuk LCD1 20x4
LiquidCrystal_I2C lcd2(0x26, 20, 4); // Alamat I2C untuk LCD2 20x4
// Pin untuk switch dan LED
const int switch_pin[] = {9,8,7,6};
const int led_pin_OR[] = {5,4,3,2};
const int led_pin_XOR[] = {13,12,11,10};
// Variabel pembanding_OR (misal: 3 -> 0011)
byte pembanding_OR = B0011;
// Variabel pembanding_XOR (misal: 3 -> 0011)
byte pembanding_XOR = B0011;
int last_val1 = HIGH;
int last_val2 = HIGH;
int last_val3 = HIGH;
int last_val4 = HIGH;
void setup() {
//OR GATE
// Inisialisasi LCD1
lcd1.init();
lcd1.backlight();
// Inisialisasi switch sebagai input
for (int i = 0; i < 4; i++) {
pinMode(switch_pin[i], INPUT_PULLUP);
}
// Inisialisasi LED OR sebagai output
for (int i = 0; i < 4; i++) {
pinMode(led_pin_OR[i], OUTPUT);
}
//------------------------------------------------------------------
//XOR GATE
lcd2.init();
lcd2.backlight();
// Inisialisasi LED XOR sebagai output
for (int i = 0; i < 4; i++) {
pinMode(led_pin_XOR[i], OUTPUT);
}
lcd1.setCursor(4,0);
lcd1.print("Ubah Switch");
lcd1.setCursor(1,1);
lcd1.print("Untuk Mengaktifkan");
lcd2.setCursor(4,0);
lcd2.print("Ubah Switch");
lcd2.setCursor(1,1);
lcd2.print("Untuk Mengaktifkan");
}
void loop() {
int value1 = digitalRead(switch_pin[0]);
int value2 = digitalRead(switch_pin[1]);
int value3 = digitalRead(switch_pin[2]);
int value4 = digitalRead(switch_pin[3]);
if(last_val1 != value1||last_val2 != value2||
last_val3 != value3||last_val4 != value4)
{
last_val1 = value1;
last_val2 = value2;
last_val3 = value3;
last_val4 = value4;
// Membaca status switch dan mengaktifkan LED sesuai dengan operasi OR
byte switch_status_OR = 0;
for (int i = 0; i < 4; i++) {
if (digitalRead(switch_pin[i]) == LOW) {
switch_status_OR |= (1 << i);
}
}
//Proses OR GATE
byte hasil_OR = switch_status_OR | pembanding_OR;
// Menyalakan atau mematikan LED sesuai dengan hasil OR
for (int i = 0; i < 4; i++) {
digitalWrite(led_pin_OR[i], (hasil_OR & (1 << i)) ? HIGH : LOW);
}
// Menampilkan status switch dan LED di LCD1
lcd1.clear();
lcd1.setCursor(0, 0);
lcd1.print("OR GATE");
lcd1.setCursor(0, 1);
lcd1.print("Switch: ");
lcd1.print(switch_status_OR, BIN);
lcd1.setCursor(0, 2);
lcd1.print("Pembanding OR: ");
lcd1.print(pembanding_OR, BIN);
lcd1.setCursor(0, 3);
lcd1.print("OR: ");
lcd1.print(hasil_OR, BIN);
//-----------------------------------------------------------------------
// Membaca status switch dan mengaktifkan LED sesuai dengan operasi XOR
byte switch_status_XOR = 0;
for (int i = 0; i < 4; i++) {
if (digitalRead(switch_pin[i]) == LOW) {
switch_status_XOR |= (1 << i);
}
}
//Proses XOR GATE
byte hasil_XOR = switch_status_XOR ^ pembanding_XOR;
// Menyalakan atau mematikan LED sesuai dengan hasil XOR
for (int i = 0; i < 4; i++) {
digitalWrite(led_pin_XOR[i], (hasil_XOR & (1 << i)) ? HIGH : LOW);
}
// Menampilkan status switch dan LED di LCD2
lcd2.clear();
lcd2.setCursor(0,0);
lcd2.print("XOR GATE");
lcd2.setCursor(0, 1);
lcd2.print("Switch: ");
lcd2.print(switch_status_XOR, BIN);
lcd2.setCursor(0, 2);
lcd2.print("Pembanding XOR: ");
lcd2.print(pembanding_XOR, BIN);
lcd2.setCursor(0, 3);
lcd2.print("XOR: ");
lcd2.print(hasil_XOR, BIN);
} // Tampilkan data selama 200ms
}