
LCD_DAT	equ	0A0H		;P2

RS	equ	0A3H		;P2.3
EN	equ	0A0H		;P2.0


Delay50us:			;1+1+R7*2+2 MC =1+1+23*2+2 = 50 MC = 50 us
	MOV	R7,	#023	;1 MC	
	NOP			;1 MC
	DJNZ	R7,	$	;R7*2 MC
	RET			;2 MC


INIT_LCD:
;-------15 ms Startup Delay---------------
	MOV	R5,	#0150
INIT1:
	ACALL	Delay50us
	ACALL	Delay50us
	DJNZ	R5,	INIT1

;-------FUnction Set 8bit-----------------
	CLR	RS
	MOV	A,	#030h	; set to 8 bit interface, only D4-D7 connected
	acall	wr_nibble

;-------4.1 ms Delay-----------	
	MOV	R5,	#082
INIT2:
	ACALL	Delay50us
	DJNZ	R5,	INIT2

;-------FUnction Set 8bit-----------------
	MOV	A,	#030h	; set to 8 bit interface, only D4-D7 connected
	acall	wr_nibble

;-------100us Delay------------
	ACALL	Delay50us
	ACALL	Delay50us

;-------FUnction Set 8bit-----------------
;	MOV	A,	#030h	; set to 8 bit interface, only D4-D7 connected
	acall	wr_nibble
	ACALL	Delay50us

;-------FUnction Set 4bit-----------------
	MOV	A,	#020h	; set to 4 bit interface, only D4-D7 connected
	acall	wr_nibble
	ACALL	Delay50us

;-------Normal settings-------------------
	MOV	A,	#028h	; function set: 4bits, 2 lines, 5x8 dots	
	ACALL	WRITE_CMD
	MOV	A,	#0Eh	; display on/off control: Display on, cursor on, blinking off
	ACALL	WRITE_CMD
	MOV	A,	#06h	; entry mode set: increcement	
	ACALL	WRITE_CMD
	MOV	A,	#01h	; clear display
	ACALL	WRITE_CMD
	RET

WRITE_CMD:
	clr	rs		;rs = 0
	sjmp	wr_byte

WRITE_TEXT:
	setb	rs		;rs = 1
wr_byte:
	acall	wr_nibble	;d7..d4
	swap	a		;reverse nibbles
	acall	wr_nibble	;d3..d0
	ajmp	delay50us

wr_nibble:
	push	acc
	anl	LCD_DAT, #0Fh	;clear D7..D4
	anl	a, #0F0h	;mask LCD bits
	orl	LCD_DAT, a	;set LCD
	setb	en
	pop	acc		;restore ACC
	clr	en
	ret

end

