Member baru? Bingung? Perlu bantuan? Silakan baca panduan singkat untuk ikut berdiskusi.

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

Desember 06, 2024, 05:42:26 AM

Login with username, password and session length

Topik Baru

Artikel Sains

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

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.

insan sains

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

erik hardianto

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

erik hardianto

ketinggalan:

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

sama vcc+ground...

erik hardianto

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

ksatriabajuhitam

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

insan sains

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

erik hardianto

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

erik hardianto

- Freq-nya udah diubah

Apa di compilernya yach?
[/quote]
1. freq,nya sy pake 12,,
2. compilernya? ga ngerti maksudnya??

insan sains

hampir 2 minggu gak baca topik ini, gimana perkembangannya nie?
Menuju Indonesia sebagai THE COUNTRY MASTER OF TECHNOLOGY, 2030

erik hardianto

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 :) 

ksatriabajuhitam

coba post aja program assembly nya, siapa tau kita-kita di sini bisa bantu convert ke c
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 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


herlambang

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?
built-in double watchdog! ^^"   *Problem Solved*

herlambang

 ;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..
built-in double watchdog! ^^"   *Problem Solved*