Keypad
heksadesimal
Oleh: Budhy Sutanto
Port paralel merupakan bagian mikrokontroler
yang paling banyak dipakai. Mulai dari hal-hal yang
sangat sederhana misalnya untuk menyalakan LED atau membaca tombol, dipakai pula
untuk membentuk Keypad heksadesimal, untuk mengendalikan stepper motor maupun
menghubungkan mikrokontroler ke printer paralel.
Secara umum yang dikatakan sebagai port paralel adalah sarana input/output yang
bisa dipakai untuk transfer data beberapa bit (biasanya 8 bit) sekali
gus lewat jalur (kaki IC) yang dipersiapkan untuk itu.
Jalur tersebut dinomori dari 0 sampai 7, sesuai dengan nomor urut bit dalam
akumulator yang biasa dipakai untuk trasfer data ke/dari port paralel. Misalnya
akumulator dipakai untuk menerima data dari Port 0, maka jalur nomor 0 dari Port
0 (biasanya disingkat sebagai
P0.0)
akan ditransfer ke akumulator bit nomor 0 (biasanya
disingkat sebagai
A.0).
Hampir semua kaki IC mikrokontroler bisa dipakai sebagai
port paralel. AT89C2051 kakinya 20, 15 kaki bisa
dipakai sebagai port paralel. AT89C51 berkaki 40
diantaranya 32 kaki bisa dipakai sebagai port parallel.
Meskipun demikian, ada juga port paralel yang tidak terdiri dari 8 jalur,
misalnya Port 1 dari AT89C2051 hanya terdiri dari 7 jalur,
dinomori mulai dari
P1.0 sampai
P1.7,
tapi tidak ada
P1.6.
Hal semacam ini biasanya disebabkan karena kaki IC yang
tersedia tidak cukup untuk menampung semua jalur port paralel bersangkutan
secara lengkap.
Semua jalur pada port paralel (kecuali Port 0) mikrokontroler keluarga MCS51
dilengkapi dengan tahanan sekitar 50 kOhm, menghubungkan jalur bersangkutan ke
sumber daya Vcc. Pada chip AT89C1051, AT89C2051 dan AT89C4051, Port 1 jalur 0
dan 1 (P1.0
dan P1.1)
tidak dilengkapi dengan tahanan tersebut, akibatnya kalau kedua jalur tersebut
dipakai sebagai output harus ditambah tahanan di luar AT89C2051, yang
menghubungkan jalur-jalur tersebut ke sumber daya Vcc.
Matrik Keypad 4 x 4
Matrik Keypad 4x4 merupakan susunan 16 tombol membentuk keypad sebagai sarana
masukkan ke mikrokontroler, meskipun jumlah tombol ada 16 tapi hanya memerlukan
8 jalur port paralel, seperti terlihat dalam Gambar 1.
Gambar
1Matrik Keypad 4x4
Dalam rangkaian Gambar
1, masing-masing tombol menghubungkan sebuah jalur output (K1; K2; K3 atau K4)
ke sebuah jalur input (B1; B2; B3 atau B4), seperti yang digambarkan secara
rinci dalam bulatan bagian kanan bawah gambar, tombol A menghubungkan jalur K1
ke jalur B4.
Kerja dari rangkaian
keypad ini sepenuhnya dilaksanakan dengan perangkat lunak, yang diwujudkan
sebagai sub-rutin
BacaKeyPad pada Potongan Program 1.
Potongan Program 1 :
Sub-rutin Pembaca Matrik Keypad 4x4
01: ; Kolom1..4 :
P1.4..P1.7 sebagai scan output
02: ; Baris1..4 :
P1.0..P1.3 sebagai switch input
03: ;
04: ; Keluar dari sub-rutin BacaKeyPad, A=nomor
tombol
05: ; yang ditekan (susuai dengan susunan Gambar
1)
06: ; jika C=1. Kalau
C=0 berarti tombol tidak ditekan
07: ;
08: ; sub-rutin ini merubah nilai A,B dan R2
09: ;
10: BacaKeyPad:
11: MOV A,#%11101111
12: MOV P1,A aktipkan kolom 1
13: CJNE A,P1,Periksa A<>P1 : Ada Tombol
Ditekan
14: MOV A,#%11011111
15: MOV P1,A aktipkan kolom 2
16: CJNE A,P1,Periksa A<>P1 : Ada Tombol
Ditekan
17: MOV A,#%10111111
18: MOV P1,A aktipkan kolom 3
19: CJNE A,P1,Periksa A<>P1 : Ada Tombol
Ditekan
20: MOV A,#%01111111
21: MOV P1,A aktipkan kolom 4
22: CJNE A,P1,Periksa A<>P1 : Ada Tombol
Ditekan
23: CLR C Tombol tidak ditekan
24: RET
25: ;
26: Periksa:
27: MOV B,P1 Simpan P1 ke B
28: MOV R2,#0 Mulai No 0
29: Lainnya:
30: MOV A,R2
31: ACALL BacaKombinasi Ambil Isi Tabel ke A
32: CJNE A,B,TidakSama
= Nilai P1?
33: MOV A,R2 Ya, A := No Tombol
34: MOV WaktuTunda,#32 tunggu l.k. 0.3 detik
35: SETB TR0 Start Timer 0
36: SETB C Ada Tombol ditekan
37: RET
38: ;
39: TidakSama:
40: INC R2 No Tombol Lainnya
41: CJNE R2,#16,Lainnya
Sudah semua tombol?
42: CLR C Ya, tidak ada Tombol
ditekan
43: RET
44:
45: BacaKombinasi:
46: INC A melompati instruksi
RET
47: MOVC A,@A+PC ambil isi Tabel
Kombinasi Baris/Kolom
48: RET
49: ;
50: ;***** Tabel Kombinasi Baris dan Kolom
51: db %11010111 ; 0
52: db %11101110 ; 1
53: db %11011110 ; 2
54: db %10111110 ; 3
55: db %11101101 ; 4
56: db %11011101 ; 5
57: db %10111101 ; 6
58: db %11101011 ; 7
59: db %11011011 ; 8
60: db %10111011 ; 9
61: db %11100111 ; A
62: db %10110111 ; B
63: db %01111110 ; C
64: db %01111101 ; D
65: db %01111011 ; E
66: db %01110111 ; F
Jalur output
K1 sampai
K4
merupakan Port 1 jalur 4 sampai 7 (P1.4..P1.7).
Jalur input
B1
sampai B4
merupakan Port 1 jalur 0 sampai 3 (P1.0..P1.3).
Artinya setengah dari Port 1 dipakai sebagai output dan setengahnya lagi dipakai
sebagai input. Dalam hal semacam ini agar jalur input bisa berfungsi semustinya,
saat mengirim data ke Port 1 harus diusahakan jalur-jalur yang menjadi input
selalu dalam kedudukan 1,
seperti terlihat pada baris 11; 14; 17 dan 20 Program 1, bit 0 sampai bit 3 yang
dikirimkan ke Port 1 semuanya adalah 1.
Sebaliknya saat mengambil data dari Port 1,
data yang pernah dikirim ke jalur output (P1.4..P1.7)
akan ikut diambil bersama data pada jalur input,
sehingga data yang dikirim dan data yang diambil bisa dibandingkan lewat
instruksi pada baris 12; 15; 18 dan 21 Program 1.
16 tombol pembentuk
keypad diperiksa keadaannya lewat baris 11 sampai 22 dalam 4 kali pembacaaan.
Lewat baris 11 dan 12, kolom 1 (P1.4)
di-nol-kan sedangkan 7 jalur Port 1 lainnya dalam keadaan 1,
dalam keadaan semacam ini
P1.0 sampai
P1.3
akan siap sebagai input, kalau saat ini salah satu dari tombol 1;
4; 7
atau A
ada yang ditekan akan mengakibatkan salah satu jalur input
P1.0..P1.3
menjadi 0.
Keadaan ini membuat data yang diambil dari Port 1 berlainan dengan data yang
tadi dikirim ke Port 1, sehingga lewat instruksi baris 13 MCS51 bisa menentukan
bahwa saat itu ada tombol yang ditekan dan harus di
Periksa
lebih lanjut.
Jika saat itu salah satu dari tombol 1;
4; 7
atau A
tidak ada yang ditekan, atau yang ditekan adalah tombol yang berada pada kolom
2; 3 atau 4 (misalnya tombol 2;
3 C
atau yang lainnya), semua jalur input (P1.0
..
P1.3)
tetap dalam keadaan 1,
sehingga saat MCS51 membaca Port 1 dan membandingkan dengan data yang tadi
dikeluarkan ke Port 1 lewat instruksi baris 13, MCS51 akan merasakan tidak ada
tombol yang ditekan dan meneruskan instruksi baris 14.
Hal-hal tersebut di
atas diulang untuk kolom 2 (baris 14; 15 dan 16), jika ternyata tidak ada tombol
yang ditekan dilanjutkan dengan memeriksa kolom 3 (baris 17; 18 dan 19) serta
kolom 4 (baris 20; 21 dan 22). Setelah memeriksa kolom 4, jika ternyata
tidak menemukan ada tombol yang ditekan, MCS51 akan meninggalkan sub-rutin
BacaKeypad
pada baris 24, tapi sebelum itu pada baris 23 bit Carry di-nol-kan,
sebagai tanda bahwa tidak ada tombol yang ditekan.
Bagian
Periksa
dipakai untuk memastikan hanya ada satu tombol yang ditekan, jika ternyata lebih
dari satu tombol yang ditekan maka dianggap tidak ada tombol yang ditekan, MCS51
meninggalkan sub-rutin
BacaKeypad
lewat baris 42 (me-nol-kan bit Carry) dan baris 43 (RET).
Baris 51 sampai dengan
66 merupakan Tabel Kombinasi Baris dan Kolom yang dipakai untuk menentukan hal
tersebut di atas. Pada baris 27 Port 1 dibaca dan disimpan ke dalam
register B untuk dipakai sebagai pembanding pada baris 32.
R2 dipakai
sebagai counter untuk menomori Tabel Kombinasi Baris dan Kolom, nilai awal
R2=0
(baris 28), nilai
R2 naik satu (baris 40) setiap kali dijumpai nilai Port 1 yang
disimpan di
B
tidak sama dengan nilai Tabel yang dinomori dengan
R2 (baris
32). Kalau nilai
R2
sudah sampai 16 (baris 41) berarti nilai Port 1 yang disimpan di
B sudah
dibandingkan dengan seluruh isi Tabel, tapi tidak ada yang sesuai.
Artinya lebih dari satu tombol yang ditekan, keadaan ini
diabaikan dengan menganggap tidak ada tombol yang ditekan, seperti yang sudah
dibahas di atas.
Pada baris 32, jika ternyata nilai Port 1
yang disimpan di
B
sama dengan salah satu isi Tabel, MCS51 akan menjalankan baris 33 dan seterusnya.
Tabel Kombinasi Baris dan Kolom disusun
dengan cara berikut, bilangan yang diisikan ke dalam
Tabel (angka biner di belakang
db) adalah
kombinasi Baris dan Kolom. Bilangan ini disusun sesuai dengan nomor yang
diwakilinya, artinya kombinasi untuk tombol
0
diletakkan pada baris pertama, kombinasi untuk tombol
1
diletakkan di baris kedua dan seterusnya.
Dengan cara
penyusunan Tabel semacam ini,
R2 yang
dipakai untuk menomori Tabel sama dengan nomor tombol pada keypad.
Dengan demikian, pada baris 33 nilai
R2 disimpan
ke akumulator sebagai hasil pembacaan keypad. MCS51 meninggalkan sub-rutin
BacaKeypad
lewat baris 36 (me-satu-kan bit Carry) dan baris 37 (RET).
Mengatasi getaran
tombol
Semua tombol mekanis yang biasa dipakai untuk keypad, saat ditekan atau saat
tekanan pada tombol dilepas akan bergetar selama lebih kurang 30 sampai 50
mili-detik, sifat ini akan mengakibatkan sub-rutin pembacaan keypad merasakan
adanya penekanan tombol secara berulang-ulang, meskipun sesungguhnya tombol
hanya ditekan sekali saja. Gejala ini biasanya disebut
sebagai bounce.
Untuk mengatasi masalah ini, setelah berhasil membaca nilai
tombol yang ditekan, MCS51 dipaksa istirahat berapa saat sampai tombol tidak
bergetak, sebelum membaca tombol berikutnya. Hal ini
dilakukan dengan sub-rutin BebasGetar seperti terlihat dalam Potongan Program 2.
Potongan Program 2 :
Sub-rutin Pembaca Keypad Bebas Getar
01: BebasGetar:
02: ACALL BacaKeyPad ; C menandakan ada tombol
yang ditekan/tidak
03: JNC Selesai ; C=0, tidak ada tombol
ditekan -> Selesai
04: ;
05: ; C=1, Ada tombol ditekan, istirahat dulu
sekitar 0.25 detik
06: MOV B,#0
07: MOV R2,#0
08: Tunda:
09: NOP
10: NOP
11: DJNZ R2,Tunda ; menunggu di sini
sekitar 4*256 mikro-detik
12: DJNZ B,Tunda ; diulang sebanyak 256
kali
13: Selesai:
14: RET
Baris 02 pada
Potongan Program 2 di atas memanggil sub-rutin
BacaKeyPad,
dalam sub-rutin
BacaKeyPad diperiksa apakah ada tombol yang ditekan, kalau ada tombol
yang ditekan nomor tombol tersebut disimpan di A dan bit Carry
di-satu-kan, kalau tidak ada tombol yang ditekan bisa Carry di-nol-kan.
Jadi MCS51 tidak tertahan di sub-rutin tersebut sampai ada tombol ditekan, dan
program pemanggil sub-rutin tersebut harus memeriksa apa
hasil kerja sub-rutin
BacaKeyPad.
Baris 03 memeriksa hasil kerja sub-rutin
BacaKeypad,
kalau ternyata tidak ada tombol yang ditekan segera meninggalkan sub-rutin ini
lewat Selesai,
kalau ada tombol ditekan MCS51 di-istirahat-kan dulu sekitar 0.25 detik
menunggu masa getar tombol mekanis selesai.
Baris 06 sampai 12
menentukan waktu tunda. Penundaan waktu terutama terjadi pada baris 09
sampai 11, MCS51 memerlukan waktu 4 * 256 mikro-detik atau 1,024 mili-detik (dengan
anggapan MCS51 bekerja dengan kristal 12 MHz).
Penundaan waktu ini diulang sebanyak 256 kali dengan instruksi baris 12 sehingga
diperoleh waktu tunda total sekitar seperempat detik.
Instruksi-instruksi pada baris 06 sampai 12
tidak satu pun yang merubah nilai A dan nilai bit
Carry, sehingga apa yang didapat dari sub-rutin
BacaKeyPad
(yakni nomor tombol yang ditekan disimpan di A dan bit Carry di-satu-kan)
tetap dipertahankan sampai sub-rutin ini selesai di baris 14.
Pemakaian sub-rutin
Sub-rutin
BacaKeyPad maupun sub-rutin
BebasGetar
di atas merupakan sub-rutin dasar yang dipersiapkan untuk dipakai dibagian lain,
memanggil kedua sub-rutin tersebut belum tentu memperoleh data dari
tombol, sehingga program lain yang memakainya harus memeriksa hasil kerjanya
lewat bit Carry.
Jika dikehendaki membaca keypad sampai ada tombol
yang ditekan, caranya sebagai berikut :
TungguKeyPad:
ACALL BebasGetar
JNC TunggKeyPad
. . .
Untuk mengatasi getaran tombol, bisa pula
dilakukan dengan cara membaca Key Pad hanya dalam
waktu-waktu tertentu, misalnya sub-rutin
BacaKeyPad
dipanggil setengah detik sekali, sehingga tidak perlu membuang waktu selama
waktu tunda dalam sub-rutin
BebasGetar.
Cara ini dipakai untuk
membaca tombol pengatur waktu dalam artikel Digital Clock - Ilhami Prinsip
Dasar Microcontroller, tombol tersebut dibaca sekali dalam waktu setengah
detik.
Dalam hal semacam ini, sub-rutin
BacaKeyPad di
atas, bisa dipakai menggantikan
PeriksaTombol
dalam program pengatur Digital Clock, dengan penyesuaian rangkaian bisa dibentuk
Digital Clock baru yang dilengkapi Key Pad.