Selamat datang di ForSa! Forum diskusi seputar sains, teknologi dan pendidikan Indonesia.

Welcome to Forum Sains Indonesia. Please login or sign up.

Desember 05, 2024, 02:20:21 PM

Login with username, password and session length

Topik Baru

Artikel Sains

Anggota
Stats
  • Total Tulisan: 139,653
  • Total Topik: 10,405
  • Online today: 43
  • Online ever: 1,582
  • (Desember 22, 2022, 06:39:12 AM)
Pengguna Online
Users: 0
Guests: 21
Total: 21

Aku Cinta ForSa

ForSa on FB ForSa on Twitter

bahasa C buat LCD 2x16

Dimulai oleh erik hardianto, April 26, 2009, 10:45:38 PM

« sebelumnya - berikutnya »

0 Anggota dan 1 Pengunjung sedang melihat topik ini.

erik hardianto

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

erik hardianto

TOLONG DONG... dua minggu lagi, pengujian sistem, ada yg punya program LCD  pake bahasa C ga?? + rangkaian nya + penjelasannya....

ksatriabajuhitam

#2
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
not all the problems could be solved by the sword, but sword holder take control of problems.
ForSa versi mobile: http://www.forumsains.com/forum?wap2

erik hardianto

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

insan sains

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



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.
Menuju Indonesia sebagai THE COUNTRY MASTER OF TECHNOLOGY, 2030

ksatriabajuhitam

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
not all the problems could be solved by the sword, but sword holder take control of problems.
ForSa versi mobile: http://www.forumsains.com/forum?wap2

erik hardianto


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

insan sains

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)
Menuju Indonesia sebagai THE COUNTRY MASTER OF TECHNOLOGY, 2030

erik hardianto

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

ksatriabajuhitam

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)
not all the problems could be solved by the sword, but sword holder take control of problems.
ForSa versi mobile: http://www.forumsains.com/forum?wap2

ksatriabajuhitam

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:

not all the problems could be solved by the sword, but sword holder take control of problems.
ForSa versi mobile: http://www.forumsains.com/forum?wap2

erik hardianto

waduh mana yg bener ne,, coba aja smuanyalah,,, sukur2 bisa, tp yg ptama ga bisa,, mudah2an yg kdua bisa,, saya punyanya microC,

insan sains

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. ^_^
Menuju Indonesia sebagai THE COUNTRY MASTER OF TECHNOLOGY, 2030

erik hardianto

uda nyoba, tp ga bisa.. kalo buat nampilin huruf , gmn programnya ya mas,,, saya pake compiler mikroC..

erik hardianto

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...