Matrik Keypad 4 x 4 Heksadesimal

Tuesday, September 26th, 2023 - Aplikasi Mikrokontroler

Membuat Matrik Keypad 4 x 4 Heksadesimal

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 4×4 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.

Matrik Keypad 4 x 4 Heksadesimal,matrik keypad 4 x 4 heksadesimal,matrik keypad 4x4,matrik keypad heksadesimal,matrik keypad hexadesimal,membuat matrik keypad,matrik keypad dengan mikrokontroler,program matrik keypad

Gambar 1. Rangkaian Matrik Keypad 4 x 4 Heksadesimal

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 4×4

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.

Selamat mencoba, semoga berhasil dalam membuat “Matrik Keypad 4 x 4 Heksadesimal”.

Title : Matrik Keypad 4 x 4 Heksadesimal
Archive : Aplikasi Mikrokontroler

You may also like, related Matrik Keypad 4 x 4 Heksadesimal