Anda di halaman 1dari 5

/* // 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++) { // fungsi mengisi 3 digit array BCD dengan operator

digitalWrite(BCD1 + i, bcd & 0x01); 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 // inisialisasi mode pin

digitalWrite(T1, index & 0x02); for (int pin=DATA_AV; pin<=KEY0+3; pin++) {

digitalWrite(T2, index & 0x01); pinMode(pin, INPUT);

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