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