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…
mas
BalasHapussaya 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
coba perintah lcd_clear(); di letakkan setelah delay.
BalasHapusdelaynya jangan terlalu besar juga, cukup 1ms
BalasHapusmas...apakah komunikasi keypad dengan mikrokontroler itu perlu ada penambahan resistor sebagai pull up atau langsung dikoneksikan saja...???
BalasHapusterima kasih...
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