PENULISAN KARAKTER DENGAN MENGGUNAKAN TEKNIK PENULISAN PADA KEYPAD HANDPHONE OLEH MODUL DST-51, KEYPAD 4X3 DAN M1632 LCD Keypad 4x3 adalah merupakan keypad dengan konfigurasi 4 baris dan 3 kolom dan terdiri dari 12 tombol. Penggunaan 12 tombol pada proses input data numeric tentunya dapat dilakukan dengan mudah, namun pada proses input data alphabet dan karakter-karakter tanda bacanya, maka diperlukan sebuah teknik yang biasa digunakan pada keypad handphone. Pada teknik ini, setiap tombol tidak hanya mewakili satu alphabet atau tanda baca saja, melainkan untuk beberapa alphabet atau tanda baca sekaligus. Untuk membedakan alphabet atau tanda baca yang diinginkan dilakukan dengan mendeteksi jumlah penekanan tombol dalam satu waktu tertentu. A Penekanan 1 2 B C Penekanan 2 Penekanan 3 2 Penekanan 4 Gambar 1 Contoh penekanan tombol 2 Tombol-tombol numeric juga dapat dilakukan dengan menekan dan menahan tombol tersebut agak lama sehingga untuk memberikan angka 2 tidak harus dilakukan dengan menekan tombol 2 sebanyak 4 kali. Untuk penerapan teknik tersebut dalam Modul DST-51 dilakukan dengan proses yang tampak pada diagram alir di gambar 2. Diagram alir ini menggambarkan proses yang terjadi pada subroutine program listing 2, program ambil_keypad. Dalam proses ini terdapat timer yang bekerja untuk mendeteksi time out selama tombol ditekan dan time out selama tombol dilepas. Timer mulai menghitung pada saat terjadi penekanan tombol dan berhenti saat program keluar dari subroutine. Time out pada bagian pertama (time out karena tombol tidak ditekan) mengakibatkan program keluar dari subroutine ini dengan variable nilai berisi data hasil konversi table sesuai jumlah penekanan tombol. Sedangkan pada time out bagian kedua (time out karena tombol ditekan terus) mengakibatkan program akan keluar dari subroutine dengan variable nilai berisi data numeric yang terletak pada bagian akhir data pada setiap tombol (lihat table 1). Pada teknik penulisan keypad handphone, setelah terjadi penekanan tombol dan karakter tampil pada LCD maka karakter berikutnya hanya dapat diinputkan dengan penekanan tombol sesudah waktu tertentu yaitu saat cursor mulai blinking, kecuali tombol tersebut berbeda dengan tombol sebelumnya. Apabila tombol tersebut berbeda penekanan tersebut tidak perlu menunggu waktu tertentu. Contoh, pada saat penulisan kata AAA, tombol 2 ditekan untuk pertama kali dan layar LCD akan menampilkan karakter A, karakter A yang kedua hanya dapat dituliskan setelah waktu tertentu
yaitu saat cursor di LCD mulai blinking. Namun pada penulisan kata ADA di mana huruf pertama, kedua dan ketiga dituliskan dengan tombol yang berlainan, maka proses penekanan tidak perlu menunggu waktu tertentu. Untuk itu pada sistem ini, program dapat memeriksa perbedaan antara penekanan tombol saat ini dengan sebelumnya dengan membandingkan nilai dari input keypad dan nilai pada variable keypad buffer. Apabila kedua nilai tersebut tidak sama, maka program akan langsung keluar dari subroutine dengan variable nilai berisi data keypad yang lama, namun bila kedua nilai tersebut sama, maka program kembali melakukan konversi table dengan mengambil data kedua dari tombol yang ditekan. Total Tekan = 0 Reset Timer Keypad Timer 0 16 bit counter Keypad ditekan? Time Out? Total Tekan = 0? KeypadBuffer = Keypad? Keypad Buffer <= Keypad Konversi Tabel Keypad Total Tekan = 0 Akhir Data tombol? Total Tekan + 1 Tampilkan buffer ke LCD Delay Bouncing Reset Timer Keypad Start Timer Keypad Nilai<=Hasil Konversi Tabel Keypad dilepas? Tidak Time Out? Ambil data terakhir tombol Nilai = Hasil Konversi Tabel Stop Timer Keluar dari subroutine Gambar 2
Diagram Alir Subroutine Ambil Keypad Penekanan tombol yang sama yang dilakukan berulang-ulang hingga data terakhir dari tombol (00h) akan mengakibatkan karakter kembali ke bentuk pertama, yaitu misalkan A untuk tombol 2. Hal ini dilakukan dengan mereset nilai variable Total Tekan. Reset LCD CharCounter=0 Akses Keypad Tampilkan di LCD Char Counter = Char Counter + 1 Char Counter = 16? Char Counter = 32? LCD Pindah baris 2 Gambar 2 Diagram Alir Program Utama Gambar 2 menunjukkan diagram alir dari program utama yaitu program yang menggunakan subroutine ambil_keypad. LCD M1632 adalah LCD dengan susunan 16 karakter dan 2 baris oleh karena itu program harus memindah tampilan LCD ke baris 2 saat karakter ke 16 ditampilkan dan LCD akan pindah layar saat karakter ke 32. Untuk mengetahui jumlah karakter yang ditampilkan dilakukan dengan menggunakan variable character counter yang selalu bertambah setiap kali adanya penampilan karakter pada LCD.
Tabel 1. Tabel Kode Tombol dg alamat awal table di 2200h Alamat Tombol Tekan 1x Tekan 2x Tekan 3x Tekan 4x Tekan 5x Tekan 6x Tekan 7x Tekan 8x Tekan 9x Tekan 10x 2200h 0 Spasi 0 00h 220Ah 1 Titik Koma?! - & 1 00h 2214h 2 A B C 2 00h 221Eh 3 D E F 3 00h 2228h 4 G H I 4 00h 2232h 5 J K L 5 00h 223Ch 6 M N O 6 00h 2246h 7 P Q R S 7 00h 2250h 8 T U V 8 00h 225Ah 9 W X Y Z 9 00h 226Eh # # 00h 2278h * * 00h
Tabel 1 menunjukkan table data yang berisi kode-kode untuk setiap tombol keypad dengan konfigurasi tertentu. Kode 00h adalah merupakan tanda akhir dari datadata setiap tombol. Pada table di atas setiap data-data setiap tombol disimpan di lokasi memori dengan jarak 10 byte (0Ah). Dengan jarak sebesar 10 byte lokasi memori untuk tiap data-data tombol, maka tampak beberapa lokasi kosong yang tampak di table 1 sebagai kotak-kotak ber arsir. Lokasi-lokasi tersebut dapat digunakan untuk menambah kode-kode lain pada setiap tombol, contohnya kode { ingin ditambahkan di tombol 2 urutan keempat, maka data konfigurasi di baris Alamat 2214h harus diganti menjadi A B C { 2 00h. Listing 1 KonversiTabel: Movc A,@A+DPTR Mov B,#10 Mul AB Push DPH Push DPL Mov DPTR,#TabelKodeTombol Mov B,TotalTekan Add A,B Movc A,@A+DPTR Pop DPL Pop DPH Listing 1 adalah subroutine proses konversi dari data yang diperoleh dari keypad ke kode dari tombol. Karena setiap tombol dipisahkan dengan lokasi sebesar 10 byte, maka data dari keypad tersebut dikali dengan 10. Sedangkan untuk mengambil data sesuai dengan jumlah penekanan, maka selanjutnya data yang telah dikali 10 tadi dijumlahkan dengan variable total tekan yang berisi jumlah penekanan yang telah terjadi. Listing 2 Subroutine Ambil_Keypad DSEG TimeOutKeypad: Ds 1 TotalTekan: Ds 1 ;Jumlah penekanan keypad Nilai: Ds 1 KeypadBuffer: Ds 1 CSEG Keypad EQU 90H Org $ Ambil_Keypad: Mov Keypad,#0FFH ; Acall RSTTimeKeypad ;Reset Timer Keypad Mov A,TMOD ;Timer 0 mode 16 bit counter Anl A,#0F0H ; Orl A,#01H ; Mov TMOD,A ; Clr TR0 ResetTotalTekan: Mov TotalTekan,#0 ;Total penekanan = 0
Tunggu_Ditekan: Mov A,Keypad ; Cjne A,#0FFH,KeypadDitekan ; Jnb TF0,Tunggu_Ditekan Clr TF0 Inc TimeOutKeypad Mov R7,TimeOutKeypad Cjne R7,#010,Tunggu_Ditekan Clr TR0 KeypadDitekan: Jb P,Tunggu_Ditekan ;Periksa apakah baris dan kolom ;telah terhubung Mov R7,TotalTekan ; Cjne R7,#0,TidakSkip Ajmp Skip TidakSkip: Mov B,KeypadBuffer Clr C Subb A,B Jnz GantiTombol Mov A,Keypad skip: Mov Keypadbuffer,Keypad Acall KonversiTabel Jz ResetTotalTekan ;Akhir data tombol? Inc TotalTekan Mov Nilai,A Lcall Kirim_Karakter Mov A,#04H Lcall Kirim_Perintah Mov A,#' ' Lcall Kirim_Karakter Mov A,#06H Lcall Kirim_Perintah Lcall DelayBouncing3 Acall RSTTimeKeypad TungguLepas: Mov A,Keypad Setb TR0 Cjne A,#0FFH,PeriksaTimer Setb TR0 Ajmp Tunggu_Ditekan PeriksaTimer: Jnb TF0,TungguLepas Clr TF0 Inc TimeOutKeypad Mov R7,TimeOutKeypad Cjne R7,#010,TungguLepas Mov DPTR,#TabelKeypad CariAkhirDataTombol: Mov A,Keypad ;Cari akhir data tombol
Acall KonversiTabel ; Inc TotalTekan ; Jnz CariAkhirDataTombol ; Dec TotalTekan ; Dec TotalTekan ; Mov A,KeypadBuffer ;Ambil data terakhir tombol Acall KonversiTabel ; Mov Nilai,A ;Simpan di Nilai Lcall Kirim_Karakter Mov A,#04H Lcall Kirim_Perintah Mov A,#' ' Lcall Kirim_Karakter Mov A,#06H Lcall Kirim_Perintah BelumLepas: Mov A,Keypad Cjne A,#0FFH,BelumLepas GantiTombol: Clr TR0 ;Stop Timer KonversiTabel: Movc A,@A+DPTR Mov B,#10 Mul AB Push DPH Push DPL Mov DPTR,#TabelKodeTombol Mov B,TotalTekan Add A,B Movc A,@A+DPTR Pop DPL Pop DPH Reset: Mov TotalTekan,#00 Ajmp Tunggu_Ditekan DelayBouncing3: Push B Mov B,#01 Loop2DelayBounce: Acall DelayBouncing2 Djnz B,Loop2DelayBounce Pop B DelayBouncing2: Push B Mov B,#0FFH Loop1Delaybounce: Acall DelayBouncing1 Djnz B,Loop1Delaybounce Pop B
DelayBouncing1: Push B Mov B,#0FFH Djnz B,$ Pop B RSTTimeKeypad: Mov TH0,#00H Mov TL0,#00H Mov TimeOutKeypad,#00 Listing 3 Program Utama $MOD51 ;********* ; PROGRAM PENULISAN KARAKTER DENGAN MENGGUNAKAN TEKNIK PENULISAN PADA KEYPAD ; HANDPHONE OLEH MODUL DST-51, KEYPAD 4X3 & M1632 LCD DSEG CharCounter: Ds 1 Org 50H CSEG Delay_500mS EQU 0099H ;Menunda waktu selama 500 ms (timer 0 digunakan) KirimPesan_LCD EQU 160DH ;Mengirim data di alamat yang ditunjuk oleh DPTR ke LCD hingga data 0F ;- DPTR diisi dengan alamat awal data yang dikirim ;- Akhir data adalah 0FH Init_LCD ;Inisialisasi LCD EQU 1619H Kirim_Perintah EQU 1658H ;Mengirim data ke register perintah LCD ;- Data diisi di akumulator Kirim_Karakter EQU 1677H ;Mengirim data ke register data LCD ;- Data diisi di akumulator Baris2 EQU 1681H ;Memindah posisi cursor ke baris 2 ROM EQU 2000H Org ROM ;Reset Vector Ajmp Start ; Org ROM+3H ;External Interrupt 0 Vector
i ; Org ROM+0BH ;Timer 0 Interrupt Vector i ; Org ROM+13H ;External Interrupt 1 Vector i ; Org ROM+1BH ;Timer 1 Interrupt Vector i ; Org ROM+23H ;Serial Interrupt Vector i ; Start: Lcall Init_LCD ;Inisial LCD Mov CharCounter,#00 ; Loop: Mov DPTR,#TabelKeypad ;Akses Keypad Lcall Ambil_keypad ; Mov A,Nilai ;Hasil dari penekanan keypad ;tersimpan di variabel nilai Lcall Kirim_Karakter ;Kirim hasil ke LCD Inc CharCounter ;Char Counter + 1 Mov R7,CharCounter ; Cjne R7,#16,Cek32 ;Char Counter = 16, pindah Lcall Baris2 ;ke baris 2 LCD Ajmp Loop ; Cek32: Cjne R7,#32,Loop ;Char Counter = 32, kembali Ajmp Start ;ke baris 1 $include (keypad2.asm) TabelKodeTombol: DB ' 0',0 Org TabelKodeTombol+10 DB '.,?!-&1',0 Org TabelKodeTombol+20 DB 'ABC2',0 Org TabelKodeTombol+30 DB 'DEF3',0 Org TabelKodeTombol+40 DB 'GHI4',0 Org TabelKodeTombol+50 DB 'JKL5',0 Org TabelKodeTombol+60 DB 'MNO6',0 Org TabelKodeTombol+70 DB 'PQRS7',0 Org TabelKodeTombol+80 DB 'TUV8',0 Org TabelKodeTombol+90 DB 'WXYZ9',0 Org TabelKodeTombol+110 DB '#',0 Org TabelKodeTombol+120 DB '*',0 CSEG Org ROM+0F00H
Kpd1 EQU 0B7H Kpd2 EQU 0D7H Kpd3 EQU 0E7H Kpd4 EQU 0BBH Kpd5 EQU 0DBH Kpd6 EQU 0EBH Kpd7 EQU 0BDH Kpd8 EQU 0DDH Kpd9 EQU 0EDH Kpdstar EQU 0BEH Kpd0 EQU 0DEH Kpdpgr EQU 0EEH TabelKeypad: Org TabelKeypad+Kpd1 DB 1 Org TabelKeypad+Kpd4 DB 4 Org TabelKeypad+Kpd7 DB 7 Org TabelKeypad+Kpdstar DB 0BH Org TabelKeypad+Kpd2 DB 2 Org TabelKeypad+Kpd5 DB 5 Org TabelKeypad+Kpd8 DB 8 Org TabelKeypad+Kpd0 DB 0 Org TabelKeypad+Kpd3 DB 3 Org TabelKeypad+Kpd6 DB 6 Org TabelKeypad+Kpd9 DB 9 Org TabelKeypad+Kpdpgr DB 0CH END