Hallo,

Ik ben sinds kort begonnen met het programmeren van PIC's. Laatst heb ik een LCD schermpje bij Dick Best gekocht http://www.dickbest.nl/webshop/index.php?act=viewProd&productId=15…
Ik heb op de bovenste regel mijn naam kunnen krijgen, maar het lukt me maar niet om deze ook op de onderste regel te krijgen.


;RC7-RC4 = DB7-DB4  ; RC3=E ; RC2=RW ; RC1=RS

start
;decleration
BIT_E	EQU		3
BIT_RW	EQU		2
BIT_RS	EQU		1

TEMP	EQU	0x020	;TEMP STORAGE

V_DLY	EQU	0x021           ; Variable for DLY
V_DLY1	EQU	0x022           ; for DLY1

		org 0x19 ;start of program at
		goto	START
		
;initialise
INITPIC
		bsf		STATUS,RP0 ;sellect bank 1
		movlw	b'00000000'
		movwf	TRISC	;set as output
		bcf 	STATUS,RP0 ;select bank 0
		clrf	PORTC	
		return
		
INITLCD			;INITIALIZE LCD
		MOVLW	0xFE		;WAIT LONG
		CALL	DLY1		;254 * 0.5 = DELAY OF 127ms 
						
		MOVLW	B'00111000'	;FUNCTION SET - 8 BIT, BIT_E = HIGH
		MOVWF	PORTC
		BCF		PORTC,BIT_E	; BIT_E = LOW
		MOVLW	0x0A			;wait for about 5ms
		CALL	DLY1 
		MOVLW	B'00111000'	;FUNCTION SET - 8 BIT, BIT_E=HIGH
		MOVWF	PORTC
		BCF		PORTC,BIT_E
		MOVLW	0x02			;
		CALL	DLY1 
		MOVLW	B'00111000'	;FUNCTION SET - 8 BIT, BIT_E = high
		MOVWF	PORTC
		BCF		PORTC,BIT_E	;BIT_E=LOW

					;above i have done same command 3 times, this may be not necessary, i just followed datasheet					
		CALL	LCDBUSY		;BUSY FLAG CAN BE CHECKED NOW!
		MOVLW	B'00101000'	;FUNCTION SET - 4 BIT ,BIT_E = HIGH
		MOVWF	PORTC
		BCF		PORTC,BIT_E							;..........EVERY INSTRUCTION WILL BE OF 2 CYCLE FROM HERE
		CALL	LCDBUSY		;..FUNCTION SET..
		MOVLW	B'00101000'
		MOVWF	PORTC
		BCF		PORTC,BIT_E	;1 CYCLE COMPLETE
		MOVLW	B'10001000'
		MOVWF	PORTC
		BCF		PORTC,BIT_E	;2 CYCLE		
		CALL	LCDBUSY		;DISPLAY CONTROL - 
		MOVLW	B'00001000'	; 1ST NIBBLE AND BIT_E=1,BIT_RW=0,BIT_RS=0
		MOVWF	PORTC

		BCF		PORTC,BIT_E	;1 CYCLY
		MOVLW	B'11111000'	;DISPLAY CONTROL NIBBLE (DISP=ON,CURSOR=ON,BLINK=ON) AND BIT_E=1,BIT_RW=0,BIT_RS=0
		MOVWF	PORTC
		BCF		PORTC,BIT_E	;2 CYCLE	
		CALL	LCDBUSY		;CLEAR DISPLAY AND HOME CURSOR
		MOVLW	B'00001000'
		MOVWF	PORTC
		BCF		PORTC,BIT_E
		MOVLW	B'00011000'
		MOVWF	PORTC

		BCF		PORTC,BIT_E		
		CALL	LCDBUSY		;ENTRY SET - 
		MOVLW	B'00001000'	; BIT_E=1,BIT_RW=0,BIT_RS=0
		MOVWF	PORTC
		BCF		PORTC,BIT_E	;1 CYCLE
		MOVLW	B'01101000'	;ENTRY SET - INCREMENT,NO DISP SHIFT(CUR SHIFT),BIT_E=1,BIT_RW=0,BIT_RS=0
		MOVWF	PORTC
		BCF		PORTC,BIT_E	;2 CYCLE		
		RETURN
		
LCDBUSY
		BSF		STATUS,RP0	;SELLECT BANK 1
		MOVLW	B'11110000'
		MOVWF	TRISC		;SET RB7-RB4 INPUT
		BCF		STATUS,RP0	;SELLECT BANK 0		
		BSF		PORTC,BIT_RW
		BCF		PORTC,BIT_RS		
		BSF		PORTC,BIT_E
		MOVF	PORTC,W		;READ
		BCF		PORTC,BIT_E	;1 CYCLE complete
		BSF		PORTC,BIT_RW
		BCF		PORTC,BIT_RS
		BSF		PORTC,BIT_E
		NOP					;DO NOTTHING COZ BUSY FLAG IS IN FIRST NIBBLE
		BCF		PORTC,BIT_E	;2nd CYCLE complete		
		ANDLW	0x80
		BTFSS	STATUS,Z	;CHECK BUSY
		GOTO	LCDBUSY		;LOOP IF BUSY		
		BCF		PORTC,BIT_RW		;**
		BSF		STATUS,RP0		;NOT BUSY SO MAKE PORT B O/P
		MOVLW	0x000
		MOVWF	TRISC
		BCF		STATUS,RP0		
		RETURN		
;LCD COMMANDS--- i have written routines for only 2 basic commands,
				; one has to write routines for shifting display/crussor, home crussor etc.
				;it's easy just follow datasheet and i'll include it someday!
				
LINE2		;by selecting DDRAM address = 0x40 in case of 16x4 line LCD, see datasheet of HD44780
		MOVLW	B'11001000'
		MOVWF	PORTC
		BCF		PORTC,BIT_E
		MOVLW	B'00001000'
		MOVWF	PORTC
		BCF		PORTC,BIT_E
		RETURN		

LCDWRITE		;Writes data/character in W register to sellected CG/DD RAM, see its use in START routine
		MOVWF	TEMP
		CALL	LCDBUSY
		MOVF	TEMP,W
		ANDLW	B'11110000'
		IORLW	B'00001010'	;BIT_E=1,BIT_RW=0,BIT_RS=1
		MOVWF	PORTC
		BCF		PORTC,BIT_E	;1 CYCLE COMPLETE
		SWAPF	TEMP,W		;SWAP NIBBLES AND STORE IN W REGISTER
		ANDLW	B'11110000'
		IORLW	B'00001010'	;BIT_E=1,BIT_RW=0,BIT_RS=1
		MOVWF	PORTC
		BCF		PORTC,BIT_E	;2 CYCLE COMPLETE		
		RETURN

;Delay routines		
;500uS delay with 4MHz
DLY
    	MOVLW	D'165'              
    	MOVWF	V_DLY               
DLY_LOOP
    	DECFSZ	V_DLY, F           
    	GOTO	DLY_LOOP      
    	RETURN                     
; w times DLY
DLY1
    	MOVWF	V_DLY1            
DLY1_LOOP
    	CALL	DLY           
    	DECFSZ	V_DLY1, F         
    	GOTO	DLY1_LOOP     
    	RETURN                      
START
		CALL	INITPIC		;initialize PIC
		CALL	INITLCD		;initialize LCD				
		MOVLW	D'84'		;T	;Write to DDRAM which is displayed in LCD, DDRAM already sellected at initialization
		CALL	LCDWRITE	
		MOVLW	D'72'		;H
		CALL	LCDWRITE
		MOVLW	D'79'		;O
		CALL	LCDWRITE
		MOVLW	D'77'		;M
		CALL	LCDWRITE
		MOVLW	D'65'		;A
		CALL	LCDWRITE
		MOVLW	D'83'		;S 
		CALL	LCDWRITE 
		MOVLW	D'32'		;spatie
		CALL	LCDWRITE
		MOVLW	D'83'		;S
		CALL	LCDWRITE
		MOVLW	D'84'		;T
		CALL	LCDWRITE
		MOVLW	D'69'		;E
		CALL	LCDWRITE
		MOVLW	D'71'		;G
		CALL	LCDWRITE
		MOVLW	D'77'		;M
		CALL	LCDWRITE
		MOVLW	D'69'		;E
		CALL	LCDWRITE
		MOVLW	D'89'		;Y
		CALL	LCDWRITE
		MOVLW	D'69'		;E
		CALL	LCDWRITE
		MOVLW	D'82'		;R
		CALL	LCDWRITE
		CALL	LINE2		;set crussor to line 2
		MOVLW	D'84'		;T	;Write to DDRAM which is displayed in LCD, DDRAM already sellected at initialization
		CALL	LCDWRITE	
		MOVLW	D'72'		;H
		CALL	LCDWRITE
		MOVLW	D'79'		;O
		CALL	LCDWRITE
		MOVLW	D'77'		;M
		CALL	LCDWRITE
		MOVLW	D'65'		;A
		CALL	LCDWRITE
		MOVLW	D'83'		;S 
		CALL	LCDWRITE 
		MOVLW	D'32'		;spatie
		CALL	LCDWRITE
		MOVLW	D'83'		;S
		CALL	LCDWRITE
		MOVLW	D'84'		;T
		CALL	LCDWRITE
		MOVLW	D'69'		;E
		CALL	LCDWRITE
		MOVLW	D'71'		;G
		CALL	LCDWRITE
		MOVLW	D'77'		;M
		CALL	LCDWRITE
		MOVLW	D'69'		;E
		CALL	LCDWRITE
		MOVLW	D'89'		;Y
		CALL	LCDWRITE
		MOVLW	D'69'		;E
		CALL	LCDWRITE
		MOVLW	D'82'		;R
		CALL	LCDWRITE

LOOP	NOP	
		GOTO	LOOP	;endless loop
		
		END

Ik kan ook geen teksten op de 2de regel krijgen door spaties te gebuiken(dus bovenste deel helemaal vol). Daarom denk ik dat het aan de initialisatie van het aantal regels ligt. Het kan ook nog liggen aan het stuk: Line2. Mijn vraag is dus ook kan iemand fouten ontdekken in de code?(er zijn stukken van de code van internet)

Als je op de 2de lijn tekst wil krijgen moet je de pointer van het scherm op de 2de lijn zetten. Hier kan je best even de datasheet voor nalezen. De drivers durven soms al wel eens verschillen...

Met de schermen waar ik mee werk was het 0x40h... Zoals je doet...
Daarna zou ik ook even wachten tot het display klaar is
succes!

Soms zit de 2e regel op de plek van de 3e. De 2e (en 4e) is dan niet zichtbaar.
Dus probeer het eens op regel 3? (Ik weet de offset hiervan even niet uit mijn hoofd.)