Archive for » March 21st, 2012«

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…T_T.
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 Surabaya(Bukan promosi yah). 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 <mega8535.h>
#include <alcd.h>
#include <stdlib.h>
#include <stdio.h>
#include <delay.h>
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<=9){
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=0×00;
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<=9){
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<=9)” bertujuan untuk mendeteksi angka 0 – 9 sehingga karakter lain tidak akan dimunculkan di LCD.
selanjutnya untuk menyimpan data angka yang ditekan dari keypad, digunakan perintah :
if(count==1){y[count]=dtkey;}
if (count>=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 :D

Category: AVR  Leave a Comment