//Library yang digunakan
#include <Key.h>
#include <Keypad.h>
#include <LiquidCrystal.h>
//Deklarasi Jumlah Baris & Kolom Keypad
const byte ROWS = 4;
const byte COLS = 4;
//Deklarasi Posisi Tombol pada Keypad
char keys [ROWS][COLS] = {
{'1','2','3','+'},
{'4','5','6','-'},
{'7','8','9','*'},
{'.','0','=','/'}
};
//Deklarasi Pin Keypad
byte rowPins[ROWS] = {5, 4, 3, 2};
byte colPins[COLS] = {A3, A2, A1, A0};
//Deklarasi variabel "keypad"
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
//Deklarasi Pin LCD
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
// Menampilkan pesan selamat datang pada LCD
void showSplashScreen() {
//Output Exact di tampilkan pada Kolom ke-0, Baris ke-0
lcd.setCursor(0, 0);
String message1 = "UTS MIKROKONTROLLER";
for (byte i = 0; i < message1.length(); i++) {
lcd.print(message1[i]);
delay(50);
}
//Output Exact di tampilkan pada Kolom ke-2, Baris ke-1
lcd.setCursor(2, 1);
String message2 = "LAILI KURNIASARI";
for (byte i = 0; i < message2.length(); i++) {
lcd.print(message2[i]);
delay(50);
}
//Output Exact di tampilkan pada Kolom ke-3, Baris ke-2
lcd.setCursor(3, 2);
String message3 = "NIM : 22202029";
for (byte i = 0; i < message3.length(); i++) {
lcd.print(message3[i]);
delay(50);
}
//Output Exact di tampilkan pada Kolom ke-0, Baris ke-3
lcd.setCursor(0, 3);
String message4 = "Simple Calculator :D";
for (byte i = 0; i < message4.length(); i++) {
lcd.print(message4[i]);
delay(50);
}
delay(1000);
}
// Mengatur agar kursor berkedip pada LCD
void updateCursor() {
if (millis() / 250 % 2 == 0 ) {
lcd.cursor();
} else {
lcd.noCursor();
}
}
// Inisialisasi LCD dan menampilkan splash screen
void setup() {
// Deklarasi penggunaan LCD berukuran 20x4
lcd.begin(20, 4);
showSplashScreen();
lcd.clear();
lcd.cursor();
lcd.setCursor(0, 0);
lcd.print("Nilai 1 : ");
lcd.setCursor(0, 2);
lcd.print("Nilai 2 : ");
lcd.setCursor(10, 0);
lcd.noCursor();
}
//Deklarasi variabel yang di butuhkan pada perhitungan aritmatika
char operation = 0;
String current = "";
String nilai1 = "";
String nilai2 = "";
uint64_t currentDecimal;
bool decimalPoint = false;
// Melakukan perhitungan aritmatika berdasarkan operator
double calculate(char operation, double left, double right) {
switch (operation) {
case '+': return left + right;
case '-': return left - right;
case '*': return left * right;
case '/': return left / right;
}
}
// Memproses input dari keypad dan menangani operasi aritmatika
void processInput(char key) {
if ('-' == key && nilai1 == "" && current == "") {
nilai1 = "-";
lcd.print("-");
return;
}
switch (key) {
case '+':
case '-':
case '*':
case '/':
if (!operation) {
nilai1 = current;
current = "";
} else if (operation == '-') {
nilai2 = current;
current = "";
float leftNum = nilai1.toFloat();
float rightNum = nilai2.toFloat();
nilai1 = String(calculate(operation, leftNum, rightNum));
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Hasil : ");
lcd.setCursor(8, 0);
lcd.print(nilai1);
lcd.setCursor(0, 2);
lcd.print("Operator yg dipakai: ");
lcd.setCursor(0, 3);
lcd.print(key);
operation = key;
return;
}
operation = key;
lcd.setCursor(10, 1);
lcd.print(key);
lcd.setCursor(current.length() + 10, 2);
nilai2 = current; // Simpan nilai kedua saat operator dimasukkan
current = "";
return;
case '=':
if (operation) {
float leftNum = nilai1.toFloat();
float rightNum = current.toFloat(); // Ambil nilai dari current, bukan nilai2
nilai2 = current; // Baris ini untuk menyimpan nilai kedua
nilai1 = String(calculate(operation, leftNum, rightNum));
current = "";
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Hasil : ");
lcd.setCursor(8, 0);
lcd.print(nilai1);
lcd.setCursor(0, 2);
lcd.print("Operator yg dipakai: ");
lcd.setCursor(0, 3);
lcd.print(operation);
}
return;
}
if ('.' == key && current.indexOf('.') >= 0) {
return;
}
if ('.' != key && current == "0") {
current = String(key);
} else if (key) {
current += String(key);
}
lcd.print(key);
}
// Melakukan loop untuk membaca input dari keypad dan memperbarui tampilan
void loop() {
// Mengambil nilai yang ada dalam variabel keypad
char key = keypad.getKey();
// Kondisi kapan input dari keypad akan di tampilkan pada LCD
if (key) {
// Indikator tambahan apakah nilai yang input telah di terima atau belum
digitalWrite(6, HIGH);
delay(100);
digitalWrite(6, LOW);
processInput(key);
}
// Pemanggilan fungsi untuk memperbarui kursor
updateCursor();
}