#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_NEGASI[] = {5,4,3,2};
const int led_pin_AND[] = {13,12,11,10};
// Variabel pembanding_AND (misal: 3 -> 0011)
byte pembanding_AND = B0011;
int last_val1 = HIGH;
int last_val2 = HIGH;
int last_val3 = HIGH;
int last_val4 = HIGH;
void setup() {
//AND GATE
// Inisialisasi LCD1
lcd1.init();
lcd1.backlight();
lcd2.init();
lcd2.backlight();
// Inisialisasi switch sebagai input
for (int i = 0; i < 4; i++) {
pinMode(switch_pin[i], INPUT_PULLUP);
}
// Inisialisasi LED NEGASI sebagai output
for (int i = 0; i < 4; i++) {
pinMode(led_pin_NEGASI[i], OUTPUT);
}
// Inisialisasi LED AND sebagai output
for (int i = 0; i < 4; i++) {
pinMode(led_pin_AND[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[3]);
int value2 = !digitalRead(switch_pin[2]);
int value3 = !digitalRead(switch_pin[1]);
int value4 = !digitalRead(switch_pin[0]);
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;
check_value_NEGASI(value1,value2,value3,value4);
// Membaca status switch dan mengaktifkan LED sesuai dengan operasi AND
byte switch_status_AND = 0;
for (int i = 0; i < 4; i++) {
if (digitalRead(switch_pin[i]) == LOW) {
switch_status_AND |= (1 << i);
}
}
//Proses AND GATE
byte hasil_AND = switch_status_AND & pembanding_AND;
// Menyalakan atau mematikan LED sesuai dengan hasil AND
for (int i = 0; i < 4; i++) {
digitalWrite(led_pin_AND[i], (hasil_AND & (1 << i)) ? HIGH : LOW);
}
// Menampilkan status switch dan LED di LCD1
lcd2.clear();
lcd2.setCursor(0, 0);
lcd2.print("AND GATE");
lcd2.setCursor(0, 1);
lcd2.print("Switch: ");
lcd2.print(switch_status_AND, BIN);
lcd2.setCursor(0, 2);
lcd2.print("Pembanding AND: ");
lcd2.print(pembanding_AND, BIN);
lcd2.setCursor(0, 3);
lcd2.print("AND: ");
lcd2.print(hasil_AND, BIN);
} // Tampilkan data selama 200ms
}
void check_value_NEGASI(int val1,int val2,int val3,int val4)
{
lcd1.clear();
//value 1
if(val1 == HIGH)
{
lcd1.setCursor(0,0);
lcd1.print("S1: HIGH");
}
if(val1 == LOW)
{
lcd1.setCursor(0,0);
lcd1.print("S1: LOW");
}
//value 2
if(val2 == HIGH)
{
lcd1.setCursor(0,1);
lcd1.print("S2: HIGH");
}
if(val2 == LOW)
{
lcd1.setCursor(0,1);
lcd1.print("S2: LOW");
}
//value 3
if(val3 == HIGH)
{
lcd1.setCursor(0,2);
lcd1.print("S3: HIGH");
}
if(val3 == LOW)
{
lcd1.setCursor(0,2);
lcd1.print("S3: LOW");
}
//value 4
if(val4 == HIGH)
{
lcd1.setCursor(0,3);
lcd1.print("S4: HIGH");
}
if(val4 == LOW)
{
lcd1.setCursor(0,3);
lcd1.print("S4: LOW");
}
digitalWrite(led_pin_NEGASI[3], !val1);
lcd1.setCursor(12,0);
lcd1.print("LED1: ");
lcd1.print(digitalRead(led_pin_NEGASI[3]));
digitalWrite(led_pin_NEGASI[2], !val2);
lcd1.setCursor(12,1);
lcd1.print("LED2: ");
lcd1.print(digitalRead(led_pin_NEGASI[2]));
digitalWrite(led_pin_NEGASI[1], !val3);
lcd1.setCursor(12,2);
lcd1.print("LED3: ");
lcd1.print(digitalRead(led_pin_NEGASI[1]));
digitalWrite(led_pin_NEGASI[0], !val4);
lcd1.setCursor(12,3);
lcd1.print("LED4: ");
lcd1.print(digitalRead(led_pin_NEGASI[0]));
}