Sabtu, 17 Desember 2011

Keypad Matrix 3x4





Keypad 3x4 yang tersedia di pasaran adalah seperti gambar diatas. Keypad ini biasanya digunakan untuk berbagai aplikasi yang mengharuskan penggunaan tombol sebagai input numeric maupun abjad. Misalnya untuk telepon, tiket printer dll.


Walaupun terlihat sama, ketiga keypad diatas biasanya memiliki konfigurasi pin yang berbeda tetapi tetap saja prinsip kerjanya sama. 

Keypad 3x4 berarti memiliki 12 tombol, tapi kenapa pin yang tersedia hanya 7 atau 8 ???. nah itu dia. Coba perhatikan gambar berikut ini


Ketujuh atau kedelapan pin tersebut adalah 3 pin untuk kolom dan 4 pin untuk baris. Untuk mengakses keypad ini tidak seperti push button biasa. Adapun cara yang saya pakai untuk mengakses keypad ini adalah dengan metode scanning.  

Dengan menggunakan mikrokontroler hal ini sangat mudah dilakukan, karena mengingat mikrokontroler memiliki frekuensi clock yang tinggi. Misalnya saya menggunakan ATmega32 kemudian saya hubungkan pin keypad secara urut dari baris kemudian kolom ke pin mikrokontroler. 

row1 -> PINC.0 
row2 ->PINC.1
row3 ->PINC.2
row4 ->PINC.3
col1 ->PINC.4
col2 ->PINC.5
col3 ->PINC.6

berikut ini adalah program dengan bahasa C untuk mengakses keypad ini. saya buat scanning pada PORTC 4-6 artinya PORTC 4-6 adalah pin output, kali ini saya membuat PINC 4-6 sebagai output low. misalnya angka '1' pada keypad ditekan output low dari col1 atau PINC.4 akan terhubung ke PINC.0 atau row1. row1 - row4 yaitu PINC 0-3 adalah PIN yang berfungsi sebagai input dengan kondisi high, hal ini diharapkan ketika ada tombol yang ditekan akan ada perubahan logic di PIN input tersebut sehingga mudah untuk dikenali oleh PIN input.

unsigned char keypadoutput(void)
{
unsigned char padkey;
padkey=0;
countscankeypad++;
PORTC=~(1<<countscankeypad+3);
if(countscankeypad==3){countscankeypad=0;}

if(PINC.0==0&&PORTC.4==0){padkey='1';}
if(PINC.1==0&&PORTC.4==0){padkey='4';}
if(PINC.2==0&&PORTC.4==0){padkey='7';}
if(PINC.3==0&&PORTC.6==0){padkey='#';}
        
if(PINC.0==0&&PORTC.5==0){padkey='2';}
if(PINC.1==0&&PORTC.5==0){padkey='5';}
if(PINC.2==0&&PORTC.5==0){padkey='8';}
if(PINC.3==0&&PORTC.5==0){padkey='0';}
       
if(PINC.0==0&&PORTC.6==0){padkey='3';}
if(PINC.1==0&&PORTC.6==0){padkey='6';}
if(PINC.2==0&&PORTC.6==0){padkey='9';}
if(PINC.3==0&&PORTC.4==0){padkey='*';}

return padkey;
}

Jangan lupa lakukan inisialisasi PINC yaitu

//init keypad
DDRC=0b01110000;
PORTC=0b00001111;

Sekarang coba panggil fungsi keypadoutput ke main fungsi.
Selamat mencoba…

5 komentar:

  1. mas
    saya sudah buat program peperti ini tapi belum muncul karakternya ya di LCD kira-kira salah dimana

    #include
    #include
    #include

    // Alphanumeric LCD Module functions
    #asm
    .equ __lcd_port=0x15 ;PORTC
    #endasm
    #include
    unsigned int countscankeypad;

    unsigned char keypadoutput(void)
    {
    unsigned char padkey;
    padkey=0;
    countscankeypad++;
    PORTC=~(1<<countscankeypad+3);
    if(countscankeypad==3){countscankeypad=0;}

    if(PINB.0==0&&PORTB.4==0){padkey='1';}
    if(PINB.1==0&&PORTB.4==0){padkey='4';}
    if(PINB.2==0&&PORTB.4==0){padkey='7';}
    if(PINB.3==0&&PORTB.6==0){padkey='#';}

    if(PINB.0==0&&PORTB.5==0){padkey='2';}
    if(PINB.1==0&&PORTB.5==0){padkey='5';}
    if(PINB.2==0&&PORTB.5==0){padkey='8';}
    if(PINB.3==0&&PORTB.5==0){padkey='0';}

    if(PINB.0==0&&PORTB.6==0){padkey='3';}
    if(PINB.1==0&&PORTB.6==0){padkey='6';}
    if(PINB.2==0&&PORTB.6==0){padkey='9';}
    if(PINB.3==0&&PORTB.4==0){padkey='*';}

    return padkey;
    }
    // Declare your global variables here
    char buff[16];

    void main(void)
    {
    DDRB=0b01110000;
    PORTB=0b00001111;

    // LCD module initialization
    lcd_init(16);

    while (1)
    {
    // Place your code here
    sprintf(buff,"%c",keypadoutput);
    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_puts(buff);
    delay_ms(500);
    };
    }

    terimakasih

    BalasHapus
  2. coba perintah lcd_clear(); di letakkan setelah delay.

    BalasHapus
  3. delaynya jangan terlalu besar juga, cukup 1ms

    BalasHapus
  4. mas...apakah komunikasi keypad dengan mikrokontroler itu perlu ada penambahan resistor sebagai pull up atau langsung dikoneksikan saja...???
    terima kasih...

    BalasHapus
    Balasan
    1. maaf telat balas, yang saya lakukan diatas adalah tanpa resistor, langsung di koneksikan dengan pin mikrokontroler, tapi kalau ingin di beri pull up juga bisa di pinc 0-3 supaya kondisinya tidak float

      Hapus