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 Keyboard 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-52 dengan 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 U? P0.7 P0.6 P0.5 P0.4
P3.2 P2.1/A9
14 13 12 11 10 9 8 7 6 5 4
D7 D6 D5 D4 D3 D2 D1 D0 E R/W RS
VCC
2
10K
VLCD GND
LCD MATRIX 2X16
Gambar 1 Antar muka Modul DST-52 dengan M1632 LCD
3 1
R1 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
2 3 4 5 6 7 8 9
VCC 1 R-PACK
S1 KEYPAD 4X3 1
2
3
4
5
6
7
8
9
*
0
#
JP1 P1.3 P1.2 P1.1 P1.0
P1.0 P1.2 P1.4 P1.6
1 3 5 7 9
2 4 6 8 10
P1.1 P1.3 P1.5 P1.7
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 proses 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.
Deteksi tombol ditekan
Ambil Keyboard
ScanCode = F0?
No
Konversi Scan Code
RShift/Lshift/ Caps Lock?
Shift Flag = 1? Tunggu KbdClock Rubah ke huruf besar
Ambil Keyboard
No
Deteksi Scan Code saat Keyboard dilepas RShift/LShift?
Yes
Set Carry Flag Aktifkan Interrupt
Complement Shift Flag No
Deteksi Scan Code saat keyboard ditekan Clear Carry Flag
Kembali dari Interrupt
Penekanan tombol pada keyboard tidak hanya menghasilkan sebuah scan 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 dikirim sebagai tanda bahwa tombol telah dilepas. Contoh: -
-
-
-
1C F0 1C 1C 1C 1C ……… F0 1C
Tombol “a” ditekan sekali 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 flag carry 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 diperlukan 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 www.delta-electronic.com bagian software Listing 1 $MOD51 DSEG CharCounter: StackTemp: Ds Org CSEG
Ds 1
1
50H
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 ;Memindah posisi cursor ke baris 2
0654H
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 Org Ajmp Org Ljmp Org Reti Org Reti Org Reti Org Reti
Start:
ROM Start ROM+3H Intr0 ROM+0BH
2000H ;Reset Vector ; ;External Interrupt 0 Vector ;Timer 0 Interrupt Vector ;
ROM+13H
;External Interrupt 1 Vector ;
ROM+1BH
;Timer 1 Interrupt Vector ;
ROM+23H
;Serial Interrupt Vector ;
Lcall Lcall Setb Setb Mov Mov
Init_LCD InitKeyboard EA EX0 CharCounter,#00 StackTemp,SP
;Inisial LCD ; ; ; ;
Loop: Mov DPTR,#TabelKeypad Lcall Ambil_keypad Setb EX0 InputDiperoleh: Mov A,Nilai Lcall Inc Mov Cjne Lcall Ajmp
Kirim_Karakter CharCounter R7,CharCounter R7,#16,Cek32 Baris2 Loop
Cjne Clr Ajmp
R7,#32,Loop EX0 Start
Clr Push Push Lcall Pop
EX0 ACC 07H AmbilKarakterKeyboard 07H
Mov Lcall Lcall Pop
Nilai,A Delay_100mS Delay_100mS ACC
;Akses Keypad ;
;Hasil dari penekanan keypad ;tersimpan di variabel nilai ;Kirim hasil ke LCD ;Char Counter + 1 ; ;Char Counter = 16, pindah ;ke baris 2 LCD ;
Cek32:
Intr0:
Mov A,SP Mov B,StackTemp Clr C Subb A,B LoopRecoverStack: Pop B Djnz ACC,LoopRecoverStack Mov Push Push Setb Reti
DPTR,#Inputdiperoleh DPL DPH EX0
AmbilKarakterKeyboard: Push DPH Push DPL LoopAmbilKarakterKbd:
;Char Counter = 32, kembali ;ke baris 1
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