Home|Tutorial | ElecProject | KuliahElektro | Download | Link | Rupa2 | Ide| Skema Elektronik

 
         
     

 

 

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.

 

 

 

 

 

 

 Copyright (C) anekawarna.890m.com 2007
For problems or questions regarding this web contact [admin]
Last updated: Friday October 23, 2009 16:25:29.