PENGGUNAAN KEYPAD 4X3 DAN PC KEYBOARD PADA MODUL DST-52 DENGAN TAMPILAN M1632 LCD Setelah kita bahas penggunaan keypad 4x3 (tipe KP-43865) dengan metode penulisan karakter pada keypad handphone di mana hanya dengan menggunakan keypad 4x3 data alphabet maupun tanda baca dapat diinputkan ke dalam sebuah sistem pada edisi sebelumnya. Kali ini akan dibahas gabungan pemakaian keypad 4x3 dengan sistem penulisan menggunakan metode penulisan karakter pada keypad handphone dengan PC Keyboard. Penggunaan PC Keybo ard dalam memberikan input data pada suatu sistem memang dirasa lebih cepat dan leluasa dibandingkan dengan keypad terutama untuk data alphabet. Namun PC Keyboard seringkali juga dirasa terlalu besar untuk sebuah sistem yang bersifat portable. Oleh karena itu pada artikel ini akan dibahas bagaimana pengguunaan kedua perangkat input tersebut dalam satu sistem. DST-52 dalam hal ini yang berfungsi sebagai basis sistem akan memproses data dari kedua perangkat input tersebut tanpa menggunakan bantuan peripheral atau perangkat elektronik apapun, sehingga pengguna Modul DST-52 tidak perlu menambah anggaran biaya untuk membeli peripheral pendukung dalam aplikasi yang dibahas ini. Seperti yang telah dijelaskan pada edisi sebelumnya hubungan antara Modul DST-5 2 d e n gan M1632 LCD dan Keypad 4x3 tampak pada gambar 1. Sedangkan diagram alir dari bagian software yang merupakan bagian utama dari aplikasi ini terdiri dari 3 bagian. Diagram alir pertama pada gambar 3 membahas bagian program utama, diagram alir kedua pada gambar 4 akan membahas bagian interupsi keyboard dan gambar 5 akan membahas lebih detail mengenai proses pengambilan data karakter pada keyboard. VCC P0.7 P0.6 P0.5 P0.4 P3.2 P2.1/A9 14 13 12 11 10 9 8 7 6 5 4 U? D7 D6 D5 D4 D3 D2 D1 D0 E R/W RS LCD MATRIX 2X16 VCC VLCD GND 2 3 1 10K Gambar 1 Antar muka Modul DST-52 dengan M1632 LCD
P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 R1 2 3 4 5 6 VCC 7 8 9 1 R-PACK S1 KEYPAD 4X3 1 2 3 4 5 6 7 8 9 * 0 # JP1 P1.3 1 2 P1.0 P1.1 3 4 P1.2 P1.2 P1.3 5 6 P1.4 P1.5 7 8 P1.1 P1.6 P1.7 9 10 P1.0 PORT 1 P1.4 P1.5 P1.6 Gambar 2 Antar Muka KP-43865 dengan Modul DST-52 Proses kerja dari aplikasi ini diawali dengan proses inisialisasi LCD maupun keyboard yang selalu dilakukan pada bagian awal dari program. Secara garis besar proses ini akan melakukan polling terhadap input dari keypad sedangkan input dari keyboard dilakukan dengan interupsi. Oleh karena itu selanjutnya interupsi keyboard yang terletak pada interupsi eksternal 0 terlebih dahulu diaktifkan. Sedangkan variabel character counter yang merupakan penunjuk lokasi karakter pada LCD diberi harga nol sehingga lokasi karakter akan dimulai pada bagian kiri atas LCD. Kemudian sistem akan menunggu masukan dari keypad secara polling ataupun interupsi dari PC Keyboard. Masukan dari keypad maupun PC Keyboard akan menyebabkan program berjalan ke bagian lebih lanjut yaitu pro ses menampilkan data pada variabel nilai ke LCD. Variabel nilai dalam hal ini akan berisi nilai yang terbaca oleh keypad ataupun PC Keyboard. Setelah nilai ditampilkan ke layar LCD, maka variabel character counter bertambah satu yang menunjukkan bahwa satu karakter telah ditampilkan ke layar LCD. Hal ini dilakukan berulang-ulang setiap adanya input data dari PC Keyboard maupun Keypad hingga data ke 16 maupun 32. Pada data ke 16 maka tampilan akan dipindah ke baris 2, sedangkan pada data ke 32 maka tampilan akan dihapus dan penulisan akan dimulai dari bagian awal LCD kembali.
Inisial LCD Inisial Keyboard Aktifkan Interupsi Keyboard Character Counter = 0 Ambil Keypad Input diperoleh Nilai <= Keypad Tampilkan nilai di LCD Character Counter + 1 Character Counter = 16? Character Counter = 32? Pindah ke Baris 2 Matikan Interupsi Keyboard Gambar 3 Diagram Alir Program Utama Matikan Interupsi Keyboard Ambil Karakter Keyboard Recover Stack Lompat ke input diperoleh Gambar 4 Diagram Alir Interupsi Keyboard Pada gambar 4 dijelaskan proses yang terjadi pada saat interupsi dari keyboard dilakukan. Terlebih dahulu program akan mematikan interupsi keyboard tersebut selama layanan interupsi sedang diproses. Kemudian proses pengambilan karakter keyboard dilakukan sehingga variabel nilai terisi dengan kode ASCII dari karakter keyboard
tersebut. Pada proses ini selain pengambilan kode ASCII dari karakter keyboard, juga dilakukan deteksi penekanan tombol Shift maupun Caps Lock yang akan dibahas pada Diagram Alir Ambil Karakter Keyboard. Ambil Keyboard Deteksi tombol ditekan ScanCode = F0? No RShift/Lshift/ Caps Lock? Konversi Scan Code Shift Flag = 1? Tunggu KbdClock Ambil Keyboard Rubah ke huruf besar No Deteksi Scan Code saat Keyboard dilepas RShift/LShift? Yes Set Carry Flag Aktifkan Interrupt No Complement Shift Flag Clear Carry Flag Deteksi Scan Code saat keyboard ditekan Kembali dari Interrupt Penekanan tombol pada keyboard tidak hanya menghasilkan sebuah s can code saja, namun dapat terdiri dari tiga atau bahkan lebih scan code. Apabila tombol sebuah tombol ditekan maka scan code akan terkirim terus menerus hingga pada saat tombol tersebut dilepas maka scan code F0 dan scan code tombol itu sendiri akan dikir im sebagai tanda bahwa tombol telah dilepas. Contoh: - - 1C F0 1C Tombol a ditekan sekali - - 1C 1C 1C F0 1C Tombol a ditekan agak lama dan dilepas - - 12 12 12 1C F0 1C F0 12 Tombol shift kiri ditekan agak lama, kemudian a ditekan sekali dan shift kiri dilepas Oleh karena itu Pada diagram alir tersebut terdapat dua bagian proses secara garis besarnya, yaitu proses deteksi scan code saat tombol ditekan dan deteksi scan code saat tombol dilepas. Pada masing- masing proses, baik saat tombol ditekan maupun dilepas dibedakan menjadi dua proses lagi yaitu deteksi apakah scan code berupa shift kanan atau
kiri untuk tombol dilepas dan scan code berupa caps lock, shift kanan atau shift kiri untuk tombol ditekan. Oleh karena itu hasil dari bagian ini terdiri dari: - - Tombol shift ditekan : flag carry logika 0, komplemen flag shift - - Bukan tombol shift ditekan : flag carry logika 1, konversi scan code - - Tombol shift dilepas : flag carry logika 0, komplemen flag shift - - Bukan tombol shift dilepas ; flag carry logika 0 Bila tombol shift ditekan maka kondisi flag shift di komplemen sehingga karakter pada penekanan selanjutnya akan diubah menjadi huruf besar bila sebelumnya adalah huruf kecil dan sebaliknya menjadi huruf kecil bila sebelumnya adalah huruf besar dan kondisi flag carry adalah logika 0. Bila bukan tombol shift yang ditekan, maka scan code dikonversi sesuai tabel keyboard dan kondisi flag carry adalah logika 1. Flag shift di komplemen lagi pada saat tombol shift dilepas sehingga karakter pada penekanan selanjutnya akan diubah menjadi huruf besar bila sebelumnya adalah huruf kecil dan sebaliknya menjadi huruf kecil bila sebelumnya adalah huruf besar dan kondisi f l a g c a r r y adalah logika 0. Bila bukan tombol shift dilepas maka flag carry berlogika 0 dan flag shift tidak berubah dari kondisi sebelumnya. Carry Flag dalam hal ini digunakan untuk mendeteksi masukan data keyboard berupa karakter atau tombol shift. Hal ini diperl ukan oleh program untuk mendeteksi apakah masukan tersebut perlu ditampilkan ke LCD atau tidak. Masukan berupa karakter maupun tanda baca akan ditampilkan ke LCD, sedangkan masukan berupa tombol shift tidak akan ditampilkan ke layar LCD. Dengan adanya aplikasi ini, proses pemberian input ke dalam suatu sistem akan berlangsung dengan lebih mudah dan praktis. Program lengkap aplikasi ini dapat didownload di w w w. d e l t a- electronic.com bagian software Listing 1 $MOD51 DSEG CharCounter: Ds 1 StackTemp: Ds 1 Org 50H CSEG Serial_Out EQU 00FCH Delay_100mS EQU 00A2H ;Menunda waktu selama 100 ms (timer 0 digunakan) Delay_500mS EQU 0099H ;Menunda waktu selama 500 ms (timer 0 digunakan) ;============= ;HD44780 ;============= GeserDisplay_Kanan EQU 05BDH ;Menggeser tampilan LCD HD44780 ke kanan GeserDisplay_Kiri EQU 05C4H ;Menggeser tampilan LCD HD44780 ke kiri
Posisi_Awal EQU 05CBH ;Mengatur posisi cursor LCD ke posisi awal GeserCursor_Kiri EQU 05D2H ;Menggeser Cursor LCD ke kiri GeserCursor_Kanan EQU 05D9H ;Menggeser Cursor LCD ke kanan KirimPesan_LCD EQU 05E0H ;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 05ECH Kirim_Perintah EQU 062BH ;Mengirim data ke register perintah LCD ;- Data diisi di akumulator Kirim_Karakter EQU 064AH ;Mengirim data ke register data LCD ;- Data diisi di akumulator Baris2 EQU 0654H ;Memindah posisi cursor ke baris 2 Ambil_ScanCode EQU 0865H ;Mengambil 1 byte scan code keyboard ;- Nilai scan code berada pada akumulator KirimScanCode EQU 08A3H ;Mengirim 1 byte scan code keyboard ;- Nilai scan code berada pada akumulator InitKeyboard ;Inisialisasi Keyboard EQU 08C4H CapslockLED EQU 08DDH ;Mengaktifkan LED Caps Lock Keyboard ROM EQU 2000H Org ROM ;Reset Vector Ajmp Start ; Org ROM+3H ;External Interrupt 0 Vector Ljmp Intr0 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:
Loop: Lcall Init_LCD ;Inisial LCD Lcall InitKeyboard ; Setb EA ; Setb EX0 ; Mov CharCounter,#00 ; Mov StackTemp,SP Mov DPTR,#TabelKeypad ;Akses Keypad Lcall Ambil_keypad ; Setb EX0 InputDiperoleh: 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 Clr EX0 Ajmp Start ;ke baris 1 Intr0: Clr EX0 Push ACC Push 07H Lcall AmbilKarakterKeyboard Pop 07H Mov Nilai,A Lcall Delay_100mS Lcall Delay_100mS Pop ACC Mov A,SP Mov B,StackTemp Clr C Subb A,B LoopRecoverStack: Pop B Djnz ACC,LoopRecoverStack Mov DPTR,#Inputdiperoleh Push DPL Push DPH Setb EX0 Reti AmbilKarakterKeyboard: Push DPH Push DPL LoopAmbilKarakterKbd:
Mov DPTR,#AmbilKarakterSelesai Jb INT0,$ Lcall AmbilKeyboard AmbilKarakterSelesai: Jnc LoopAmbilKarakterKbd Pop DPL Pop DPH Ret $include (keypad2.asm) $include (kboard2.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 $include (tabkey.asm) END