Translate

Matriks Keypad Dengan Keluaran Serial Menggunakan AT89C2051



Pada sebuah perangkat, kadang kita menggunakan satu atau lebih komponen berupa sakelar. Entah itu sakelar geser, tombol tekan atau push button baik push ON atau push OFF atau sekedar sebuah jumperan. Semua itu adalah salah satu bentuk masukan untuk perangkat yang bersifat manual yaitu masukan itu dilakukan oleh operator atau pengguna perangkat tersebut.

Sakelar yang digunakan pada sebuah perangkat kadang terdiri dari satu atau lebih tergantung kebutuhan dan fungsi dari perangkat itu sendiri. Setidaknya sebuah sakelar diperlukan meskipun sekedar untuk ON dan OFF atau untuk menghidupkan dan mematikan perangkat, namun itu tidak relevan dengan pembahasan kita. Sakelar yang dimaksud dalam sebuah perangkat adalah sakelar yang kondisi kontaknya mempengaruhi kerja sebuah perangkat, lebih jauh lagi kondisi logika sakelar tersebut diproses oleh perangkat sebagai sebuah perintah yang harus dikerjakan dan mempengaruhi hasil keluarannya baik langsung maupun tidak langsung.

Ada beberapa perangkat yang hanya membutuhkan sedikit sakelar untuk masukannya, sebagai contoh panel CPU yang cuma memiliki tombol ON/OFF dan RESET. Atau monitor komputer atau televisi yang memiliki sedikit lebih banyak tombol sakelar untuk menu hingga enam atau lebih tombol.

Ada perangkat yang membutuhkan begitu banyak sakelar berbentuk tombol. Sekedar contoh adalah remot televisi atau kalkulator dan yang aku gunakan untuk mengetik postingan ini adalah sebuah keyboard yang bahkan memiliki ratusan tombol.

Bagaimana mengaplikasikan sakelar tombol pada sebuah perangkat tergantung kebutuhan dan ketersediaan saluran masukan dari perangkat. Untuk perangkat yang sedikit menggunaakan sakelar umumnya masukan sakelar ini dihubungkan dengan satu atau beberapa gerbang masukan yang tersedia khususnya jika perangkat itu menggunakan sistem mikrokontroler. Namun penulis merasa bahwa sekarang ini hampir semua perangkat sesederhana apapun lebih banyaka menggunakan mikrokontroler. Karena era sekarang ini sudah bergeser dari analog ke digital dan bahkan yang masih berbau analog sekalipun diubah menjadi digital.

Nah, bagaimana dengan perangkat yang banyak memiliki tombol sakelar? Tentu tidak memungkinkan bahwa setiap sakelar bersifat individual di mana masing-masing sakelar terhubung ke gerbang masukan yang  sendiri-sendiri. Berapa banyak saluran gerbang yang dibutuhkan oleh mikrokontroler untuk itu, tentu sangat tidak memungkinkan. Maka, diperlukan tombol sakelar yang dirangkai berbentuk matriks yaitu rangkaian sakelar tersebut terdiri dari beberapa kolom dan baris. Matriks sakelar ini sering kita sebut dengan istilah matriks keypad karena susunannya yang umumnya teratur dan berurutan.

Matriks keypad ada beberapa jenis namun kita akan membedakannya dari jumlah kolom dan baris yaitu matriks keypad 3 X 4 (3 kolom dan 4 baris) atau 4 X 4 atau 4 X 8. Jumlah tombol yang bisa dihasilkan dari matrik adalah sesuai perkalian dari jumlah kolom dan barisnya. Sebuah matriks 3 X 4 berarti memilik 12 tombol, matriks 4 X 4 memiliki 16 tombol dan seterusnya.

Berkaitan dengan jumlah saluran gerbang atau bit yang dibutuhkan untuk menangani matrik keypad ini adalah sesuai dengan jumlah baris dan kolomnya. Ini berarti untuk matriks 3 X 4 dengan 12 tombol sakelar membutuhkan 7 bit saluran gerbang. Matriks 4 X 8 dengan 32 tombol memerlukan 12 bit. Matriks 4 X 4 dengan 16 tombol menggunakan 8 bit. Begitu pula matriks 8 X 8 untuk 64 tombol hanya perlu 16 bit.

Terkadang dengan maksud untuk menghemat penggunaan gerbang dari mikrokontroler dapat dilakukan dengan menggunakan encoder dan shift register. Cara ini memungkinkan matriks 4 X 4 dengan 16 tombol hanya membutuhkan 4 bit saluran gerbang mikrokontroler saja. Dan untuk saluran gerbang dengan 8 bit atau 1 byte dapat melayani sakelar hingga 256 tombol.

Contoh rangkaian matriks keypad 3 X 4 dengan 12 tombol dan 7 bit keluarannya dapat dilihat berikut ini:



Sekarang bagaimana sebuah tombol dari matriks keypad dapat dikenali secara individual. Pada gambar di atas diperlihat sebuah matriks 3 X 4 memiliki 12 sakelar yang terdiri dari S301 sampai dengan S312. Dan masing-masing tombol sakelar itu merepresentasikan fungsinya sebagai tombol angka 1 sampai 9 ditambah 0 serta * dan # seperti yang umum pada keypad telepon. Ini sekedar contoh saja. Masih merujuk gambar di atas, matriks tersebut memiliki 3 saluran kolom dan 4 saluran baris. Kita akan mengelompokkan saluran tersebut menjadi 2 bagian yaitu grup kolom dan grup baris.

Selanjutnya dari kedua kelompok baik kolom atau baris akan dipilih salah satu untuk difungsikan sebagai masukan aktif yang akan mendapat sinyal berbentuk sinyal pencacah geser. Untuk itu penulis mencoba melakukan pendekatan dengan menetapkan grup kolom yang akan digunakan sebagai masukan aktif. Bentuk sinyal pencacah geser yang dibutuhkan diperlihatkan pada gambar berikut ini:



Sinyal geser yang digunakan adalah aktif rendah. Ini tidak mutlak, sobat bisa menggunakan sinyal geser aktif tinggi sesuai keinginan dan disesuaikan dengan rangkaiannya tentu. Sekali lagi penulis hanya mencoba melakukan pendekatan saja.

Sinyal pada C1, C2 dan C3 akan terus bergeser untuk melakukan scan. Jika tidak ada satupun tombol yang ditekan maka masing-masing keluaran R1 sampai R4 akan tetap tinggi. Kemudian jika salah satu tombol ditekan maka keluaran baris dari tombol tersebut akan mengikuti logika dari sinyal kolom. Kita ambil contoh saat menekan tombol S5 maka saat sinyal geser berada pada posisi C2 mengakibatkan R2 juga rendah. Apabila kedua grup ini dikombinasikan menjadi urutan C3C2C1R4R3R2R1 maka akan menghasilkan sebuah format data dalam bentuk 1011101 sehingga dapat diproses sebuah mikrokontroler atau rangkaian yang sesuai.

Mungkin sobat ada yang bertanya, bagaimana jika menekan lebih dari satu tombol?

Hal ini tidak menjadi masalah karena bagaimanapun semua tergantung dengan aplikasi yang akan dijalankan oleh mikrokontroler. Karena pada aplikasi komputer di mana dalam penggunaan keyboard kadang penekanan beberapa tombol secara bersamaan sering terjadi, contoh Ctrl-Alt-Del, Ctrl-Alt-Shift, Alt-F4 dan masih banyak lagi.

Tapi pada kesempatan yang berbahagia ini (seperti orang pidato) aku sebagai penulis akan membahas mengenai pembuatan matriks keypad 3 X 4 yang nanti keluarannya akan dikirimkan secara serial yang dapat langsung dibaca oleh sebuah PC. Terserah sobat untuk memilih menggunakan Accessibility Option sehingga perangkat kita dianggap sebagai keyboard serial atau menggunakan Hyperterminal. Keduanya sudah aku bahas pada postingan sebelumnya.

Rangkaian lengkap dari matriks keypad menggunakan AT89C2051 dapat sobat lihat berikut ini:



Rangkaian sederhana di atas aku tambahkan sebuah penggerak buzzer sehingga penekanan sebuah tombol akan menghasilkan bunyi beep. Untuk aplikasi program yang harus dijalankan AT89C2051 dapat dilihat berikut ini:

$mod51

Buzzer      bit   p1.0

Kolom1      bit   p1.1
Kolom2      bit   p1.2
Kolom3      bit   p1.3

Baris1      bit   p1.4
Baris2      bit   p1.5
Baris3      bit   p1.6
Baris4      bit   p1.7

org     0h

Awal:
      mov     sp, #20h
      mov     scon, #50h
      mov     tmod, #20h
      mov     tl1, #0fdh
      mov     th1, #0fdh
      mov     ie, #90h
      ajmp    PeriksaBaris

Inisialisasi kecepatan data serial ditetapkan 9600 bps dengan mengisi TH1 dan TL1 masing-masing berisi FDH. Karena hanya memanfaatkan keluaran serial saja maka tidak menggunakan ORG 23H untuk lokasi memori interupsi serial.

KirimSerial:
      mov     sbuf, a
      jnb     ti, $
      clr     ti
      ret

SubRutinKolom:
      jb    Kolom1, GeserKolom2
      mov   p1, #11111011b
      ajmp  KolomSelesai

GeserKolom2:
      jb    Kolom2, GeserKolom3
      mov   p1, #11110111b
      ajmp  KolomSelesai

GeserKolom3:
      mov   p1, #11111101b

KolomSelesai:
      mov   r7, #255
      djnz  r7, $
      ret

PeriksaBaris:
      acall SubRutinKolom
      mov   a, p1
      cpl   a
      anl   a, #11110000b
      jz    PeriksaBaris
      clr   Buzzer
      jb    Baris1, PeriksaKolom2
      mov   b, #'1'
      jnb   Baris1, ProsesSerial
      mov   b, #'4'
      jnb   Baris2, ProsesSerial
      mov   b, #'7'
      jnb   Baris3, ProsesSerial
      mov   b, #'*'
      ajmp  ProsesSerial

PeriksaKolom2:
      jb    Baris2, PeriksaKolom3
      mov   b, #'2'
      jnb   Baris1, ProsesSerial
      mov   b, #'5'
      jnb   Baris2, ProsesSerial
      mov   b, #'8'
      jnb   Baris3, ProsesSerial
      mov   b, #'0'
      ajmp  ProsesSerial

PeriksaKolom3:
      mov   b, #'3'
      jnb   Baris1, ProsesSerial
      mov   b, #'6'
      jnb   Baris2, ProsesSerial
      mov   b, #'9'
      jnb   Baris3, ProsesSerial
      mov   b, #'#'

ProsesSerial:
      mov   a, p1
      cpl   a
      anl   a, #11110000b
      jnz   ProsesSerial
      setb  Buzzer
      mov   a, b
      acall KirimSerial
      ajmp  PeriksaBaris

end

Nah program di atas sederhana kan. Setelah proses kompilasi dengan ASM51.EXE hasilnya program kita hanya sampai alamat 95H atau sekitar 149 byte (7,28%) dari total EEPROM AT89C2051 yang 2048 byte (000H – 7FFH).



Udah ya, makasih udah baca postingan aku. Semoga bisa bermanfaat, sukur-sukur bisa diterapkan oleh sobat semua.

Salam....

2 komentar:

  1. Bisa dihubungkna dengan VB 6 dan database SQL ini ya... ok pak saya coba artiekel ini, sebenarnya saya pernah dapt tawaran dari PT.adsp untuk buka tutup portal masuk kendaraan, saya pernah tawarkan dengan vb6 + mikrokontroller dan berhasil kerja, namun kendala ada pada penghubung software yg dipake PT.asdp ( yg sudah tercompile ) maunya pemesan alat saya bisa membaca event yg bekerja pada software tsb... sampai skrg blm saya lanjutkan....

    BalasHapus
  2. Dilanjutkan saja Mas Ibnu....
    Apa pun kondisinya akan saya coba bantu sebisa mungkin, karena menurut saya itu peluang lho dan saya sudah sering menjalankannya.

    Untuk aplikasi berhubungan dengan portal keluar masuk kendaraan sudah pernah saya implementasikan bukan menggunakan matriks keypad tetapi menggunakan RFID dan waktu itu saya memakai jenis MIFARE sehingga data USER bisa disimpan pada memori kartu S50.

    Jika Tuhan berkenan nanti semua perangkat yang pernah saya buat satu-persatu akan dimuat dalam bentuk artikel di blog ini. Saya berusaha tetap menulis disela waktu kerja yang akhir-akhir ini cukup padat dan menyita waktu.

    BalasHapus