Forum Sains Indonesia

Ilmu Terapan => Teknik Elektro => Ilmu Teknik => Mikrokontroler dan Robotika => Topik dimulai oleh: erik hardianto pada April 26, 2009, 10:45:38 PM

Judul: bahasa C buat LCD 2x16
Ditulis oleh: erik hardianto pada April 26, 2009, 10:45:38 PM
1. ada yang punya contoh program pake bahasa C untuk LCD 2X16..
2. ic-nya pake at89c52 bisa ga?
3. ditunggu jwb dari yang bisa bantu. terima kasih
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: erik hardianto pada Mei 09, 2009, 04:27:29 AM
TOLONG DONG... dua minggu lagi, pengujian sistem, ada yg punya program LCD  pake bahasa C ga?? + rangkaian nya + penjelasannya....
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: ksatriabajuhitam pada Mei 09, 2009, 05:17:46 PM
ada sih.. bekas ngerjain tugas kuliah dulu
tapi apa ga lebih baik kalau studi dulu, baru kalo ada masalah didiskusikan masalahnya

mungkin step-step nya:
pin-pin yg diperlukan <==> rangkaian
gimana caranya komunikasi sama lcd <==> instruksi lcd
baru ke implementasi programnya

saya juga agak lupa
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: erik hardianto pada Mei 11, 2009, 10:57:40 PM
Kutip dari: ksatriabajuhitam pada Mei 09, 2009, 05:17:46 PM
ada sih.. bekas ngerjain tugas kuliah dulu
tapi apa ga lebih baik kalau studi dulu, baru kalo ada masalah didiskusikan masalahnya

mungkin step-step nya:
pin-pin yg diperlukan <==> rangkaian
gimana caranya komunikasi sama lcd <==> instruksi lcd
baru ke implementasi programnya

saya juga agak lupa
kmaren da nyoba2 tp gagal terus + gosong,, yg terakhir nyoba lcd cm nyala tp gada tulisannya...
mungkin biar tambah PD kalo lcd ada tampilannya, tp cm ngblank doang + ada progrmnya heheh.    ??? saya pake 4 bit buat datanya,( rs, rw, e) apa hrs ke port yg beda ya? soalnya 4 bitnya sy taro di p2.3 - p2.6 AT89S51
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: insan sains pada Mei 16, 2009, 04:34:24 PM
Wah.. ternyata ada juga pertanyaannya di sini yah?

Yawdah, berarti pembahasan tentang uC dan LCD kita bahas mendalam di sini ajah ya.

Sebelumnya, saya salin dulu yang pernah saya bahas di topik yang lain

(http://gedex.web.id/wp-content/uploads/2006/12/lcd_1602.jpg)

Konfigurasi pin LCD dan uC nya bisa macem-macem. Saya ambil kayak gini, sbg contoh :

  [pin LCD] <-->  [pin uC]
   1 (Gnd) <--> 11 (Gnd)
   2 (+5V) <--> 10 (Vcc)
   4 (RS) <--> 22 (PC0)
   5 (RD) <--> 23 (PC1)
   6 (EN) <--> 24 (PC2)
  11 (D4) <--> 26 (PC4)
  12 (D5) <--> 27 (PC5)
  13 (D6) <--> 28 (PC6)
  14 (D7) <--> 29 (PC7)

Kalo pake program Code Vision gampang. Coz sudah ada unit dan fungsi tersendiri yang bisa langsung dipake. Namanya lcd.h

Contoh programnya :

#include
#asm
   .equ __lcd_port=0x15
#endasm
#include


void main(void)
{
       // inisialisasi LCD
       lcd_init(16);

        // menampilkan pada baris 0 dari kolom 0
        lcd_gotoxy(0,0);   
        lcd_puts("Forum");   

        // menampilkan pada baris 1 dari kolom 0
        lcd_gotoxy(0,1);     
        lcd_puts("Sains");

       // agar nampak dan terus ditampilkan
       while(1);
}

Secara teori sih begitu. Saya lupa lagi. Soalnya jarang pake LCD, biasanya langsung dikomunikasikan ke PC.
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: ksatriabajuhitam pada Mei 16, 2009, 07:00:11 PM
udah mulai ngebahas detail yah...
ayo lah,

yu mulai dari rangkaiannya...

1. Rangkaian
pin-pin yang diperlukan ialah:
RS --> gunanya untuk membedakan antara data (pin high) untuk ditampilkan atau untuk instruksi/register (pin low)
RW --> gunanya untuk mode baca (pin high) atau tulis (pin low), kita akan gunakan mode tulis saja (tidak membaca balik apa yg ditampilkan LCD), jadi pin ini di-pull-up resistor aja
E --> enable, untuk memberitahu LCD bahwa data sudah siap untuk dibaca (kasih falling edge signal dgn low state selama minimal 1000 ns)
DATA --> bisa mode 4-bit atau mode 8-bit

nah, jadi maksimal kita bisa menggunakan RS+RW+E+DATA = 11 pin microcontroller, minimal menggunakan RS+E+DATA(4-bit) = 6 pin microcontroller

kita akan gunakan yang minimal saja, maklum lah biasanya untuk aplikasi diusahakan menghemat pin (buat keypad, ADC, serial link, tombol, d.l.l.)

2. Perintah Dasar
untuk lengkapnya perintah apa aja yang tersedia, bisa merujuk ke datasheet LCD nya,
kita ambil contoh LCD dengan driver HD4478U dengan display 2x16 aja yg umum

kita gunakan perintah:
a. kirim data untuk ditampilkan
b. pindahkan kursor ke kanan/kiri
c. pindahkan kursor ke posisi (x,y)

yang lainnya ada bikin blinking, bikin tulisan berjalan; kita bahas ketiga/empat perintah di atas aja, soalnya itu yang pernah saya cobain

a. kirim data untuk ditampilkan
mode = 4-bit data
untuk menulis data: set RS high, lalu kirim 4-bit high data (high nibble), beri sinyal Enable, kirim 4-bit low data (low nibble), beri sinyal Enable
untuk "keamanan", kita matikan saja semua interupsi ketika menulis data,
kalo mau sih boleh aja diaktifkan

b. pindahkan kursor ke kanan/kiri
data perintahnya 0 - 0 - 0 - 1 - 0 - S/C - R/L - X - X
S/C = 0 untuk cursor move, 1 untuk display shift; jadi kita pake 0
R/L = 0 untuk ke kiri, 1 untuk ke kanan
jadi kita gunakan perintah 0x10 untuk pindahkan kursor ke kiri dan 0x14 untuk pindahkan kursor ke kanan

c. pindahkan kursor ke posisi (x,y)
untuk pindah ke posisi bebas, tiap cell karakter LCD diberi alamat, untuk 2x16 ialah sebagai berikut
{0x00,0x01,0x02,0x3,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F},
{0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F}

kirim data ini dengan RS=0 (menandakan perintah) untuk memindahkan kursor

ada satu lagi, yakni menginisialisasi LCD,
sebelum LCD siap digunakan, pelru diinisialisasi dulu
untuk contoh ini, dari datasheet bahwa harus dikirim urutan data berikut untuk menginisialisasi LCD
0x33, 0x32, 0x28, 0x0C, 0x06, 0x01
penjelsannya ada di datasheet

3. Implementasi
nah mulai deh coding nya
jadi fungsi-fungsi diperlukan ialah:

fungsi dasar:
LCD_command(command) untuk mengirim data sebagai perintah
LCD_putc(ascii) untuk mengirim 1 byte data untuk ditampilkan

fungsi untuk sinyal:
LCD_enable() memberi sinyal Enable
LCD_delay(ms) memberi delay

fungsi-fungsi turunan:
LCD_puts(lcd_string) memanggil LCD_putc berulang2 untuk menampilkan string
LCD_init() untuk menginisialisasi LCD
LCD_cur_right() memindahkan kursor ke kanan
LCD_cur_left() memindahkan kursor ke kiri
gotoxy(x, y) memindahkan kursor ke posisi x,y

wah, segitu dulu, ada yg ngajak makan :P,
nanti dilanjut di postingan selanjutnya untuk implementasi tiap fungsi nya
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: erik hardianto pada Mei 16, 2009, 08:25:54 PM

Kalo pake program Code Vision gampang. Coz sudah ada unit dan fungsi tersendiri yang bisa langsung dipake. Namanya lcd.h

Contoh programnya :

#include
#asm
   .equ __lcd_port=0x15
#endasm
#include


void main(void)
{
       // inisialisasi LCD
       lcd_init(16);

        // menampilkan pada baris 0 dari kolom 0
        lcd_gotoxy(0,0);   
        lcd_puts("Forum");   

        // menampilkan pada baris 1 dari kolom 0
        lcd_gotoxy(0,1);     
        lcd_puts("Sains");

       // agar nampak dan terus ditampilkan
       while(1);
}

Secara teori sih begitu. Saya lupa lagi. Soalnya jarang pake LCD, biasanya langsung dikomunikasikan ke PC.
[/quote]

mas insan, apa ini progrm uda lgsng nyala blm ya ke LCD? mksdnya uda tgl didownload ke IC,,,trimakasih
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: insan sains pada Mei 16, 2009, 08:35:39 PM
bisa dicoba. Dengan catatan, pemasangan pinnya cocok dgn keterangan sebelumnya

Kutip dari: insan sains pada Mei 16, 2009, 04:34:24 PM
Konfigurasi pin LCD dan uC nya bisa macem-macem. Saya ambil kayak gini, sbg contoh :

  [pin LCD] <-->  [pin uC]
   1 (Gnd) <--> 11 (Gnd)
   2 (+5V) <--> 10 (Vcc)
   4 (RS) <--> 22 (PC0)
   5 (RD) <--> 23 (PC1)
   6 (EN) <--> 24 (PC2)
  11 (D4) <--> 26 (PC4)
  12 (D5) <--> 27 (PC5)
  13 (D6) <--> 28 (PC6)
  14 (D7) <--> 29 (PC7)
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: erik hardianto pada Mei 16, 2009, 08:43:20 PM
Kutip dari: insan sains pada Mei 16, 2009, 08:35:39 PM
bisa dicoba. Dengan catatan, pemasangan pinnya cocok dgn keterangan sebelumnya

ok, terimaksih dgn balasan yg begitu cepat, oya sy pake AT89s51,mudah2an bisa ya,,,  ;D
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: ksatriabajuhitam pada Mei 16, 2009, 09:04:00 PM
bukannya CodeVision cuma untuk microcontroller jenis AVR ya,
???

ga tau kalo ada untuk keuarga MCS-51, (belum pernah pake CodeVision sih; padahal untuk personal user jadi free ya)
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: ksatriabajuhitam pada Mei 17, 2009, 07:25:07 AM
Kutip dari: ksatriabajuhitam pada Mei 16, 2009, 07:00:11 PM
...
wah, segitu dulu, ada yg ngajak makan :P,
nanti dilanjut di postingan selanjutnya untuk implementasi tiap fungsi nya

lanjut dah...

setelah mendisain fungsi-fungsi yang diperlukan, maka tinggal diimplementasikan,



#define LCD_DATA P2 // kita gunakan Port 2 sebagai data, sebetulnya cuma P2[0:3]
#define LCD_en P2_5 // enable LCD display
#define LCD_rs P2_4 // register select
#define LCD_DELAY 461 // bisa disesuaikan dengan frekuensi kristal yg digunakan

/* prototype fungsi dasar */
void LCD_delay(unsigned char ms);
void LCD_enable();
void LCD_command(unsigned char command);
void LCD_putc(unsigned char ascii);

/* fungsi turunan */
void LCD_puts(unsigned char *lcd_string);
void LCD_init();

/* implementasi fungsi dasar */
void LCD_delay(unsigned char ms)
{
unsigned char n;
unsigned int i;
for(n=0;n<ms;n++)
for(i=0;i<LCD_DELAY;i++);
}

void LCD_enable()
{
LCD_en = 0; // memberi sinyal falling edge
LCD_delay(1);
LCD_en = 1;
}

void LCD_command(unsigned char command)
{
LCD_rs = 0; // menandakan perintah
LCD_DATA = (LCD_DATA&0xF0)|((command>>4)&0x0F); // ambil high nibble, kirim
LCD_enable(); // beritahu driver LCD bahwa data telah siap
LCD_DATA = (LCD_DATA&0xF0)|(command&0x0F); // ambil low nibble, kirim
LCD_enable();
LCD_delay(1);
}

void LCD_putc(unsigned char ascii)
{
EA = 0; // (optional) matikan semua interrupt
LCD_rs = 1; // menandakan data untuk ditampilkan
LCD_DATA = (LCD_DATA&0xF0)|((ascii>>4)&0x0F);
LCD_enable();
LCD_DATA = (LCD_DATA&0xF0)|(ascii&0x0F);
LCD_enable();
EA = 1;
LCD_delay(1);
}

/* implementasi fungsi turunan */
void LCD_puts(unsigned char *lcd_string)
{
while(*lcd_string) /* scanning array data hingga null pointer (string habis) */
LCD_putc(*lcd_string++);
}

void LCD_init()
{
LCD_en = 1;
LCD_rs = 0;
LCD_command(0x33);
LCD_command(0x32);
LCD_command(0x28);
LCD_command(0x0C);
LCD_command(0x06);
LCD_command(0x01);
LCD_delay(256);
}




udah deh, save dengan nama antarmuka_lcd.h misalnya;
setelah punya fungsi-fungsi dasar tersebut, kita bisa bermain-main dengan instruksi LCD yang lain,
misalnya tambahkan instruksi baru berikut: (lihat data sheet untuk tabel instruksi yang tersedia)
untuk membersihkan layar --> perintah 0x01
untuk pindah ke baris-1 --> perintah 0x80
untuk pindah ke baris-2 --> perintah 0xC0
maka bisa ditambahkan deklarasi berikut:

...
#define LCD_clear() LCD_command(0x01)
#define LCD_row1() LCD_command(0x80)
#define LCD_row2() LCD_command(0xC0)
...



udah deh bisa dipake...
contoh:

void main()
{
LCD_init();
init_int();
init_baud();

baca_status_eeprom();

P1 = 0x00;

kembali_ke_main:
main_display(); // mode_main = mode_cari (1), mode_entry (2)

while(1)
{
LCD_clear();
// tambahin apa aja lah...
                // sesuai keperluan...
        }
}


saya pake compiler SDCC
:kribo:

Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: erik hardianto pada Mei 19, 2009, 02:11:41 PM
waduh mana yg bener ne,, coba aja smuanyalah,,, sukur2 bisa, tp yg ptama ga bisa,, mudah2an yg kdua bisa,, saya punyanya microC,
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: insan sains pada Mei 19, 2009, 02:29:13 PM
Kutip dari: erik hardianto pada Mei 16, 2009, 08:43:20 PM
oya sy pake AT89s51,mudah2an bisa ya,,,  ;D

Program yang saya lampirkan khusus untuk uC keluarga AVR dan dibuat pada Code Vision.
Seperti yang ksatriabajuhitam bilang

Kutip dari: ksatriabajuhitam pada Mei 16, 2009, 09:04:00 PM
bukannya CodeVision cuma untuk microcontroller jenis AVR ya,
???

Kalo membuat dengan software lain, berarti memang harus membuat dulu fungsi-fungsi untuk LCDnya itu sendiri. Sebagaimana yang dijelaskan sama ksatriabajuhitam. Ok, selamat mencoba. ^_^
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: erik hardianto pada Mei 19, 2009, 04:50:45 PM
uda nyoba, tp ga bisa.. kalo buat nampilin huruf , gmn programnya ya mas,,, saya pake compiler mikroC..
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: erik hardianto pada Mei 25, 2009, 02:43:52 PM
Kutip dari: erik hardianto pada April 26, 2009, 10:45:38 PM
1. ada yang punya contoh program pake bahasa C untuk LCD 2X16..
2. ic-nya pake at89c52 bisa ga?
3. ditunggu jwb dari yang bisa bantu. terima kasih
mas ksatriabajuhitam,,, LCDnya ga mau tampilin huruf kenapa ya... tolong dong, 4 hari lagi ni uji sistem...
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: insan sains pada Mei 25, 2009, 04:40:55 PM
@mas Erik :

Micro C nya yang untuk 8051 kan? soalnya Micro C kan banyak variasinya, ada yang untuk AVR, PIC, dll.

mas Erik mungkin bisa mendeskripsikan bagaimana proses perakitannya dari awal (baik secara hardware maupun software). Soalnya kalo dalam hal troubleshooting, hal-hal remeh saja bisa jadi satu-satunya penyebab. Kalo bisa melampirkan juga program yang sudah ditulis.
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: erik hardianto pada Mei 26, 2009, 11:12:35 AM
Kutip dari: insan sains pada Mei 25, 2009, 04:40:55 PM
@mas Erik :

Micro C nya yang untuk 8051 kan? soalnya Micro C kan banyak variasinya, ada yang untuk AVR, PIC, dll.

mas Erik mungkin bisa mendeskripsikan bagaimana proses perakitannya dari awal (baik secara hardware maupun software). Soalnya kalo dalam hal troubleshooting, hal-hal remeh saja bisa jadi satu-satunya penyebab. Kalo bisa melampirkan juga program yang sudah ditulis.
iya, sy pake AT89S51, ngomong2 masukin gambar gmn ya???

programnya ga beda jauh sama mas KBH:

#define   LCD_DATA   P2 // kita gunakan Port 2 sebagai data, sebetulnya cuma P2[0:3]
#define   LCD_en      P2_5   // enable LCD display
#define   LCD_rs      P2_4   // register select
#define   LCD_DELAY   11.92 // bisa disesuaikan dengan frekuensi kristal yg digunakan

/* prototype fungsi dasar */
void LCD_delay(unsigned char ms);
void LCD_enable();
void LCD_command(unsigned char command);
void LCD_putc(unsigned char ascii);

/* fungsi turunan */
void LCD_puts(unsigned char *lcd_string);
void LCD_init();
void main(){
    LCD_init();
    LCD_puts("Ga Sukses");
    while(1);
}
/* implementasi fungsi dasar */
void LCD_delay(unsigned char ms)
{
   unsigned char n;
   unsigned int i;
   for(n=0;n<ms;n++)
      for(i=0;i<LCD_DELAY;i++);
}


void LCD_enable()
{
   LCD_en = 0; // memberi sinyal falling edge
   LCD_delay(1);
   LCD_en = 1;
}

void LCD_command(unsigned char command)
{
   LCD_rs = 0; // menandakan perintah
   LCD_DATA = (LCD_DATA&0xF0)|((command>>4)&0x0F); // ambil high nibble, kirim
   LCD_enable(); // beritahu driver LCD bahwa data telah siap
   LCD_DATA = (LCD_DATA&0xF0)|(command&0x0F); // ambil low nibble, kirim
   LCD_enable();
   LCD_delay(1);
}

void LCD_putc(unsigned char ascii)
{
   EA = 0; // (optional) matikan semua interrupt
   LCD_rs = 1; // menandakan data untuk ditampilkan
   LCD_DATA = (LCD_DATA&0xF0)|((ascii>>4)&0x0F);
   LCD_enable();
   LCD_DATA = (LCD_DATA&0xF0)|(ascii&0x0F);
   LCD_enable();
   EA = 1;
   LCD_delay(1);
}

/* implementasi fungsi turunan */
void LCD_puts(unsigned char *lcd_string)
{
   while(*lcd_string) /* scanning array data hingga null pointer (string habis) */
      LCD_putc(*lcd_string++);
}

void LCD_init()
{
   LCD_en = 1;
   LCD_rs = 0;
   LCD_command(0x33);
   LCD_command(0x32);
   LCD_command(0x28);
   LCD_command(0x0C);
   LCD_command(0x06);
   LCD_command(0x01);
   LCD_delay(256);
}

IC                             LCD
p2.0 ------------------> D4
p2.1 ------------------> D5
p2.2 ------------------> D6
p2.3 ------------------> D7
p2.4 ------------------> RS
p2.5 ------------------> E

sama vcc+ground...
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: erik hardianto pada Mei 26, 2009, 11:24:31 AM
ketinggalan:

IC                             LCD
p2.0 ------------------> D4
p2.1 ------------------> D5
p2.2 ------------------> D6
p2.3 ------------------> D7
p2.4 ------------------> RS
p2.5 ------------------> E

sama vcc+ground...
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: erik hardianto pada Mei 26, 2009, 11:30:12 AM
Kutip dari: erik hardianto pada Mei 26, 2009, 11:24:31 AM
ketinggalan:

IC                             LCD
p2.0 ------------------> D4
p2.1 ------------------> D5
p2.2 ------------------> D6
p2.3 ------------------> D7
p2.4 ------------------> RS
p2.5 ------------------> E

sama vcc+ground...
niatnya cuma mau tampilin "Ga sukses"
e, ga sukses bener... apa sing salah ya mas???
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: ksatriabajuhitam pada Mei 26, 2009, 08:35:18 PM
mungkin masalah timing nya,
kalo ga mau ngitung cycle fungsi delay nya, coba2 pake nilai gede aja dulu

Kutip dari: erik hardianto pada Mei 26, 2009, 11:12:35 AM
...
#define   LCD_DELAY   11.92 // bisa disesuaikan dengan frekuensi kristal yg digunakan
...
di deklarasi itu nilai delai harus bulat, maksudnya disesuaikan itu:
(cycle yg dibutuhkan untuk 1 loop fungsi delay) x (1/freq_crystal x pembagi*) x LCD_DELAY

*) pembagi : beberapa microcontroller, misal keluarga 8051 umumnya tipe CISC, memerlukan tahapan proses yg menyebabkan clock internalnya hanya menggunakan freq_crystal / pembagi. untuk 8051 nilai pembaginya 12.
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: erik hardianto pada Mei 29, 2009, 11:06:47 AM
Kutip dari: ksatriabajuhitam pada Mei 26, 2009, 08:35:18 PM
mungkin masalah timing nya,
kalo ga mau ngitung cycle fungsi delay nya, coba2 pake nilai gede aja dulu
di deklarasi itu nilai delai harus bulat, maksudnya disesuaikan itu:
(cycle yg dibutuhkan untuk 1 loop fungsi delay) x (1/freq_crystal x pembagi*) x LCD_DELAY

*) pembagi : beberapa microcontroller, misal keluarga 8051 umumnya tipe CISC, memerlukan tahapan proses yg menyebabkan clock internalnya hanya menggunakan freq_crystal / pembagi. untuk 8051 nilai pembaginya 12.
uda di ganti smua ko ga mau tampilin jurum juga ya mas... knp ini?
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: insan sains pada Mei 30, 2009, 08:02:50 PM
Dari keterangan mas Erik

- Hardware udah bener
- Program gak ada yang salah
- Freq-nya udah diubah

Apa di compilernya yach?

Apa mungkin di deklarasi portnya yach?

Misal kayak deklarasi ini :
#define   LCD_en      P2_5

Di AVR Studio, saya biasanya nulis :
#define   LCD_en      P2.5

Kalo di GCC, saya biasanya nulis :
#define   LCD_en      PB5

Apa karena ini bukan yach?
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: erik hardianto pada Mei 31, 2009, 10:44:46 PM
Kutip dari: ksatriabajuhitam pada Mei 26, 2009, 08:35:18 PM
mungkin masalah timing nya,
kalo ga mau ngitung cycle fungsi delay nya, coba2 pake nilai gede aja dulu
di deklarasi itu nilai delai harus bulat, maksudnya disesuaikan itu:
(cycle yg dibutuhkan untuk 1 loop fungsi delay) x (1/freq_crystal x pembagi*) x LCD_DELAY

*) pembagi : beberapa microcontroller, misal keluarga 8051 umumnya tipe CISC, memerlukan tahapan proses yg menyebabkan clock internalnya hanya menggunakan freq_crystal / pembagi. untuk 8051 nilai pembaginya 12.
smua yg ditulis gada yg ngerti,,, mksdnya apa ya mas??
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: erik hardianto pada Mei 31, 2009, 10:51:36 PM
- Freq-nya udah diubah

Apa di compilernya yach?
[/quote]
1. freq,nya sy pake 12,,
2. compilernya? ga ngerti maksudnya??
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: insan sains pada Juni 09, 2009, 10:36:08 AM
hampir 2 minggu gak baca topik ini, gimana perkembangannya nie?
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: erik hardianto pada Juni 11, 2009, 02:10:22 AM
iya ni ditunggu,, sampe prustasi,, gada jwban, jd sy pake prog, punya tmn pake bahasa asembly, tp ga sesempurna yg diinginkan.. bingung,,, , kalo bisa yg pake bahasa c, jd smpurna.. 1 juli sidang.. kalo ada yg masi bisa bantu, ditunggu. jd malaikat buat saya, soalnya uda 7 tahun kulia. detik2 terakhir :) 
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: ksatriabajuhitam pada Juni 13, 2009, 07:44:53 AM
coba post aja program assembly nya, siapa tau kita-kita di sini bisa bantu convert ke c
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: erik hardianto pada Juni 21, 2009, 02:26:56 PM
Kutip dari: ksatriabajuhitam pada Juni 13, 2009, 07:44:53 AM
coba post aja program assembly nya, siapa tau kita-kita di sini bisa bantu convert ke c
program nya,,,

$mod51

ORG   00H

MAIN:
LCD_RS      EQU P3.5
LCD_RW      EQU P3.6
LCD_EN      EQU P3.7



MAIN_PROGRAM:

LCALL    INITIALIZE_LCD

MOV   A,#80H
LCALL ADDRESS
MOV    DPTR,#TEST
LCALL   TRANSFER

ENDD:
JMP   ENDD




;*************************************************
;-------------INITIALIZATION LCD------------------
;*************************************************

INITIALIZE_LCD:
CLR   LCD_EN            ;INIT 00110000B
CLR   LCD_RW
CLR   LCD_RS
MOV   P1,#00110000B
SETB   LCD_EN
LCALL   DELAY1

CLR   LCD_EN            ;INIT 00110000B
CLR   LCD_RW
CLR   LCD_RS
MOV   P1,#00110000B
SETB   LCD_EN
LCALL   DELAY1

CLR   LCD_EN            ;INIT 00110000B
CLR   LCD_RW
CLR   LCD_RS
MOV   P1,#00110000B
SETB   LCD_EN
LCALL   DELAY1

CLR   LCD_EN            ;0 0 1 DL N F X X
CLR   LCD_RW            ;DL = 1 => 8BIT         DL = 0 => 4BIT      
CLR   LCD_RS            ;N  = 1 => 2LINES         N  = 0 => 1LINE
MOV   P1,#00111000B      ;F  = 1 => 5X10         F  = 0 => 5X7
SETB   LCD_EN            ;==>   8BIT AND 2LINES
LCALL   DELAY1

CLR   LCD_EN            ;0 0 0 0 1 D C B
CLR   LCD_RW            ;D  = 1 => DISP_ON      D  = 0 => DISP_OFF
CLR   LCD_RS            ;C  = 1 => CURSOR_ON      C  = 0 => CURSOR_OFF
MOV   P1,#00001100B      ;B  = 1 => BLINK_ON      B  = 0 => BLINK_OFF
SETB   LCD_EN            ;==>   DISP_ON, CURSOR OFF AND BLINK OFF
LCALL   DELAY1

CLR   LCD_EN            ;0 0 0 0 0 1 I/D S
CLR   LCD_RW            ;I/D= 1 => INCREMENT      I/D= 0 => DECREMENT
CLR   LCD_RS            ;S  = 1 => DISP SHIFT   S  = 0 => NO DISP SHIFT
MOV   P1,#00000110B      ;==>   INCREMENT AND NO DISP SHIFT
SETB   LCD_EN            
LCALL   DELAY1
CLR   LCD_EN

RET

;*************************************************



;*************************************************
;------------------CONTROL LCD--------------------
;*************************************************

CURSOR_BLINK:
MOV    A,#0FH            ; 0 0 0 0 1 1 1 1 ==> ( 0 0 0 0 1 D C B )
LCALL   COMMAND            ; DISPLAY ON, CURSOR ON AND BLINK ON
RET


CURSOR_OFF:
MOV    A,#0CH            ; 0 0 0 0 1 1 0 0 ==> ( 0 0 0 0 1 D C B )
LCALL   COMMAND            ; dISPLAY ON, CURSOR OFF AND BLINK OFF
RET


CURSOR_CUSTOM:
MOV    A,#0C0H            ; 1 1 0 0 0 0 0 0 ==> ( ??????????????????
LCALL   COMMAND
RET


CLEAR_DISPLAY:         
MOV   A,#01H            ; CLEAR DISPLAY
LCALL COMMAND
RET


HOME:
MOV    A,#03H            ; SET DDRAM ADD TO 00H
LCALL COMMAND            ; RETURN CURSOR TO ORIGINAL POSITION IF SHIFTED
RET


SHIFT_LEFT_SCREEN:
MOV    A,#18H            ; 0 0 0 1 1 0 0 0 ==> ( 0 0 0 1 S/C R/L X X )   
LCALL   COMMAND            ; S/C = 1 DISP SHIFT   S/C = 0 CURSOR MOVE   R/L = 1 RIGHT SHIFT   R/L = 0 LEFT SHIFT   
RET                     ; DISP SHIFT AND LEFT SHIFT


SHIFT_RIGHT_SCREEN:
MOV    A,#1CH            ; 0 0 0 1 1 1 0 0 ==> ( 0 0 0 1 S/C R/L X X )
LCALL   COMMAND            ; S/C = 1 DISP SHIFT   S/C = 0 CURSOR MOVE   R/L = 1 RIGHT SHIFT   R/L = 0 LEFT SHIFT
RET                     ; DISP SHIFT AND RIHT SHIFT

;*************************************************



;*************************************************
;------------------INTERFACE LCD------------------
;*************************************************

COMMAND:
MOV   P1,A
CLR   LCD_EN
CLR   LCD_RW
CLR   LCD_RS
LCALL   DELAY0
SETB   LCD_EN
LCALL   DELAY0
CLR   LCD_EN
RET


CLEAR_SCREEN:
CLR   LCD_EN
CLR   LCD_RS
CLR   LCD_RW
MOV   P1,#00000001B
LCALL   DELAY0
SETB   LCD_EN
LCALL   DELAY0
CLR   LCD_EN
RET


ADDRESS:
CLR   LCD_EN
CLR   LCD_RW
CLR   LCD_RS
MOV   P1,A
LCALL   DELAY0
SETB   LCD_EN
LCALL   DELAY0
CLR   LCD_EN
RET


WRITE_ON:
MOV   P1,A
CLR   LCD_EN
CLR   LCD_RW
SETB   LCD_RS
LCALL   DELAY0
SETB   LCD_EN
LCALL   DELAY0
LCALL   DELAY0
CLR   LCD_EN
RET


TRANSFER:
CLR   A
MOVC   A,@A+DPTR
INC   DPTR
CJNE   A,#0FFH,TRANS
LJMP   EXIT

TRANS:
MOV   P1,A
LCALL   WRITE_ON
LJMP   TRANSFER

EXIT:
RET

;*************************************************



;*************************************************
;------------------TIMER DELAY--------------------
;*************************************************

DELAY0:
PUSH   7
MOV   R7,#1

SUB_DELAY0:
MOV   TMOD,#00000001B   ; 1023 X TIMES
MOV   TH0,#0FCH
MOV   TL0,#00H
SETB   TR0

TF0?0:
JNB   TF0,TF0?0
CLR   TR0
CLR   TF0
DJNZ   R7,SUB_DELAY0
POP   7
RET



DELAY1:
PUSH   7
MOV   R7,#1

SUB_DELAY1:
MOV   TMOD,#00000001B   ; 24575 X TIMES
MOV   TH0,#0A0H
MOV   TL0,#00H
SETB   TR0

TF0?1:
JNB   TF0,TF0?1
CLR   TR0
CLR   TF0
DJNZ   R7,SUB_DELAY1
POP   7
RET



DELAY2:
PUSH   7
MOV   R7,#1

SUB_DELAY2:
MOV   TMOD,#00000001B   ; 10903 X TIMES
MOV   TH0,#0D5H
MOV   TL0,#68H
SETB   TR0

TF0?2:
JNB   TF0,TF0?2
CLR   TR0
CLR   TF0
DJNZ   R7,SUB_DELAY1
POP   7
RET

;*************************************************


TEST:
DB      'KODE KIR' , 0FFH

END

Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: herlambang pada Juni 23, 2009, 12:33:32 AM
Kutip dari: erik hardianto pada Juni 11, 2009, 02:10:22 AM
iya ni ditunggu,, sampe prustasi,, gada jwban, jd sy pake prog, punya tmn pake bahasa asembly, tp ga sesempurna yg diinginkan.. bingung,,, , kalo bisa yg pake bahasa c, jd smpurna.. 1 juli sidang.. kalo ada yg masi bisa bantu, ditunggu. jd malaikat buat saya, soalnya uda 7 tahun kulia. detik2 terakhir :) 

tidak sesempurna yg di inginkan? gejalanya apa?
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: herlambang pada Juni 23, 2009, 09:38:07 AM
 ;D
wew, mepet ya?
ya dah neh ada pake C mode 8bit.
saia attach lengkap:
program dengan Keil uVision3 C51 V8.16
schematic dan simulasi dengan ISIS Proteus V7.4SP3.
jangan nanya ya.. kenapa pilih warna ungu bwt komponennya :D kakakaka

ntar kalo butuh yg versi assembly-nya tinggal ngomong aja.. ^^"
semoga cepet lulus..
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: Too Payz pada Juni 23, 2009, 03:16:05 PM
wkkk............
Parah neh erik keknya g punya basic sama sekali..
Klo pake AVR tipe ATmega misalnya ATmega8535 gunakan CodevisionAVR seperti dibilang ma Insan.
Klo MCS51 g ada fugnsinya d CodevisionAVR jadinya bikin sendiri dseperti yg dibilang ma KEsatriaBajuHitam.
Klo asal nyoba ya ga jalan laa...

Coding kesatriabajuhitam udah lebih dari jelas itu tinggal digabungin aja antara main program (.c) dengan librarynya (.h)
Sabar aja n pelajari 1-1 g usa buru" harusnya jalan itu.
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: Too Payz pada Juni 23, 2009, 04:34:09 PM
Cobain lisitng dari Herlambang mudah-mudahan bisa.
Saya basic MCS51 bahasa assembler n klo program LCD pake MCS51 pake bahasa assembler. sempurna kok g da salahnya.
Klo bahasa C pake AVR CodeVisionAVR n beberapa penulisan berbeda dengan KeilC

Comment tentang listing KBH n Erik di bawah ini.....
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: Too Payz pada Juni 23, 2009, 04:41:59 PM
kesalahan :

#define   LCD_DELAY   461 // disesuaikan dengan frekuensi kristal yg digunakan

void LCD_delay(unsigned char ms);   ganti dengan
void delay_ms (unsigned int ms);
alasan
1. unsigned char range 0 - 255   sedangkan unsigned int  range 0 - 65535
    untuk 1 detik manggilnya kan delay_ms(1000); klo unsigned char tidak sampai (max 255)
2. sudah ada #define LCD_DELAY  461 nanti rancu dengan void LCD_delay, klo error g ketahuan salahnya
    kan bahasa C case sensitif (huruf besar dan huruf kecil berbeda).

Lihat listing delay
/* implementasi fungsi dasar */
void LCD_delay(unsigned char ms)
{
   unsigned char n;
   unsigned int i;
   for(n=0;n<ms;n++)
      for(i=0;i<LCD_DELAY;i++);
}
Si KBH nilai  LCD_DELAY nya = 461
si ERIK nilai LCD_DELAY nya = 11.92 (keknya kristal tuh 11.0592 deh)
untuk for loop tidak ada nilai pecahan harusnya (for(i=0;i<12;i++); bukan for(i=0;i<11.92;i++);
selain itu ini bukan delay 1 milisekon menurutku salah neh.

klo untuk delay pada mikro gunakan kristal 12MHz
    alasan : biar perhitungan delay bulat.
klo komunikasi UART dengan komputer atau perangkat lain dgn kristal 11.0592MHz
    alasan : baudrate tertentu akan menghasilkan error.

listingku cobain
void delay_ms(unsigned int ms)
{
   unsigned int loop;
   while (ms--)
   {
      loop=1000;
      while (loop--)   {}   //tunda 1ms bisa juga tambahkan _nop_ dalam {}
   }   
}

untuk kristal 12 MHz 1 siklus mesin = 1uS, jadi 1 _nop_ = 1uS.
saya tidak menambahkan _nop_ karena asumsi 1 siklus while(loop--) = 1uS.
1 mS = 1000 uS jadi...
x mS = x * 1000 * 1 uS ;  gimana ?
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: erik hardianto pada Juni 25, 2009, 11:57:18 PM
emang ga ngerti program,,, jd yg diatas tgl tambahin doang ya???? saya pake MikroC yg warna biru,,, bukan AVR, jd kalo bisa yg salah tolong ditambahin ya... 
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: ksatriabajuhitam pada Juni 28, 2009, 02:49:33 PM
@Too Payz
thanks koreksinya,
jago microcon nih kayaknya, selamat bergabung dan sharing :D

(tapi kok program saya jalan tuh (compiler-nya SDCC), atau mungkin sdcc ga ngasih pesan error aja kali, tapi nilainya langsung truncated (dibuang lebihnya) ketika run-time)
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: Too Payz pada Juni 29, 2009, 01:21:14 AM
Kutip dari: ksatriabajuhitam pada Juni 28, 2009, 02:49:33 PM
(tapi kok program saya jalan tuh (compiler-nya SDCC), atau mungkin sdcc ga ngasih pesan error aja kali, tapi nilainya langsung truncated (dibuang lebihnya) ketika run-time)
Pesan applikasi (compiler) di buat oleh pembuat program compiler SDCC, dan untuk pesan ada yang tergolong ERROR dan WARNING.
Biasanya yang diutamakan ERROR dulu untuk di buat daftar pesan saat terjadi error (kesalahan listing program), jadi yang WARNING biasanya "nanti dulu" untuk versi berikutnya.

Mungkin tidak keluar karena termasuk WARNING dan bukan ERROR, atau mungkin sebenarnya ERROR yang tidak terdeteksi atau belum di buat daftarnya oleh pembuat Compiler SDCC tersebut.

Masi belajar mikro juga kok ini...   :D
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: erik hardianto pada Juni 29, 2009, 07:19:01 PM
trus gmn ne jadinya
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: ksatriabajuhitam pada Juni 29, 2009, 08:27:09 PM
tuh ada solusi lain dari herlambang, kalo mau dicoba
(saya juga belum liat code nya)

Kutip dari: herlambang pada Juni 23, 2009, 09:38:07 AM
;D
wew, mepet ya?
ya dah neh ada pake C mode 8bit.
saia attach lengkap:
program dengan Keil uVision3 C51 V8.16
schematic dan simulasi dengan ISIS Proteus V7.4SP3.
jangan nanya ya.. kenapa pilih warna ungu bwt komponennya :D kakakaka

ntar kalo butuh yg versi assembly-nya tinggal ngomong aja.. ^^"
semoga cepet lulus..

@herlambang
asli ga software nya? (hehe, saya juga punya yang bajakan :P )
emang mantep itu software ISIS (sebetulnya VSM sih buat simulasinya), Electronics Workbench lewat lah...
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: herlambang pada Juni 30, 2009, 05:26:40 AM
Kutip dari: ksatriabajuhitam pada Juni 29, 2009, 08:27:09 PM
@herlambang
asli ga software nya? (hehe, saya juga punya yang bajakan :P )
emang mantep itu software ISIS (sebetulnya VSM sih buat simulasinya), Electronics Workbench lewat lah...


;D tau sendiri lah gan..  lisensinya aja selangit dan daripada tidak pake, mendingan pake yang  >:D

^^" ..

Yups.. tul gan EWB yang terbarupun (ganti nama jadi NI Designer (dibeli National Instrument))
masih kalah kalo bwt simulasi mikrokontroler dan peripheralnya..
mungkin kelebihan NI di FPGA dan circuit analisisnya..

BTW, nyaman banget pake Proteuss... thanx 4 Labcenter Electronics  ;D


Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: tAZZZ pada Juli 30, 2009, 02:18:08 PM
Kutip dari: herlambang pada Juni 30, 2009, 05:26:40 AM

BTW, nyaman banget pake Proteuss... thanx 4 Labcenter Electronics  ;D


coba altium deh, jauh lebih enak
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: herlambang pada Agustus 05, 2009, 01:18:31 AM
Kutip dari: tAZZZ pada Juli 30, 2009, 02:18:08 PM
Kutip dari: herlambang pada Juni 30, 2009, 05:26:40 AM

BTW, nyaman banget pake Proteuss... thanx 4 Labcenter Electronics  ;D


coba altium deh, jauh lebih enak


masih enakan proteus untuk VSM.
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: hafis martin pada April 15, 2010, 09:21:36 AM
tolong.....^ ^
w anggota bru nie..hehehe
blh mnta tlng y....
mnta cntoh program bhsa C tp untuk tampilan ke LCD sie  ??
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: rakanety pada Juni 06, 2011, 03:31:16 PM
tolong beritahu dan informasinya untuk lcd2x16 ke atmega128 bisa tidak yah???melihat lcd saya berjenis LMB162AFC apakah sama???
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: erik hardianto pada Juni 07, 2011, 01:47:09 PM
Kutip dari: herlambang pada Juni 23, 2009, 09:38:07 AM
;D
wew, mepet ya?
ya dah neh ada pake C mode 8bit.
saia attach lengkap:
program dengan Keil uVision3 C51 V8.16
schematic dan simulasi dengan ISIS Proteus V7.4SP3.
jangan nanya ya.. kenapa pilih warna ungu bwt komponennya :D kakakaka

ntar kalo butuh yg versi assembly-nya tinggal ngomong aja.. ^^"
semoga cepet lulus..

sudah bisa tersenyum,, sudah lulus kang mas... maturnuwun doanya,,, ;D
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: herlambang pada Juni 14, 2011, 03:51:30 PM
@erik...

selamat bro.... udeh lulus ya? hahah ikutan seneng dah :D
Judul: Re: bahasa C buat LCD 2x16
Ditulis oleh: himura pada Juni 27, 2011, 01:45:57 AM
MAs Herlambang
punya contoh program c untuk mikrokontroler jenis pic16f877a ngk? yang make keypad sama LCD?
saya lagi bingung neh cara program make keypadnya...
n buat mas - mas yang lainnya ada yang punya ngk contoh-contohnya? makasih yah sebelumnya. ane anak baru neh.... hehehe :)