
org 0000h
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
MOV A,#' '

WRITE_TEXT:	SETB p2.1 ; RS = p2.1
MOV p1,A
SETB p2.2                 ; EN = p2.2
CLR p2.2
LCALL WAIT_LCD
RET

CLEAR_LCD:	CLR p2.1
MOV p1,#01h
SETB p2.2
CLR p2.2
LCALL WAIT_LCD
RET

INIT_LCD:		CLR p2.1
MOV p1,#38h
SETB p2.2
CLR p2.2
LCALL WAIT_LCD
CLR p2.1
MOV p1,#0Eh
SETB p2.2
CLR p2.2
LCALL WAIT_LCD
CLR p2.1
MOV p1,#06h
SETB p2.2
CLR p2.2
LCALL WAIT_LCD
RET

WAIT_LCD:	CLR EN ;Start LCD command
CLR p2.1 ;It's a command
SETB p2.3 ;It's a read command, R/w = p2.3
MOV p1,#0FFh ;Set all pins to FF initially
SETB p2.2 ;Clock out command to LCD
MOV A,p1 ;Read the return value
JB ACC.7,WAIT_LCD ;If bit 7 high, LCD still busy
CLR p2.2 ;Finish the command
CLR p2.3 ;Turn off RW for future commands
RET
