Keypad 3×4
Keypad dibuat dari sekumpulan saklar push button. Perbedaan modul saklar push button dan modul keypad adalah pada modul push button setiap saklar dihubungkan dengan satu pin I/O pada mikrokontroler. Untuk mengontrol 8 buah saklar push button diperlukan 8 pin I/O. Keypadkeypad 3×4 (12 saklar) hanya membutuhkan 7 saklar kontrol saja (4 kontrol baris dan 3 kontrol kolom) sehingga lebih jumlah pin I/O yang digunakan lebih hemat. Penggunaan keypad 3×4 setidaknya bisa memberikan gambaran awal bagi programmer bahwa penghematan dari sisi hardware akan berakibat pemborosan dari sisi software...dihubungkan dengan I/O secara matriks sehingga lebih menghemat pin I/O. Modul keypad 3×4 (12 saklar) hanya membutuhkan 7 saklar kontrol saja (4 kontrol baris dan 3 kontrol kolom) sehingga lebih jumlah pin I/O yang digunakan lebih hemat. Penggunaan keypad 3×4 setidaknya bisa memberikan gambaran awal bagi programmer bahwa penghematan dari sisi hardware akan berakibat pemborosan dari sisi software.
Perhatikan rangkaian keypad berikut:
Gambar Bentuk Fisik dan Rangkaian Keypad 3×4 |
Terlihat tombol 1, 2, dan 3 berada pada baris 1 (dihubungkan ke R1), tombol 4,5, dan 6 berada pada baris 2 (dihubungkan ke R2), dst. Kaki lainnya dari push button disambung dengan push button lain yang berada pada satu kolom. Misalnya tombol 1, 4, 7, dan * dihubungkan ke R7.
Untuk menentukan tombol mana yang ditekan, kita berikan logika 1 pada seluruh pin, kemudian kolom 1 diberikan logika 0. Periksa R1, R2, R3, dan R4:
a) Jika R1 berubah menjadi 0, berarti tombol “1” sedang ditekan
b) Jika R2 berubah menjadi 0, berarti tombol “4” sedang ditekan
c) Jika R3 berubah menjadi 0, berarti tombol “7” sedang ditekan
d) Jika R4 berubah menjadi 0, berarti tombol “*” sedang ditekan
e) Jika R1, R2, R3, dan R4 tetap berlogika 1, berarti seluruh tombol pada kolom 1 tidak ditekan
Berikan kembali logika 1 pada kolom 1 kemudian berikan logika 0 pada kolom 2. Periksa lagi R1, R2, R3, dan R4:
a) Jika R1 berubah menjadi 0, berarti tombol “2” sedang ditekan
b) Jika R2 berubah menjadi 0, berarti tombol “5” sedang ditekan
c) Jika R3 berubah menjadi 0, berarti tombol “8” sedang ditekan
d) Jika R4 berubah menjadi 0, berarti tombol “0” sedang ditekan
e) Jika R1, R2, R3, dan R4 tetap berlogika 1, berarti seluruh tombol pada kolom 2 tidak ditekan
Berikan kembali logika 1 pada kolom 2 kemudian berikan logika 0 pada kolom 3. Periksa lagi R1, R2, R3, dan R4:
a) Jika R1 berubah menjadi 0, berarti tombol “3” sedang ditekan
b) Jika R2 berubah menjadi 0, berarti tombol “6” sedang ditekan
c) Jika R3 berubah menjadi 0, berarti tombol “9” sedang ditekan
d) Jika R4 berubah menjadi 0, berarti tombol “#” sedang ditekan
e) Jika R1, R2, R3, dan R4 tetap berlogika 1, berarti seluruh tombol pada kolom 2 tidak ditekan
Perlu untuk diketahui bahwa ketika saklar ditekan, secara fisik tegangan pada baris yang berkaitan tidak akan langsung konstan di posisi 0 Volt. Tegangan akan berosilasi (bouncing) selama keadaan transisi (transient) sebelum mencapai keadaan mantap (steady state). Oleh karena itu pemeriksaan baris harus dilakukan berulang-ulang (misal 50 kali pemeriksaan) jika salah satu dari pemeriksaan sudah menghasilkan logika 0 maka pemeriksaan dihentikan.
Program Scanning Keypad 3×4
Untuk membuat program scanning keypad 3×4 yang tersusun secara matrik sesuai keterangan keypad 3×4 diatas dapat dilihat subroutine program keypad dibawah ini:
;————————————————————
; Check keypad sub routine
;————————————————————
check_keys:
ldi temp,col1 ;isikan r22 dengan konstanta col1
out PORTC,temp
rcall timer100u
sbic pinc,0 ;cek key1 ditekan atau tidak
rjmp key4 ;jika tidak, cek key selanjutnya
ldi key,0×01 ;jika ya,isikan key dengan nilai hexa 01
rjmp Exitkey ;lompat ke Exitkey
key4:
sbic pinc,1 ;cek key4 ditekan atau tidak
rjmp key7 ;jika tidak, cek key selanjutnya
ldi key,0×04 ;jika ya,isikan key dengan nilai hexa 04
rjmp Exitkey ;lompat ke exit kay
key7:
sbic pinc,2 ;cek key7 ditekan atau tidak
rjmp keybintang ;jika tidak, cek key selanjutnya
ldi key,0×07 ;jika ya,isikan key dengan nilai hexa 07
rjmp Exitkey ;lompat ke exit kay
keybintang:
sbic pinc,3 ;cek keybintang ditekan atau tidak
rjmp key2 ;jika tidak, cek key selanjutnya
ldi key,0x0a ;jika ya,isikan key dengan nilai hexa 0a
rjmp Exitkey ;lompat ke exit kay
key2:
ldi temp,col2 ; isikan r22 dengan konstanta col2
out PORTC,temp
rcall timer100u
sbic pinc,0 ;cek key2 ditekan atau tidak
rjmp key5 ;jika tidak, cek key selanjutnya
ldi key,0×02 ;jika ya,isikan key dengan nilai hexa 02
rjmp Exitkey ;lompat ke exit kay
key5:
sbic pinc,1 ;cek key5 ditekan atau tidak
rjmp key8 ;jika tidak, cek key selanjutnya
ldi key,0×05 ;jika ya,isikan key dengan nilai hexa 05
rjmp Exitkey ;lompat ke exit kay
key8:
sbic pinc,2 ;cek key8 ditekan atau tidak
rjmp key0 ;jika tidak, cek key selanjutnya
ldi key,0×08 ;jika ya,isikan key dengan nilai hexa 08
rjmp Exitkey ;lompat ke exit kay
key0:
sbic pinc,3 ;cek key0 ditekan atau tidak
rjmp key3 ;jika tidak, cek key selanjutnya
ldi key,0×00 ;jika ya,isikan key dengan nilai hexa 00
rjmp Exitkey ;lompat ke exit kay
key3:
ldi temp,col3 ;isikan r22 dengan konstanta col3
out PORTc,temp
rcall timer100u
sbic pinc,0 ;cek key3 ditekan atau tidak
rjmp key6 ;jika tidak, cek key selanjutnya
ldi key,0×03 ;jika ya,isikan key dengan nilai hexa 03
rjmp Exitkey ;lompat ke exit kay
key6:
sbic pinc,1 ;cek key6 ditekan atau tidak
rjmp key9 ;jika tidak, cek key selanjutnya
ldi key,0×06 ;jika ya,isikan key dengan nilai hexa 06
rjmp Exitkey ;lompat ke exit kay
key9:
sbic pinc,2 ;cek key9 ditekan atau tidak
rjmp keypagar ;jika tidak, cek key selanjutnya
ldi key,0×09 ;jika ya, sikan key dengan nilai hexa 09
rjmp Exitkey ;lompat ke exit kay
keypagar:
sbic pinc,3 ;cek keypagar ditekan atau tidak
rjmp Nokey ;jika tidak, cek key selanjutnya
ldi key,0x0b ;jika ya,isikan key dengan nilai hexa 0b
rjmp Exitkey ;lompat ke exit kay
Nokey:
ldi key,0xFF ;isi key dengan FF
Exitkey:
rcall timer100u
ret ;kembali dari subroutine
; Check keypad sub routine
;————————————————————
check_keys:
ldi temp,col1 ;isikan r22 dengan konstanta col1
out PORTC,temp
rcall timer100u
sbic pinc,0 ;cek key1 ditekan atau tidak
rjmp key4 ;jika tidak, cek key selanjutnya
ldi key,0×01 ;jika ya,isikan key dengan nilai hexa 01
rjmp Exitkey ;lompat ke Exitkey
key4:
sbic pinc,1 ;cek key4 ditekan atau tidak
rjmp key7 ;jika tidak, cek key selanjutnya
ldi key,0×04 ;jika ya,isikan key dengan nilai hexa 04
rjmp Exitkey ;lompat ke exit kay
key7:
sbic pinc,2 ;cek key7 ditekan atau tidak
rjmp keybintang ;jika tidak, cek key selanjutnya
ldi key,0×07 ;jika ya,isikan key dengan nilai hexa 07
rjmp Exitkey ;lompat ke exit kay
keybintang:
sbic pinc,3 ;cek keybintang ditekan atau tidak
rjmp key2 ;jika tidak, cek key selanjutnya
ldi key,0x0a ;jika ya,isikan key dengan nilai hexa 0a
rjmp Exitkey ;lompat ke exit kay
key2:
ldi temp,col2 ; isikan r22 dengan konstanta col2
out PORTC,temp
rcall timer100u
sbic pinc,0 ;cek key2 ditekan atau tidak
rjmp key5 ;jika tidak, cek key selanjutnya
ldi key,0×02 ;jika ya,isikan key dengan nilai hexa 02
rjmp Exitkey ;lompat ke exit kay
key5:
sbic pinc,1 ;cek key5 ditekan atau tidak
rjmp key8 ;jika tidak, cek key selanjutnya
ldi key,0×05 ;jika ya,isikan key dengan nilai hexa 05
rjmp Exitkey ;lompat ke exit kay
key8:
sbic pinc,2 ;cek key8 ditekan atau tidak
rjmp key0 ;jika tidak, cek key selanjutnya
ldi key,0×08 ;jika ya,isikan key dengan nilai hexa 08
rjmp Exitkey ;lompat ke exit kay
key0:
sbic pinc,3 ;cek key0 ditekan atau tidak
rjmp key3 ;jika tidak, cek key selanjutnya
ldi key,0×00 ;jika ya,isikan key dengan nilai hexa 00
rjmp Exitkey ;lompat ke exit kay
key3:
ldi temp,col3 ;isikan r22 dengan konstanta col3
out PORTc,temp
rcall timer100u
sbic pinc,0 ;cek key3 ditekan atau tidak
rjmp key6 ;jika tidak, cek key selanjutnya
ldi key,0×03 ;jika ya,isikan key dengan nilai hexa 03
rjmp Exitkey ;lompat ke exit kay
key6:
sbic pinc,1 ;cek key6 ditekan atau tidak
rjmp key9 ;jika tidak, cek key selanjutnya
ldi key,0×06 ;jika ya,isikan key dengan nilai hexa 06
rjmp Exitkey ;lompat ke exit kay
key9:
sbic pinc,2 ;cek key9 ditekan atau tidak
rjmp keypagar ;jika tidak, cek key selanjutnya
ldi key,0×09 ;jika ya, sikan key dengan nilai hexa 09
rjmp Exitkey ;lompat ke exit kay
keypagar:
sbic pinc,3 ;cek keypagar ditekan atau tidak
rjmp Nokey ;jika tidak, cek key selanjutnya
ldi key,0x0b ;jika ya,isikan key dengan nilai hexa 0b
rjmp Exitkey ;lompat ke exit kay
Nokey:
ldi key,0xFF ;isi key dengan FF
Exitkey:
rcall timer100u
ret ;kembali dari subroutine
;————————————————————
; Delay sub routine100
;————————————————————
timer100u:
ldi r30,0×2
ulang1:
Dec r30
cpi r30,0×00
brne ulang1
ret
; Delay sub routine100
;————————————————————
timer100u:
ldi r30,0×2
ulang1:
Dec r30
cpi r30,0×00
brne ulang1
ret
Sumber : click here
0 comments:
Post a Comment