Sebelum melanjutkan ke tutorial berikut ada baiknya membaca pembahasan terdahulu mengenai keypad dan menulis ke lcd
#define XTAL 1000000 //default clock adalah 1Mhz #define LCD_LINES 2 // jumlah line LCD #define LCD_DISP_LENGTH 16 // jumlah karakter per line #define LCD_IO_MODE 1 // mode 0=8bit, 1=4 bit // selanjutnya adalah definisi pin yang dipakai, berikut ini hasil edit yang sesuai skematik diatas #define LCD_PORT PORTA #define LCD_DATA0_PORT LCD_PORT #define LCD_DATA1_PORT LCD_PORT #define LCD_DATA2_PORT LCD_PORT #define LCD_DATA3_PORT LCD_PORT #define LCD_DATA0_PIN 3 #define LCD_DATA1_PIN 2 #define LCD_DATA2_PIN 1 #define LCD_DATA3_PIN 0 #define LCD_RS_PORT LCD_PORT #define LCD_RS_PIN 6 #define LCD_RW_PORT LCD_PORT #define LCD_RW_PIN 5 #define LCD_E_PORT LCD_PORT #define LCD_E_PIN 4 |
int main(void)
{
uint8_t keypad,posisi;
DDRA |= _BV(PA0) | _BV(PA1) | _BV(PA2) | _BV(PA3) | _BV(PA4) | _BV(PA5) | _BV(PA6) ; //LCD PORT yg digunakan
//keypad
DDRD &= ~_BV(PD0) & ~_BV(PD1) & ~_BV(PD2); //col
DDRD |= _BV(PD3) | _BV(PD4) | _BV(PD5) | _BV(PD6); //row
posisi=0; //variabel penanda posisi kursor
lcd_init(LCD_DISP_ON_CURSOR); //inisialisasi LCD
while(1)
{
keypad=tombol(); //fungsi keypad, silahkan baca pembahasan sebelumnya
if(keypad!= 100 && keypad !=21 && keypad !=20 ) //jika tombol ditekan
{
if( posisi < 32 ) { //ada 32 buah ruang untuk menulis (16 x 2 )
lcd_putc( keypad + 48 ) ; //48 adalah ascii dari angka 0
posisi++; //tambahkan nilai posisi
}
if(posisi == 16){ //jika melewati 16 karakter di baris 1
lcd_gotoxy(0,1); //pindah ke baris kedua
}
_delay_ms(150);
}
if(keypad == 21 ) // penekanan * berarti hapus 1 kebelakang
{
if(posisi != 0) posisi--; //posisi kursor dikurangi
if(posisi < 16 ){ //baris 1
lcd_gotoxy(posisi,0); //mundur 1 posisi di baris 1
lcd_putc(' '); //bersihkan kursos
lcd_gotoxy(posisi,0); //balik lagi
}
else { //baris 2
lcd_gotoxy((posisi - 16),1); //mundur 1 posisi di baris 2
lcd_putc(' '); //bersihkan angka
lcd_gotoxy((posisi - 16),1); //balik lagi
}
_delay_ms(150);
}
else if(keypad == 20 ) // penekanan # berarti bersihkan layar lcd
{
posisi = 0;
lcd_clrscr();
_delay_ms(150);
}
}
return 0;
}