LCDisplay doesn't work!!

I use the code in the attachment, and it’s my idea it will give me on my LCDisplay the letters “Camil” (and yes, that is my name)

All the first subroutines i just copied form http://home.iae.nl/users/pouweha/lcd/lcd2.shtml - it has to work.

From label start i did make anything myself.

I’m sure i did connect the LCD and the PIC right, and i am sure the contrast is OK.

I just think i don’t understand how to use the subroutines.

What happens is the following: the backlight does work, but there isn’t any character.

What’s the problem - how do I solve it?

And: I’m dutch, and my english isn’t very well - could you please try to make your sentences easy?? :smile:

Thanks for your help!

here does the program stay too:

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

; *

; Filename: LCDisplay test.asm *

; Date: 17/7/2010 *

; File Version: v1.0 *

; *

; Author: Camil Staps *

; Company: none *

; * 

; *

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

; *

; Files Required: P16F84A.INC *

; *

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

; *

; Notes: *

; *

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



	list p=16F84A ; list directive to define processor

	#include <p16F84A.inc> ; processor specific variable definitions


	__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC


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

		ORG 0000h ; processor reset vector

  		GOTO start ; go to beginning of program

		ORG 0004h ; interrupt vector location

		GOTO	start


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

lcdinit		

			LCD_DATA EQU 06h ;	PORTB

			LCD_DATA_TRIS	EQU 86h ;	TRISB

			LCD_CTRL EQU 05h ;	PORTA

			LCD_TEMP EQU 0x020	

			DELAY EQU 0x023

			X_DELAY EQU 0x024

			;	PORTA Control Bits

			LCD_E EQU 02h ;	Enable

			LCD_RW EQU 01h ;	Read/Write

			LCD_RS EQU 00h ;	Register Select

			CLRF	LCD_CTRL ;	all RA on 0

			MOVLW	0x01E

			CALL	X_DELAY500

			MOVLW	0x038

			CALL	lcdputcmd

			MOVLW	0x000

			CALL	lcddmode ;	disp.off, curs.off, noblink

			CALL	lcdclear

			MOVLW	0x004

			CALL	lcddmode ;	disp.on, curs.off

			MOVLW	0x002

			CALL	lcdemode ;	auto-inc (shift-cursor)

			RETURN


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

;Busy Flag

lcdbusy BSF 03h,05h ;	bank 1

			MOVLW	0x0FF

			MOVWF	LCD_DATA_TRIS ;	PORTB input

			BCF 83h,05h ;	bank 0

			BCF LCD_CTRL,LCD_RS ;	LCD Command Mode

			BSF LCD_CTRL,LCD_RW ;	Setup busy flag

			BSF LCD_CTRL,LCD_E ;	LCD Enable hoog

			MOVF	LCD_DATA,0

			BCF LCD_CTRL,LCD_E ;	LCD Enable low

			ANDLW	0x080 ;	check busy flag, high=busy

			BTFSS	03h,02h ;	Zero Flag

			GOTO	lcdbusy ;	still busy...

lcdnotbusy	BCF LCD_CTRL,LCD_RW		

			BSF 03h,05h

			CLRF	LCD_DATA_TRIS ;	PORTB output

			BCF 83h,05h

			RETURN


;Clear Display

lcdclear	MOVLW	0x001

			CALL	lcdputcmd

			RETURN


;Cursor Home

lcdhome MOVLW	0x002

			CALL	lcdputcmd

			RETURN


;Entry Mode

lcdemode	ANDLW	0x003

			IORLW	0x004

			CALL	lcdputcmd

			RETURN


;Display Mode

lcddmode	ANDLW	0x007

			IORLW	0x008

			CALL	lcdputcmd

			RETURN


;Set Character generator RAM address

lcdscga ANDLW	0x03F

			IORLW	0x040

			CALL	lcdputcmd

			RETURN


;Set Display data RAM address

lcdsdda IORLW	0x080

			CALL	lcdputcmd

			RETURN


;Get address counter contents

lcdgaddr	BSF 03h,05h

			MOVLW	0x0FF ;	PORTB input

			MOVWF	LCD_DATA_TRIS

			BCF 83h,05h

			BCF LCD_CTRL,LCD_RS ;	command mode

			BSF LCD_CTRL,LCD_RW ;	setup busy flag

			BSF LCD_CTRL,LCD_E ;	Enable high

			MOVF	LCD_DATA,0 ;	data to W register

			BCF LCD_CTRL,LCD_E ;	Enable low

			ANDLW	0x07F

			BCF LCD_CTRL,LCD_RW

			BSF 03h,05h

			CLRF	LCD_DATA_TRIS ;	PORTB output

			BCF 83h,05h

			RETURN


;Write Character

lcdputchar	MOVWF	LCD_TEMP ;	char is in W

			CALL	lcdbusy

			BCF LCD_CTRL,LCD_RW ;	Read mode

			BSF LCD_CTRL,LCD_RS ;	Data mode

			BSF LCD_CTRL,LCD_E ;	Enable high

			MOVF	LCD_TEMP,0 ;	char back to W

			MOVWF	LCD_DATA ;	data to LCD

			BCF LCD_CTRL,LCD_E ;	Enable low

			RETURN


;Write Command

lcdputcmd	MOVWF	LCD_TEMP ;	Command is in W

			CALL	lcdbusy

			BCF LCD_CTRL,LCD_RW ;	Read mode

			BCF LCD_CTRL,LCD_RS ;	Command mode

			BSF LCD_CTRL,LCD_E ;	Enable high

			MOVF	LCD_TEMP,0 ;	char back to W

			MOVWF	LCD_DATA ;	command to LCD

			BCF LCD_CTRL,LCD_E ;	Enable low

			RETURN


DELAY500	MOVLW	D'165'

			MOVWF	DELAY

DELAY500_LOOP

			DECFSZ	DELAY,1

			GOTO	DELAY500_LOOP

			RETURN


X_DELAY500	MOVWF	X_DELAY

X_DELAY500_LOOP

			CALL	DELAY500

			DECFSZ	X_DELAY,1

			GOTO	X_DELAY500_LOOP

			RETURN


;Here does my program start

start CALL	lcdinit

			MOVLW	b'01000011' ;	C

			CALL	lcdputchar

			MOVLW	b'01100001' ;	a

			CALL	lcdputchar

			MOVLW	b'01101101' ;	m

			CALL	lcdputchar

			MOVLW	b'01101001' ;	i

			CALL	lcdputchar

			MOVLW	b'01101100' ;	l

			CALL	lcdputchar


loop GOTO	loop









		END ; directive 'end of program'