Font Size

Screen

Profile

Layout

Direction

Menu Style

Cpanel

Keypad interfacing and programming

10 Apr 2010

Keypad dalam aplikasi mikrokontroller cukup banyak di gunakan, khususnya untuk memasukkan angka / kode tertentu yang di butuhkan dalam suatu proses. Dalam kesempatan ini kami mencoba berbagi pengalaman tentang cara interface keypad pada mikrokontroller 89S51 beserta pemogramannya. Gambar di samping merupakan interface keypad dengan microcontroller 89S51. Kami gunakan LED untuk penanda tombol mana yang di tekan. Khusus untuk tombol "0" kami tandai dengan semua LED menyala sekitar 100 mili detik, lalu mati 100 mili detik dengan looping 5 kali. Sedangkan untuk tombol yang lain cara kerja nya sebagai berikut.

Jika tombol "1" di tekan, led 1 menyala. Jika tombol "2" di tekan, led 1 dan 2 menyala. Jika tombol "3" di tekan, led 1 s/d 3 menyala. Jika tombol "4" di tekan, led 1 s/d 4 menyala. Jika tombol "5" di tekan, led 1 s/d 5 menyala. Jika tombol "6" di tekan, led 1 s/d 6 menyala. Jika tombol "7" di tekan, led 1 s/d 7 menyala. Jika tombol "8" di tekan, led 1 s/d 8 menyala. Jika tombol "9" di tekan, led 8 saja menyala. Jika tombol "A" di tekan, led 7 s/d 8  menyala. Jika tombol "B" di tekan, tombol 6 s/d 8 menyala. Jika tombol "C" di tekan, tombol 5 s/d 8 menyala. Jika tombol "D" di tekan, led 4 s/d 8 menyala. Jika tombol "#" di tekan, led 3 s/d 8 menyala. Jika tombol " * " di tekan, led 2 s/d 8 menyala. Lihat program lengkapnya di bagian akhir artikel ini.

Penanganan Debounching

Pada saat tombol di tekan terkadang timbul debounching artinya dalam bahasa jawa "mental mentul" dan dalam bahasa madura "tal mental". Debouncing ini terjadi karena mekanik tombol atau saklar saat di tekan terjadi getaran yang mengakibatkan mikrokontroller mendeteksi adanya penekanan tombol berkali-kali. Padahal hal tombol hanya di tekan sekali saja.

Pada gambar di atas, saat tombol (Push button) terjadi perubahan dari kondisi high (5V) ke low (0V) (gambar paling kiri) terjadi debouncing seperti pada gambar tengah, maka mikrokontroller mendeteksi adanya penekanan tombol berkali-kali seperti pada gambar bagian kanan. Untuk menangani masalah ini bisa di lakukan dengan 2 cara, yaitu dengan software dan yang lainnya dengan hardware. Untuk kali ini kami mengakalinya menggunakan software / program. flow program kami buat sederhana, yaitu Jika ada tombol yang di tekan, tunggu 2 mili detik, saat tombol di lepas juga di tunggu 2 mili detik. Lebih jelasnya sebagai berikut.

  1. Apakah ada tombol yang di tekan?. Jika ya tunggu 2 mili detik, jika tidak keluar (tidak ada tombol yang di tekan)
  2. Apakah tombol tetap di tekan?. Jika ya tunggu di lepas. Jika tidak keluar (tidak ada tombol yang di tekan).
  3. Apakah tombol benar di lepas?. Jika ya tunggu 2 mili detik, jika tidak tunggu sampai tombol di lepas.

Program menggunakan bahasa C

Program interface keypad dengan microcontroller 89S51 kami gunakan bahasa C, karena lebih efisien dan mudah daripada menggunakan bahasa assembler. Program bahasa C kami tulis menggunakan uVision3.  Lihat program lengkapnya di bawah ini.

#include<AT89X51.H>

#include<stdio.h>

#define keypad_port P3

#define col1 P3_3

#define col2 P3_2

#define col3 P3_1

#define col4 P3_0

#define LED P1

 

bit keypad();

void delay_1ms();

void delay_ms(unsigned int);

unsigned char *buffer[16]={{"1"},{"2"},{"3"},{"A"},

                                                {"4"},{"5"},{"6"},{"B"},

                                                {"7"},{"8"},{"9"},{"C"},

                                                 {"*"},{"0"},{"#"},{"D"}};

unsigned char *key;

bit YES;

 

void delay_1ms()

{

TMOD=0;

TH0=0x1C;

TL0=0x17;

TR0=1;

while(!TF0);

TF0=0;

TR0=0;

}

 

void delay_ms(unsigned int x)

{

unsigned int i;

for(i=0;i<x;i++)

{

delay_1ms();

}

}

 

 

bit keypad()

{

 

int i,ret=0;

for(i=0;i<4;i++)

{

keypad_port=~(0x80>>i) ;

if(!col1)

{

//y=debounching(col1);

delay_ms(2);

if(!col1)

{

while(!col1)

{

delay_ms(1);

}

key=buffer[4*i];

ret=1;return ret;

}

else{ret = 0; return ret;}

}

else if(!col2)

{

//y=debounching(col2);

delay_ms(2);

if(!col2)

{

while(!col2)

{

delay_ms(1);

}

key=buffer[4*i+1];

ret=1;return ret;

}

else{ret = 0; return ret;}

}

else if(!col3)

{

//y=debounching(col3);

delay_ms(2);

if(!col3)

{

while(!col3)

{

delay_ms(1);

}

key=buffer[4*i+2];

ret=1;return ret;

}

else{ret = 0; return ret;}

}

else if(!col4)

{

// y=debounching(col4);

delay_ms(2);

if(!col4)

{

while(!col4)

{

delay_ms(1);

}

key=buffer[4*i+3];

ret=1;return ret;

}

else{ret = 0; return ret;}

}

 

}

keypad_port=0xff;

return ret;

}

 

main()

{

int i,z;

unsigned char *y;

LED=0XFF;

while(1)

{

z=keypad();

if(z)

{

y=key;

if(y=="1"){LED=0xFE;}

else if(y=="2"){LED=0XFC;}

else if(y=="3"){LED=0XF8;}

else if(y=="A"){LED=0X3F;}

else if(y=="4"){LED=0XF0;}

else if(y=="5"){LED=0XE0;}

else if(y=="6"){LED=0XC0;}

else if(y=="B"){LED=0X1F;}

else if(y=="7"){LED=0X80;}

else if(y=="8"){LED=0X00;}

else if(y=="9"){LED=0X7F;}

else if(y=="C"){LED=0X0F;}

else if(y=="D"){LED=0X07;}

else if(y=="0"){ for(i=0;i<5i++){LED=0X00;

delay_ms(100);LED=0xff;delay_ms(100);}}

else if(y=="#"){LED=0X03;}

else if(y=="*"){LED=0X01;}

else{LED=0xFF;};

}

 

//else{LED=0xFF;};z=0;

}

}



Add comment


Security code
Refresh

 

Latest Comments

  • www.officialheatjerseyshop.com: http://www.officialheatjerseyshop.com, http://www.officialthunderjer...
  • handmade oil painting canvas oil painting wholesale oil painting
  • baidu sina: http://www.sina.com
 

Tentang Training & Jasa

  • mau tanya,,kaLau saya mnta konsuLtasi ttg program assembler,,coun ter. pakai sensor infraRed dan Pho...
  • biaya training berlaku untuk 1 orang saja. sedangkan peserta training untuk private minimal 2 orang....
  • oia trus yg basic private biaya berapa? itu mulai dari dasar juga?
 

Tanya Bimbingan TA

  • Mas. kalau dari luar jawa cara bimbingan TA-nya gimana ? pengerjaannya butuh berapa lama ? harganya berapa ?
You are here: