• Pendahuluan

Keypad (papan tombol) merupakan salah satu bagian HMI atau Human Machine Interface dan memainkan peranan yang sangat penting pada sebuah sistem terpadu dimana input/masukan dari manusia diperlukan di dalam sistem, misal: pintu elektronik, elevator, kalkulator, microwave, dan masih banyak lagi.

Keypad Matrix memang sangat akrab digunakan dalam aplikasi-aplikasi mikrokontroler karena aritekturnya yang sederhana dan mudah untuk digabungkan dengan segala macam mikrokontroler.

Di dalam bagian dari tutorial ini, kita akan coba mempelajari bagaimana caranya untuk membuat interface/antarmuka sebuah keypad matrix 4x4 dan mikrokontroler seri 8051. Serta kita juga akan pelajari disini bagaimana cara memprogramnya dalam bahasa Assembly dan C.

  • Merakit Keypad Matrix

Pembuatan sebuah keypad matrix umumnya sangat mudah. Seperti yang ditunjukkan oleh gambar dibawah, kita punya empat baris serta empat kolom sebagai tahapan awalnya. Diantara setiap persimpangan baris dan kolom disana kita tempatkan sebuah tombol.

keypad

Berdasarkan dari sketsa diatas, maka dapat kita buat sebuah keypad dengan beberapa buah SPST Switch seperti yang ditunjukkan oleh rangkaian dibawah ini:

keypad-schematic

Sekarang keypad kita sudah siap, yang kita butuhkan sekarang adalah menghubungkan baris dan kolom ke dalam port sebuah mikrokontroler dan memprogram mikrokontroler untuk membaca input dari keypad.

Scanning atau Membaca Keypad Matrix ke dalam Mikrokontroler

Disana ada banyak sekali metode yang digunakan untuk membaca keypad matrix, tergantung kepada bagaimana keypad itu sendiri dihubungkan dengan mikrokontroler, namun logika dasarnya tetaplah sama. Kita buat kolom sebagai input dan kita jadikan baris sebagai output, seluruh prosedur dalam pembacaan keyboard dinamakan sebagai scanning.

Dalam rangka mendeteksi tombol yang mana yang tengah ditekan dari rangkaian matrix, kita buat jalur pada sisi baris menjadi low “0” satu per satu dan seketika itu juga membaca nilai kolomnya “0” atau “1”. Katakanlah untuk pertama kita coba buat program dimana baris pertama menjadi “0”, kemudian pembacaan kolom dilakukan oleh mikrokontroler. Jika salah satu tombol pada baris pertama yang ditekan maka kolom yang terkait akan ikut menjadi “0”, semisal tombol kedua pada baris pertama ditekan, maka kolom ke dua akan menjadi low atau “0”. Sehingga kita bisa tahu bahwa tombol nomor 2 telah ditekan. Ini adalah konsep dasar bagaimana keypad scanning dilakukan dalam mikrokontroler.

Sehingga untuk men-scan keypad secara keseluruhan, kita perlu untuk membuat nilai baris menjadi lowatau “0” satu per satu dan membaca nilai kolom yanh terkait. Jika ada salah satu dari tombol yang ditekan, hal ini akan membuat korespondensi dengan kolom untuk berubah ke posisi low, yang mana hal inilah yang akan memberi kita informasi bahwa sebuah tombol telah ditekan pada baris itu. Jika baris 1 di buat = “0” dan tombol pada kolom 1 ditekan maka nilai pin mikro untuk kolom 1 akan = “0”, apabila tombol pada kolom 2 yang ditekan maka pin mikro untuk kolom 2 akan = “0”, begitu seterusnya..

Okay, jika sudah cukup mengerti, sekarang mari kita mulai berpindah ke sesi berikutnya yaitu pokok bahasan pemrograman keypad.

Koneksi Keypad Matrix ke AVR Mikrokontroler

keypad-avr-th

Silahkan klik gambar untuk melihat dalam ukuran sebenarnya.

Rangkaian diatas hanya untuk menunjukkan bagian koneksi keypad ke mikrokontroler saja dan tidak meliputi rangkaian reset dan kristal. Untuk yang masih latihan, kamu harus memiliki rangkaian mikro lengkap dengan tombol reset dan kristal.

►Keypad Connections with 8051 Microcontroller

keypad-8051-th

Please click on the image to enlarge it

Circuit shown above is for demonstration and does not include any reset and crystal circuit. For practical use you need to have a reset circuit and crystal.

 

Bab Pemrogramman Mikrokontroler AVR

AVR Assembly Programming for ADC0804

CODE:
keyport equ P2                  ;Keypad port connected here
col1 equ P2.0                   ;Column 1
col2 equ P2.1                   ;Column 2
col3 equ P2.2                   ;Column 3
col4 equ P2.3                   ;Column 4

keyval equ 30H                  ;To store key number
pressed bit 0H                  ;Flag

key_init:
        mov keyport,#0FH        ;Make rows as o/p and col as i/p
        ret

get_key:
        mov keyval,#0           ;reset the number
        mov keyport,#7FH        ;make Row1 low
        acall read_col          ;read columns

        jb pressed, done        ;check if flag is set

        mov keyval,#4           ;if not then read next row
        mov keyport,#0BFH       ;make Row2 low
        acall read_col          ;read columns

        jb pressed, done        ;check if flag is set

        mov keyval,#8           ;if not then read next row
        mov keyport,#0DFH       ;make row3 low
        acall read_col          ;read columns

        jb pressed, done        ;check if flag is set

        mov keyval,#12          ;if not read row4
        mov keyport,#0EFH       ;make row4 low
        acall read_col          ;read columns

done:
        ret

read_col:                       ;read columns routine
        clr pressed             ;reset the flag

        jb col1, nextcol        ;check if first key is pressed
        jnb col1,$              ;if yes then wait for key release      
        setb pressed            ;set the flag
        ret

nextcol:                        ;read col2
        jb col2, nextcol1       ;check if second key is pressed
        jnb col2,$              ;if yes then wait for key release
        inc keyval              ;its key number 2
        setb pressed            ;set the flag
        ret

nextcol1:                       ;read col3
        jb col3, nextcol2       ;check if third key is pressed
        jnb col3,$              ;if yes then wait for key release
        inc keyval              ;its key 3
        inc keyval
        setb pressed            ;set the flag
        ret

nextcol2:                       ;read column 4
        jb col4, exit           ;check if fourth key pressed
        jnb col4,$              ;if yes then wait for key release
        inc keyval              ;its key 4
        inc keyval
        inc keyval
        setb pressed            ;set the flag
        ret

exit:                           ;if no key is pressed
        clr pressed             ;clr the flag
        clr keyval              ;reset the number
        ret

        end
 

Programming AVR in C for ADC0804

CODE:
#include <AT89X51.H>    //Include file for 8051
#define keyport P2      //keypad connected to P2
#define col1 P2_0       //column 1
#define col2 P2_1       //column 2
#define col3 P2_2       //column 3
#define col4 P2_3       //column 4
#define TRUE 1          //some defines
#define FALSE 0

/*
+---------------------------------------+
| Prototype: void key_init(void);       |
| Return Type: void                     |
| Arguments: None                       |
| Description: Initialize ports and     |
|              Keypad.                  |
+---------------------------------------+
*/

void key_init(){
        keyport &=0x0F; //make Rows as o/p and cols are i/p
}

/*
+-----------------------------------------------+
| Prototype: unsigned char get_key(void);       |
| Return Type: unsigned char                    |
| Arguments: None                               |
| Description: To read key from the keypad      |
+-----------------------------------------------+
*/

unsigned char get_key(){
        unsigned char i,k,key=0;
        k=1;
        for(i=0;i<4;i++){               //loop for 4 rows
                keyport &=~(0x80>>i);   //to make rows low 1 by 1
                        if(!col1){      //check if key1 is pressed
                                key = k+0;      //set key number
                                while(!col1);   //wait for release
                                return key;     //return key number
                        }
                        if(!col2){      //check if key2 is pressed
                                key = k+1;      //set key number
                                while(!col2);   //wait for release
                                return key;     //return key number
                        }
                        if(!col3){      //check if key3 is pressed
                                key = k+2;      //set key number
                                while(!col3);   //wait for release
                                return key;     //return key number
                        }
                        if(!col4){      //check if key4 is pressed
                                key = k+3;      //set key number
                                while(!col4);   //wait for release
                                return key;     //return key number
                        }
                k+=4;                   //next row key number
                keyport |= 0x80>>i;     //make the row high again
        }
        return FALSE;                   //return false if no key pressed
}
 

Selamat mencoba dan terimakasih telah mebaca tulisan saya. Semoga bermanfaat.

Creative Commons License You may share this document under Creative Commons License – Terima kasih telah membaca tulisan ini. © 2011 Ari Sulistiono, Indonesian Electrical Engineer.