Dalam banyak aplikasi, seringkali diperlukan penggunaan tombol (key / button) sebagai media untuk meng-input-kan data angka maupun huruf. Secara interfacing, sederhananya bisa saja semua tombol itu hubungkan secara langsung satu persatu pada pin GPIO dari mikro, namun karena keterbatasan pin yang ada, maka diperlukan sebuah teknik untuk mengatasi masalah keterbatasan pin tersebut namun tetap dapat mengakomodir keperluan untuk memasukan data secara lengkap.
Untuk media input data numerik yang menggunakan 10 hingga 16 buah tombol bisa dilakukan dengan mengunakan teknik Multiplex Matrix Keypad. Tombol – tombol tersebut disusun sedemikian rupa membentuk sebuah matrik sehingga untuk semua tombol tersebut bisa dikontrol hanya dengan mengunakan 7-8 pin saja.
Berikut contoh susunan matriknya :
Skema Keypad Matrix 3x4 Skema Keypad Matrix 4x4
Dengan teknik matrik diatas, maka kita bisa menghemat penggunaaan pin mikro, karena misalnya untuk matrix 4x4 (16 buah tombol) hanya diperlukan 8 pin saja untuk interfacing-nya.
Cara kerjanya cukup sederhana, misalnya ketika tombol S1 ditekan, maka COL1 dan ROW1 akan terhubung, jika S5 yang ditekan, maka COL2 dan ROW2 (matrix 3x4) atau COL1 dan ROW2 (matrix 4x4) akan terhubung. demikian seterusnya untuk tombol lainnya
Scanning Matrix Keypad
Ada beberapa teknik untuk membaca data dari matrix keypad tersebut, salah satunya adalah dengan teknik scanning, dimana baris atau kolom selalu dipindai untuk mendeteksi tombol yang ditekan. Caranya yaitu dengan memberikan status ‘0’ (low) pada pin COL secara bergantian, lalu pin ROW dideteksi apakah ada salah satunya yang berkondisi ‘0’ (low).
Untuk contoh penggunaan matrix 3x4, pertama COL1 diberi logika ‘0’, kemudian status ROW dibaca apakah statusnya ‘1’ (high) semua atau ada salah satu yang low.
Jika ROW1 yang Low berarti tombol S1 yang di tekan, jika ROW2 yang Low, berarti tombol S4 yang ditekan, jika High semua, berarti tidak ada tombol yang ditekan dalam kolom ini, scanning dilanjutkan ke kolom berikutnya.
Sekarang COL2 yang diberi logika ‘0’ (low). Jika ROW1 yang Low berarti tombol S2 yang di tekan, jika ROW2 yang Low, berarti tombol S5 yang ditekan, jika High semua, berarti tidak ada tombol yang ditekan dalam kolom ini. Demikian selanjutnya untuk COL3.
Tabel status scanning keypad 3x4
COL1 | COL2 | COL3 | ROW1 | ROW2 | ROW3 | ROW4 | CHAR | BIN |
0 | 0 | 0 | 1 | 1 | 1 | 1 | none | 1111 |
0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 0001 |
1 | 0 | 1 | 0 | 1 | 1 | 1 | 2 | 0010 |
1 | 1 | 0 | 0 | 1 | 1 | 1 | 3 | 0011 |
0 | 1 | 1 | 1 | 0 | 1 | 1 | 4 | 0100 |
1 | 0 | 1 | 1 | 0 | 1 | 1 | 5 | 0101 |
1 | 1 | 0 | 1 | 0 | 1 | 1 | 6 | 0110 |
0 | 1 | 1 | 1 | 1 | 0 | 1 | 7 | 0111 |
1 | 0 | 1 | 1 | 1 | 0 | 1 | 8 | 1000 |
1 | 1 | 0 | 1 | 1 | 0 | 1 | 9 | 1001 |
0 | 1 | 1 | 1 | 1 | 1 | 0 | * | 1010 |
1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0000 |
1 | 1 | 0 | 1 | 1 | 1 | 0 | # | 1011 |
Berikut adalah contoh skematik interfacing AVR32 dengan keypad 3x4. Keypad dihubungkan ke mikrokontroller melalui port B. Port B tersebut dibagi menjadi dua nibble, pin B0..B3 sebagai input (status ROW) dan pin B5..B7 sebagai output (status COL). Penambahan resistor 4K7 ohm adalah untuk melindungi chip AVR dari hubung-singkat (short-circuit), setiap ada tombol yang ditekan, nilainya akan ditampilkan secara biner pada LED.
Klik disini untuk memperbesar gambar
Berikut contoh kode programnya (menggunakan AVR Studio) :
/*
== Sasakala-M32 - Keypad Demo ==
============================================
Project : Keypad - LCD
Hardware:
--------
- [Sasakala-M32 Board]
- LED
- Matrix Keypad 3x4
KEYPAD Connection :
-----------------
COL1 -> PB5
COL2 -> PB6
COL3 -> PB7
ROW1 -> PB0
ROW2 -> PB1
ROW3 -> PB2
ROW4 -> PB3
LED Connection
LED1 -> PA0
LED2 -> PA1
LED3 -> PA2
LED4 -> PA3
============================================
Embedtronix (C)201012
*/
#define keypadport PORTB
#define keypadddr DDRB
#define keypadpin PINB
#define LEDport PORTA
#define LEDddr DDRA
#include <avr/io.h>
int main()
{
//hi-nibble sebagai output(COL) lo-nibble sebagai input(ROW);
keypadddr = 0xF0;
//LEDport sebagai output
LEDddr = 0x0F;
//Port LED untuk indikator
LEDport = 0x00;
//enable internal pull-up untuk keypadpin 0..3
keypadport = 0x0F;
while (1) //program berulang terus menerus
{
//memeriksa status baris (ROW), jika ada tombol
//yang ditekan, nomor tombol ditmapilkan pada
//LEDport
//kolom pertama (COL1)
keypadport =0b11011111;
while (bit_is_clear(keypadpin,0)) {LEDport=1;}
while (bit_is_clear(keypadpin,1)) {LEDport=4;}
while (bit_is_clear(keypadpin,2)) {LEDport=7;}
while (bit_is_clear(keypadpin,3)) {LEDport=11;}
//kolom kedua (COL2)
keypadport =0b10111111;
while (bit_is_clear(keypadpin,0)) {LEDport=2;}
while (bit_is_clear(keypadpin,1)) {LEDport=5;}
while (bit_is_clear(keypadpin,2)) {LEDport=8;}
while (bit_is_clear(keypadpin,3)) {LEDport=0;}
//kolom ketiga (COL3)
keypadport =0b01111111;
while (bit_is_clear(keypadpin,0)) {LEDport=3;}
while (bit_is_clear(keypadpin,1)) {LEDport=6;}
while (bit_is_clear(keypadpin,2)) {LEDport=9;}
while (bit_is_clear(keypadpin,3)) {LEDport=12;}
}
}
Penjelasan program
#define keypadport PORTB
#define keypadddr DDRB
#define keypadpin PINB
#define LEDport PORTA
#define LEDddr DDRA
mendefinisikan koneksi keypad dan LED indikator terhadap mikrokontroler, keypad dihubungkan melalui port B sementara LED indikator dihubungkan ke port A
//kolom pertama (COL1)
keypadport =0b11011111;
while (bit_is_clear(keypadpin,0)) {LEDport=1;}
while (bit_is_clear(keypadpin,1)) {LEDport=4;}
while (bit_is_clear(keypadpin,2)) {LEDport=7;}
while (bit_is_clear(keypadpin,3)) {LEDport=11;}
Scanning untuk kolom pertama, COL1 diberi logika ‘0’, kemudian status pin ROW1..ROW3 di periksa apakah ada yang berlogika ‘0’ juga. Jika pin ROW1 ‘low’, berarti tombol nomor 1 yang ditekan, kemudian nomor tombolnya ditampilkan pada LED port (port A).
Jika ROW2 yang ‘low’, maka berarti tombol nomor 4 yang ditekan, lalu nomornya ditampilkan pada LEDport. Jika ROW3 yang ‘low’, maka berarti tombol nomor 7 yang ditekan, lalu nomornya ditampilkan pada LEDport. Demikian juga jika ROW4 yang ‘low’, maka berarti tombol nomor 11 yang ditekan, lalu nomornya ditampilkan pada LEDport.
Jika tidak ada tombol yang ditekan, maka proses scanning dilanjutkan pada kolom kedua.
//kolom kedua (COL2)
keypadport =0b10111111;
while (bit_is_clear(keypadpin,0)) {LEDport=2;}
while (bit_is_clear(keypadpin,1)) {LEDport=5;}
while (bit_is_clear(keypadpin,2)) {LEDport=8;}
while (bit_is_clear(keypadpin,3)) {LEDport=0;}
Kali ini COL2 yang diberi logika ‘0’. prosesnya sama dengan scanning pada kolom pertama, ROW1 untuk tombol nomor 2, ROW2 untuk tombol nomor 5, ROW3 untuk tombol nomor 8 dan ROW3 untuk tombol nomor 0. Jika tidak ada tombol yag ditekan, proses berlanjut pada scanning kolom ketiga.
//kolom ketiga (COL3)
keypadport =0b01111111;
while (bit_is_clear(keypadpin,0)) {LEDport=3;}
while (bit_is_clear(keypadpin,1)) {LEDport=6;}
while (bit_is_clear(keypadpin,2)) {LEDport=9;}
while (bit_is_clear(keypadpin,3)) {LEDport=12;}
Penjelasannya sama seperti proses scanning kolom pertama dan kedua.
Jika instruksi ‘while’ diganti dengan instruksi ‘if’, apa yang akan terjadi? silahkan mencobanya sendiri.
Download kode program dan simulasi proteus disini
Referensi :
- http://www.8051projects.net/keypad-interfacing/avr-programming.php
- http://winavr.scienceprog.com/example-avr-projects/4x4-keypad-example-using-avr-gcc-c-language.html
- http://extremeelectronics.co.in/avr-tutorials/4x3-matrix-keypad-interface-avr-tutorial/
Tidak ada komentar:
Posting Komentar