Translate

Mengendalikan Keluaran ON – OFF Dengan Matriks Keypad 3X4



Kali ini kita akan memanfaat sebuah perangkat berupa matriks keypad 3X4 yang memiliki 12 tombol yang terdiri dari 3 kolom dan 4 baris. Sobat bisa menggunakan jenis matriks keypad seperti apa pun selama memiliki formasi seperti yang penulis maksud. Adapun penulis menggunakan matriks keypad seperti gambar di bawah untuk pengujian perangkat.



Perangkat kendali keluaran relay ON/OFF nantinya akan menggunakan 4 digit angka untuk identifikasinya. Jadi nanti sobat bisa memasukkan kombinasi PIN (personal Identification Number) mulai dari 0000 sampai 9999. Lumayan kan, setidaknya ada 10.000 kombinasi. Jika Sobat ingin bisa saja ditambah menjadi 5 atau 6 bahkan 8 digit tidak masalah. Berapapun yang diinginkan semua tergantung aplikasi program yang dibuat. Nanti penulis akan beritahu di bagian program mana yang menentukan jumlah masukan tersebut.

Sekarang kita lihat contoh rangkaian yang penulis buat untuk perangkat yang di bahas pada penulisan kali ini.



Masukan yang berasal dari matriks keypad akan dihubungkan pada gerbang P1 yang terdiri dari P1.7 hingga P1.1 terdiri dari 7 bit. Pada kolom juga dilengkapi dengan C4, C5 dan C6 untuk mencegah riple tegangan yang terjadi saat penekanan tombol keypad. Sementara P1.0 digunakan sebagai penggerak Buzzer yang nanti akan digunakan sebagai indikasi suara BEEP bahwa adanya tombol keypad yang ditekan.

Selanjutnya untuk keluaran ke penggerak relay menggunakan gerbang P3.7.

Data disimpan pada AT93C46 dengan antar muka menggunakan gerbang P3.3, P3.4 dan P3.5.

Sekarang saatnya untuk melihat program aplikasi yang harus dijalankan oleh mikrokontroler AT89C2051 atau AT89S2051 agar perangkat kita bekerja.

$mod51

Matriks           data  p1
Baris1            bit   p1.7
Baris2            bit   p1.6
Baris3            bit   p1.5
Baris4            bit   p1.4
Kolom1            bit   p1.3
Kolom2            bit   p1.2
Kolom3            bit   p1.1
Buzzer            bit   p1.0

DIO         bit   p3.3
CLK         bit   p3.4
RST         bit   p3.5
PinRelay    bit   p3.7

BufferData  data  08h

RegBit            data  20h
      Fail  bit   RegBit.0

RegStack    data  30h

Digit       equ   4

Pada konfigurasi di atas di mana register dan gerbang ditetapkan, penulis menetapkan banyaknya digit yang dimasukkan pada variabel Digit dengan jumlah 4. Sobat bisa menggantinya untuk mengurangi atau menambah. Yang jelas minimal 1 digit dan maksimal adalah 24 digit sesuai dengan alamat BufferData yaitu 08H sampai 1FH. Lebih dari itu akan melampaui alamat RegBit. Sobat bisa saja menetapkan RegBit pada 2FH karena pada internal alokasi RAM untuk AT89C2051 termasuk kategori Bit Addressable Segment yaitu alokasi alamat 20H – 2FH sehingga jumlah masukan maksimal menjadi 39 digit.

Pada awal program yang termasuk dalam inisialisasi sistem, pertama kita harus memanggil subrutin keypad sebanyak 4 kali sesuai jumlah scan yaitu 4 sesuai banyaknya baris setelah tentunya dimulai dengan membuat penyemat Baris1 rendah terlebih dahulu awalnya.

org   0h
      mov   sp, RegStack-1
      clr   Baris1
      mov   r7, #4

ScanBaris:
      acall ScanKeypad
      djnz  r7, ScanBaris
      mov   r7, #50

Selanjutnya inisialisasi akan memeriksa tombol yang ditekan. Jika isi akumulator adalah 11100110 yang menunjukkan bahwa terjadi penekanan tombol * dan Buzzer aktif rendah. Inisialisasi menunggu lama penekanan selama kurang lebih 5 detik sampai dengan ditandai dengan aktifnya relay. Jika tidak ada penekanan tombol maka perintah melompat ke rutin Masukan.

Inisialisasi:
      acall ScanKeypad
      cjne  a, #11100110b, Masukan
      djnz  r7, Inisialisasi
      clr   PinRelay

Setelah relay yang mengindikasikan PROGRAM, perintah menunggu pengguna untuk melepaskan tombol yang ditekan. Setelah dilepas maka penekanan tombol berikutnya akan disimpan sementara sejumlah bilangan Digit pada BufferData.

      IniKeypad:
            acall ScanKeypad
            jnb   Buzzer, IniKeypad

Perintah selanjutnya adalah menyimpan tombol masukan angka yaitu 0 sampai dengan 9. Penekanan tombol * dan # akan me-reset masukan tombol untuk memulai kembali masukan dari digit pertama. Jika 4 digit angka sudah selesai dimasukkan selanjutnya akan disimpan pada memori AT93C46.

      IniReset:
            mov   r0, #BufferData
            mov   r7, #Digit

      IniProgram:
            acall ScanKeypad
            jnb   Buzzer, IniKeypad
            cjne  a, #11101100b, IniProg
            ajmp  IniReset

      IniProg:
            cjne  a, #11100110b, IniSimpan
            ajmp  IniReset

      IniSimpan:
            mov   @r0, a
            inc   r0
            djnz  r7, IniProgram
            acall AT93C46_EWEN
            mov   dptr, #0
            mov   r0, #BufferData
            mov   r7, #Digit

      SimpanKeypad:
            mov   a, @r0
            inc   r0
            acall AT93C46_WRITE
            djnz  r7, SimpanKeypad
            acall AT93C46_EWDS
            setb  PinRelay

Setelah data disimpan maka aplikasi kembali menon-aktifkan relay. Di sini Sobat bisa menambahkan perintah untuk verifikasi data jika mau yaitu memasukkan kembali data keypad dan membandingkannya dengan data pada memori. Penulis tidak memasukkan rutin ini dan langsung menuju ke rutin Masukan seperti berikut ini:

Masukan:
      mov   r0, #BufferData
      mov   r7, #Digit

Pada rutin Masukan status penekanan tombol keypad diperiksa. Jika ada data yang ada yang ditekan maka data akan disimpan sementara pada BufferData kemudian akan diperiksa dengan membandingkannya pada data dalam memori AT93C46. Jika data sama maka keluaran relay maupun indikator akan berubah kondisi dengan perintah CPL. Jika semula rendah akan menjadi tinggi atau sebaliknya. Sama seperti saat pemrograman maka penekanan tombol * dan # akan me-reset register data keypad dan memulai lagi pada digit pertama.

      KeypadMasuk:
            acall ScanKeypad
            jnb   Buzzer, KeypadMasuk
            cjne  a, #11101100b, KeypadMsk
            ajmp  Masukan

      KeypadMsk:
            acall ScanKeypad
            jnb   Buzzer, KeypadMasuk
            cjne  a, #11100110b, BacaKeypad
            ajmp  Masukan

      BacaKeypad:
            mov   @r0, a
            inc   r0
            djnz  r7, KeypadMasuk
            mov   dptr, #0
            mov   r7, #Digit

      PeriksaKeypad:
            mov   b, @r0
            inc   r0
            acall AT93C46_READ
            inc   dptr
            xrl   a, b
            jnz   Masukan
            djnz  r7, PeriksaKeypad
            cpl   PinRelay
            ajmp  Masukan

Di bawah ini adalah subrutin yang digunakan untuk melakukan pemeriksaan pada keypad. Pada bagian awal perintah adalah memanggil penundaan selama 100 ms kemudian memeriksa masukan kolom. Jika bit kolom tidak ada yang rendah atau menunjukkan tidak ada tombol yang ditekan atau tidak ada tombol yang bersesuaian yang ditekan maka prosedur scanning pada baris dilaksanakan.

ScanKeypad:
      acall Tundaan100ms
      jnb   Kolom1, ScanKolom
      jnb   Kolom2, ScanKolom
      jnb   Kolom3, ScanKolom
      setb  Buzzer
      jnb   Baris1, ScanBaris2
      setb  Baris1
      acall Tundaan100ms
      clr   Baris2
      ret

      ScanBaris2:
            jnb   Baris2, ScanBaris3
            setb  Baris2
            acall Tundaan100ms
            clr   Baris3
            ret

      ScanBaris3:
            jnb   Baris3, ScanBaris4
            setb  Baris2
            acall Tundaan100ms
            clr   Baris3
            ret

      ScanBaris4:
            setb  Baris4
            acall Tundaan100ms
            ret

      ScanKolom:
            clr   Buzzer
            mov   a, Matriks
            ret

      Tundaan100ms:
            mov   r3, #180
      Tund: mov   r4, #255
            djnz  r4, $
            djnz  r4, Tund
            ret

$include (c:\tesasm\93C46_8.txt)

end

Program aplikasi mikrokontroler di atas masih membutuhkan modul untuk antarmuka dengan AT93C46 yang bernama 93C46_8.TXT yang ada dan bisa Sobat lihat pada tulisanku sebelumnya.

Setelah file di atas dikompilasi dan diprogramkan ke mikrokontroler AT89C2051 maka perangkat sudah dapat melaksanakan fungsinya. Penulis sudah mengkompilasi dan hasilnya adalah 468 byte saja.



Udah ya, makasih udah baca postingan aku. Semoga bisa bermanfaat dan jika mungkin bisa diterapkan oleh sobat semua.

Salam....

Tidak ada komentar:

Posting Komentar