
DB0	EQU	P1.0
DB1	EQU	P1.1
DB2	EQU	P1.2
DB3	EQU	P1.3
DB4	EQU	P1.4
DB5	EQU	P1.5
DB6	EQU	P1.6
DB7	EQU	P1.7
EN	EQU	P3.7
RS	EQU	P3.6
RW	EQU	P3.5
DATA	EQU	P1

	SETB	RW
	CLR	EN
	SETB	EN

WAIT_LCD:
	CLR	EN		;Start LCD command
	CLR	RS		;It's a command
	SETB	RW		;It's a read command
	MOV	DATA,#0FFh	;Set all pins to FF initially
	SETB	EN		;Clock out command to LCD
	MOV	A,DATA		;Read the return value
	JB	ACC.7,WAIT_LCD	;If bit 7 high, LCD still busy
^------------------------^
should it be looping here?	

	CLR	EN		;Finish the command
	CLR	RW		;Turn off RW for future commands
	RET

	CLR	RS		<--- How does this ever get executed?
	MOV	DATA,#38h
	SETB	EN
	CLR	EN
	LCALL	WAIT_LCD

	CLR	RS
	MOV	DATA,#06h
	SETB	EN
	CLR	EN
	LCALL	WAIT_LCD

INIT_LCD:

	CLR	RS
	MOV	DATA,#38h
	SETB	EN
	CLR	EN
	LCALL	WAIT_LCD
	CLR	RS
	MOV	DATA,#0Eh
	SETB	EN
	CLR	EN
	LCALL	WAIT_LCD
	CLR	RS
	MOV	DATA,#06h
	SETB	EN
	CLR	EN
	LCALL	WAIT_LCD
	RET

CLEAR_LCD:
	CLR	RS
	MOV	DATA,#01h
	SETB	EN
	CLR	EN
	LCALL	WAIT_LCD
	RET

WRITE_TEXT:
	SETB	RS
	MOV	DATA,A
	SETB	EN
	CLR	EN
	LCALL	WAIT_LCD
	RET

	LCALL	INIT_LCD	<-- how does program get here?
	LCALL	CLEAR_LCD
	MOV	A,#'H'
	LCALL	WRITE_TEXT
	MOV	A,#'E'
	LCALL	WRITE_TEXT
	MOV	A,#'L'
	LCALL	WRITE_TEXT
	MOV	A,#'L'
	LCALL	WRITE_TEXT
	MOV	A,#'O'
	LCALL	WRITE_TEXT
	MOV	A,#' '
	LCALL	WRITE_TEXT
	MOV	A,#'W'
	LCALL	WRITE_TEXT
	MOV	A,#'O'
	LCALL	WRITE_TEXT
	MOV	A,#'R'
	LCALL	WRITE_TEXT
	MOV	A,#'L'
	LCALL	WRITE_TEXT
	MOV	A,#'D'
	LCALL	WRITE_TEXT

	CLR	RS
	MOV	DATA,#0C4h
	SETB	EN
	CLR	EN
	LCALL	WAIT_LCD

	LCALL	INIT_LCD
	LCALL	CLEAR_LCD
	MOV	A,#'H'
	LCALL	WRITE_TEXT
	MOV	A,#'E'
	LCALL	WRITE_TEXT
	MOV	A,#'L'
	LCALL	WRITE_TEXT
	MOV	A,#'L'
	LCALL	WRITE_TEXT
	MOV	A,#'O'
	LCALL	WRITE_TEXT
	CLR	RS
	MOV	DATA,#0C4h
	SETB	EN
	CLR	EN
	LCALL	WAIT_LCD
	MOV	A,#'W'
	LCALL	WRITE_TEXT
	MOV	A,#'O'
	LCALL	WRITE_TEXT
	MOV	A,#'R'
	LCALL	WRITE_TEXT
	MOV	A,#'L'
	LCALL	WRITE_TEXT
	MOV	A,#'D'
	LCALL	WRITE_TEXT

end 
