Atmel AVR

keypad 4×4 dengan AVR 8535
akhirnya setelah sekian lama bergelut dengan tesis,…. telah sampailah kita pada saat yang berbahagia (lebay….:D).
sebelumnya terima kasih pada pak priyo yang telah berusaha dengan sekuat tenaga agar blog student bisa diakses lagi,…
artikel ini merupakan sambungan dari artikel sebelumnya, namun kali ini dibuat dengan contoh aplikasi menggunakan tampilan LCD.

modul keypad yang digunakan adalah keypad 4×4, dengan LCD 16×2 dan Modul DT AVR Low Cost Micro System yang kesemuanya itu merupakan produk dari Innovative electronics. gambarnya kurang lebih seperti gambar berikut :

koneksi keypad dan LCD ke AVR dapat dilihat pada tabel berikut :

Koneksi Keypad

KEYPAD

DT AVR

VCC Not Connected
GND Not Connected
C1 PORTB.0
C2 PORTB.1
C3 PORTB.2
C4 PORTB.3
R1 PORTB.4
R2 PORTB.5
R3 PORTB.6
R4 PORTB.7

Koneksi LCD

LCD

DT AVR

VCC VCC
GND GND
RS PORTC.0
RD PORTC.1
EN PORTC.2
D4 PORTC.4
D5 PORTC.5
D6 PORTC.6
D7 PORTC.7
Program dibuat menggunakan Codevision AVR 2.05

selengkapnya listing programnya sebagai berikut :

#include
#include
#include
#include
#include
char dtkey, dtkeyy;
char buff[33];
int x=0,count,a,y[33];
int e=0;
void key(void)
{
PORTB.7=0;
delay_ms(1);
if (PINB.0==0)
{ dtkeyy=’A’;while(PINB.0==0); }
else if(PINB.1==0)
{ dtkey=3;x++; while(PINB.1==0); }
else if(PINB.2==0)
{ dtkey=2;x++; while(PINB.2==0); }
else if(PINB.3==0)
{ dtkey=1;x++; while(PINB.3==0); }
PORTB.7=1;
PORTB.6=0;
delay_ms(1);
if (PINB.0==0)
{ dtkeyy=’B’;while(PINB.0==0); }
else if(PINB.1==0)
{ dtkey=6;x++;while(PINB.1==0); }
else if(PINB.2==0)
{ dtkey=5;x++;while(PINB.2==0); }
else if(PINB.3==0)
{ dtkey=4;x++; while(PINB.3==0); }
PORTB.6=1;
PORTB.5=0;
delay_ms(1);
if (PINB.0==0)
{ dtkeyy=’C’;while(PINB.0==0); }
else if(PINB.1==0)
{ dtkey=9;x++; while(PINB.1==0); }
else if(PINB.2==0)
{ dtkey=8;x++;while(PINB.2==0); }
else if(PINB.3==0)
{ dtkey=7;x++; while(PINB.3==0); }
PORTB.5=1;
PORTB.4=0;
delay_ms(1);
if (PINB.0==0)
{ dtkeyy=’D’;while(PINB.0==0); }
else if(PINB.1==0)
{ dtkeyy=’#’;while(PINB.1==0); }
else if(PINB.2==0)
{ dtkey=0;x++; while(PINB.2==0); }
else if(PINB.3==0)
{ dtkeyy=’*’; while(PINB.3==0); }
PORTB.4=1;
}
void input(void)
{
awal:
x=0;
e=0;
while(1)
{
key();
count=x;
if(count==1){y[count]=dtkey;}
if (count>=2) {y[count]=(y[count-1]*10)+dtkey;}
if(dtkeyy==’*’)
{
lcd_gotoxy(0,1);
lcd_putsf(“x”);
a=y[count];
dtkeyy=~dtkeyy;
goto awal;
}

if(dtkeyy==’#’)
{
lcd_clear();
lcd_gotoxy(0,1);
lcd_putsf(“=”);
a=a*y[count];
dtkeyy=~dtkeyy;
lcd_gotoxy(0,0);
sprintf(buff,”%d”, a);
lcd_puts(buff);
goto awal;
}
e=0+(x-1);
if(dtkey lcd_gotoxy(e,0);
sprintf(buff,”%d “, dtkey);
lcd_puts(buff);
}

lcd_gotoxy(0,1);
lcd_putsf(” “);

}
}
void main(void)
{ DDRB=0xf0;
PORTB=0xff;
DDRC=0xff;
PORTC=0x00;
lcd_init(16);
input();
}

Program diatas bertujuan untuk membuat perkalian sederhana, dimana karakter (*) pada keypad berfungsi sebagi pengali dan karakter (#) berfungsi sebagai sama dengan (=).
Void Key merupakan fungsi untuk scanning tombol keypad yang ditekan, yang nantinya akan dipanggil pada Void input.
untuk menampilkan angka pada LCD berdasarkan pada tombol keypad yang ditekan menggunakan perintah :
e=0+(x-1);
if(dtkey lcd_gotoxy(e,0);
sprintf(buff,”%d “, dtkey);
lcd_puts(buff);}
perintah di atas akan menggeser karakter yang diinputkan ke kanan satu kali, dan logika “if(dtkey=2) {y[count]=(y[count-1]*10)+dtkey;}
di mana pada jika hanya satu tombol yang ditekan pada keypad, maka angka yang disimpan adalah angka yang ditekan tersebut, dan jika ditekan lebih dari satu tombol, maka angka yang pertama ditekan akan dikalikan dengan sepuluh dan selanjutnya ditambahkan dengan angka yang ditekan selanjutnya.

Selamat mencoba 😀

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.
Leave a Reply

You must be logged in to post a comment.