C : Pemrograman LCD 8x2 dengan ATMega16 - CodeVision - Elang Sakti
Download Ebook Belajar Arduino PDF, Arduino untuk pemula
Jasa Pembuatan Program Arduino, pemrograman Arduino
# Hack Your Skills! to be Professional Mechatronics

C : Pemrograman LCD 8x2 dengan ATMega16 - CodeVision

Tidak ada komentar
Bahasa C : Pemrograman LCD 8x2 dengan ATMega16 - CodeVision
Gambar trainer kit dengan atmega16
Bismillah.. Alhamdulillah setelah seharian berkutat dengan manual LCD dan masalah mikro yang pinya sudah rusak, akhirnya bisa juga bikin program untuk nulis di LCD 8x2.

Cerita dikit. Jadi, awalnya ada masalah dengan Switch dan LEDnya, seperti pada posting sebelumnya (Membuat Lampu Berjalan), ketika switch ditekan, maka ada dua led yang menyala. Kemudian di kasus lain, ada 4 led yang tidak mau menyala, kemudian di kasus lainnya lagi, ada 4 led nyala terus. Ternyata ketika tak periksa sau-persatu, ada yang aneh dari kombinasi PORT yang dipake oleh switch dan LED. Hasil percobaannya seperti ini:

LED SWITCH    HASIL
 A    B        BIT 2 & 3 nyala (DOBEL)
 A    C        BIT 2 - 5 nyala terus
 A    D        (OK)
 B    A        (OK)
 B    C        BIT 2 - 5 nyala terus
 B    D        (OK)
 C    A        BIT 2 - 5 tidak nyala
 C    B        BIT 2 - 5 tidak nyala
 C    D        BIT 2 - 5 tidak nyala
 D    A        (OK)
 D    B        BIT 2 & 3 nyala (DOBEL)
 D    C        BIT 2 - 5 nyala terus
 
 OK = normal.

Pertikan yang normal hanya port A dan D. Ternyata setelah diskusi dan tanya-tanya di forum, PIN input untuk PORTB dan PORTC ada yang rusak. Penyebabnya katanya switch langsung nyambung ke ground, sehingga terjadi HOTPLUG yang menyebabkan pin internal pada mikrokontroller rusak. Untuk saja pin outputnnya ndak rusak. Kemudian solusi yang disarankan adalah memberikan resistor 330/220 ohm untuk inputan. Jangan langsung nyambung ke ground atau VCC.

Itu masalah pertama.

Masalah kedua, tak nemu orang yang make LCD 2x8 seperti yang saya pake. Tak googling juga sangat susah nyarinya, mungkin karena umunya orang-orang tidak memasangkan ATMega16 dan LCD 8x2. Akhirnya setelah mencari tahu tentang produk LCD tersebut, ternyata buatan cina. Websitenya http://www.goodview-lcd.com/. Zzzzzz... tidaaaak...

Kemudian tak cari berdasarkan kode dan tulisan yang ada dibelakangnya, saya ketikkan di google "0802A rev.c  pc-001 94v e 243002 rohs" dan hasilnya nihil, kemudian saya hapus satu persatu keywordnya hingga menjadi "0802A rohs", nah,, alhamdulillah ada yang jual LCD ini. Akhirnya dapet manual datasheetnya di toko online crystalfonts (https://www.crystalfontz.com/products/document/898/CFAH0802AGYHJT_v1.0.pdf). Dari datashet tersebut, ditemukanlah manual yang sebenarnya, kitab paling benar di bumi ini terkait pengoperasian LCD 8x2 yang semacam tak bermerk. x)

Setelah pelan-pelan baca dari siang sampek malem ini, akhirnya selesai juga :D alhamdulillah,, dan hasil dari kodingnya seperti berikut:

#include <mega16a.h>
#include <delay.h>

#define CMD_DDR DDRC
#define CMD_PORT PORTC
#define CMD_RS PORTC.0
#define CMD_RW PORTC.7
#define CMD_EN PORTC.6

#define LCD_PORT PORTD
#define LCD_PIN PIND
#define LCD_DDR DDRD

#define LED_PORT PORTA
#define LED_DDR DDRA 

void LCD_init(void);
void LCD_cmd(unsigned char cmd);
void LCD_char(unsigned char data);
void LCD_string(unsigned char data[]);
void LCD_ready(void);
void LCD_linecol(unsigned char line,unsigned char col);
unsigned char LCD_busy(void);

char *elang = "elang";
char *sakti = "sakti";
void main(void){
    LED_DDR = 0xFF;
    LED_PORT = 0xFF;
    LED_PORT = 0b00110010;
    CMD_DDR = 0xFF;
                   
    LCD_init();
    
    LCD_linecol(1,2);
    LCD_string(elang);
    
    LCD_linecol(2,3);
    LCD_string(sakti);
}

void LCD_init(void){
    delay_ms(50);
    LCD_cmd(0b00111000); //0b0011NF00 f-set
    delay_ms(1);
    
    LCD_cmd(0b00111000); //0b0011NF00 f-set
    delay_ms(1);
    
    LCD_cmd(0b00001111); //0b00001DCB on
    LCD_ready();
    delay_ms(1);
    
    LCD_cmd(0b00000001); //0b00000001 clear
    LCD_ready();
    delay_ms(1);
    
    LCD_cmd(0b00000110); //0b000001DS entrymode
    LCD_ready();
    delay_ms(1);
}

void LCD_cmd(unsigned char cmd){
    LCD_DDR = 0xFF;
    
    CMD_RS = 0;
    CMD_RW = 0;
    CMD_EN = 1;
    LCD_PORT = cmd;
    CMD_EN = 0;
}

void LCD_linecol(unsigned char line,unsigned char col){
    unsigned char tmp;
    switch(line){
        case 1:
            tmp = 0x00 + col;
            break;
        case 2:
            tmp = 0xC0 + col;
            break;
    }
    LCD_cmd(tmp); 
}

void LCD_string(unsigned char data[]){
    int loop = 0;
    while(data[loop]!='\0'){
        LCD_char(data[loop]);
        LCD_ready();
        loop++;
    }
}

void LCD_char(unsigned char data){
    LCD_DDR = 0xFF;
    
    CMD_RS = 1;
    CMD_RW = 0;
    CMD_EN = 1;
    LCD_PORT = data;
    CMD_EN = 0;
}

void LCD_ready(void){
    while ((LCD_busy() & 0x80) == 0x80);
}

unsigned char LCD_busy(void){
    unsigned char tmp;
    CMD_DDR = 0xFF;
    CMD_RS = 0;
    CMD_RW = 1;
    CMD_EN = 1;
    tmp = LCD_PIN;
    CMD_EN = 0;
    return tmp;
}



Nah, keluaran untuk program tersebut adalah seperti di atas. :D

Written by ElangSakti
C : Pemrograman LCD 8x2 dengan ATMega16 - CodeVision
Bahasan: Gambar trainer kit dengan atmega16 Bismillah.. Alhamdulillah setelah seharian berkutat dengan manual LCD dan masalah mikro yang pinya ...
Published at Senin, 31 Maret 2014, Updated at Senin, 31 Maret 2014
Reviewed by dr. on
Rating: 4.7

Tidak ada komentar :

Posting Komentar