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.
2
A B C 2 Penekanan 1 Penekanan 2 Penekanan 3 Penekanan 4 Gambar 1Contoh 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? Keypad Buffer <= Keypad Konversi Tabel Keypad 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
Ya Ya KeypadBuffer = Keypad? Ya Ya Stop Timer Keluar dari subroutine
Ya Total Tekan = 0
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 Ya Ya Gambar 2Diagram 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
data-data setiap tombol. Pada table di atas setiap data-data-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 Ret
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 2Subroutine 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:
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 Ret 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:
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 Ret 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 Ret Reset: Mov TotalTekan,#00 Ajmp Tunggu_Ditekan DelayBouncing3: Push B Mov B,#01 Loop2DelayBounce: Acall DelayBouncing2 Djnz B,Loop2DelayBounce Pop B Ret DelayBouncing2: Push B Mov B,#0FFH Loop1Delaybounce: Acall DelayBouncing1 Djnz B,Loop1Delaybounce Pop B
Ret DelayBouncing1: Push B Mov B,#0FFH Djnz B,$ Pop B Ret RSTTimeKeypad: Mov TH0,#00H Mov TL0,#00H Mov TimeOutKeypad,#00 Ret 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 EQU 1619H ;Inisialisasi LCD
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 ;
Reti ;
Org ROM+0BH ;Timer 0 Interrupt Vector
Reti ;
Org ROM+13H ;External Interrupt 1 Vector
Reti ;
Org ROM+1BH ;Timer 1 Interrupt Vector
Reti ;
Org ROM+23H ;Serial Interrupt Vector
Reti ;
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