/*
// fungsi memeriksa apakah keypad ditekan
Tugas Kelompok Nomor 3:
boolean keyIsPressed() {
Lengkapi kode 1.7 Kalkulator;
static boolean key_old = 0;
*/
boolean b1 = digitalRead(DATA_AV); boolean s1 = (!b1 && key_old);;
// Pemetaan Port Arduino untuk 7 segmen
key_old = b1;
#define BUTTON1 4
return s1;
#define BUTTON2 2
}
#define BCD1 8 #define T1 12
// fungsi membaca keypad
#define T2 13
int readKey() { int key = digitalRead(KEY0);
// Pemetaan Port Arduino untuk keypad
key |= digitalRead(KEY0+1) << 1;
#define DATA_AV 2
key |= digitalRead(KEY0+2) << 2;
#define KEY0 4
key |= digitalRead(KEY0+3) << 3; return key;
// konstanta periode
}
#define DISPLAY_PERIODE 50 // fungsi mentranslasi kode keypad (0-15) menjadi biner (0 - 0xF) // konstanta OPERATOR char biner_table[] = #define ADD 0xA
{1,2,3,4,5,6,7,8,9,0xA,0xB,0xC,0xD,0xE,0xF,0};
#define SUB 0xB
char keyToBiner(int key) {
#define MUL 0xC
return biner_table[key];
#define DIV 0xD
}
#define CLR 0xE #define CALC 0xF
// fungsi untuk menampilkan BCD ke 7 segment melalui encoder
void writeDigit(int bcd){ for(int i=0; i<4; i++) { digitalWrite(BCD1 + i, bcd & 0x01);
// fungsi mengisi 3 digit array BCD dengan operator void writeOperator(int op) {
bcd = bcd >> 1;
digit[0] = op; // op akan sesuai hexa a,b,c,d
}
digit[1] = 15; // tidak tampil apa-apa
}
digit[2] = 15; // tidak tampil apa-apa }
// fungsi mengisi 3 digit array BCD dari angka int digits[3];
// variabel global
void writeDigit3(int angka){
#define STATE_1 0
digits[0] = data % 10;
#define STATE_2 1
data = data / 10;
int state=0;
digits[1] = data % 10;
int next_state=0;
data = data / 10;
boolean da;
digits[2] = data % 10;
int key, biner;
}
int value1, value2; int opr;
// fungsi untuk menampilkan 3 digit BCD ke 7-
long next_display;
segment memakai shift register int index = 0; void setup() { void shiftDigit() { Serial.begin(115200); writeDigit(digits[index]); // memasukan nilai pada salah satu digits digitalWrite(T1, index & 0x02);
// inisialisasi mode pin for (int pin=DATA_AV; pin<=KEY0+3; pin++) { pinMode(pin, INPUT);
digitalWrite(T2, index & 0x01); index = (index + 1 ) % 3; }
} // inisialisasi digits & shift 7-segment writeDigit3(0);
digitalWrite(T1, LOW);
}
digitalWrite(T2, LOW);
Serial.print(" value2= ");
// inisialisasi waktu
Serial.println(value2);
next_display = millis();
}
// inisialisasi kalkulator biner1 = biner2 = 0; }
// fungsi transisi push // mengingat operator yang ditekan void push(int op) {
// fungsi transisi catatValue1
Serial.print(" push ");
// menggubah harga value1 sesuai masukan biner,
Serial.println(value1);
// tapi lakukan hanya kalau tidak menyebabkan
opr = op;
overflow writeOperator(opr); void entryValue1(int biner) { } if (value1 < 100) { value1 = (value1 * 10) + biner; // fungsi transisi pop writeDigit3(value1); // mengoperasikan value1 thd value2 sesuai }
operator
Serial.print(" value1= ");
void pop() {
Serial.println(value1); }
Serial.print(" pop "); Serial.print(value1); Serial.print(" ");
// fungsi transisi catatValue2
Serial.print(opr, HEX);
// menggubah harga value2 sesuai masukan biner
Serial.print(" ");
void entryValue2(int biner) {
Serial.print(value2);
if (value2 < 100) {
switch(opr) {
value2 = (value2 * 10) + biner;
case ADD: value1 = value1 + value2; break;
writeDigit3(value2);
case SUB: value1 = value1 - value2; break;
case MUL: value1 = value1 * value2; break;
case 6:
case DIV: value1 = value1 / value2; break ;
case 7:
}
case 8:
value2 = 0;
case 9:
writeDigit3(value1);
entryValue1(biner); break;
Serial.print(" => ");
case ADD:
Serial.println(value1);
case SUB:
}
case MUL: case DIV:
// fungsi transisi clear
push(biner);
void clear() {
next_state = STATE_2;
value2 = value1 = 0;
break;
writeDigit3(value1);
case CLR:
Serial.println(" clear");
clear();
}
break; }
// fungsi keadaaan state1
}
// sesuai diagram transisi keadaan 1.10 void state1() {
// fungsi keadaaan state2
Serial.print("State 1 ");
// sesuai diagram transisi keadaan 1.10
switch(biner) {
void state2() {
case 0:
Serial.print("State 2 ");
case 1:
switch(biner) {
case 2:
case 0:
case 3:
case 1:
case 4:
case 2:
case 5:
case 3:
case 4:
key = readKey();
case 5:
biner = keyToBiner(key);
case 6:
// tampilkan untuk monitoring
case 7:
Serial.print("Key = ");
case 8:
Serial.print(key, BIN);
case 9:
Serial.print(" = ");
entryValue2(biner); break;
Serial.println(biner, HEX);
case ADD:
// proses sesuai state
case SUB:
switch(state) {
case MUL:
case STATE_1 : state1(); break;
case DIV:
case STATE_2 : state2(); break;
push(biner);
}
next_state = STATE_1;
}
break;
else if (t > next_display) {
case CLR:
shiftDigit();
clear();
next_display += DISPLAY_PERIODE;
break;
}
}
// update state
}
if (next_state != state) { state = next_state;
void loop() { // baca semua input da = keyIsPressed(); // baca waktu dalam mili detik long t = millis(); if (da) { // baca key dan translasi ke biner
} }