
; X-tal @ 12 MHz
#include 8051.H
DATA	.equ	0A0H		;P2

RS	.equ	0A3H		;P2.3
EN	.equ	0A0H		;P2.0

         .org 0000H

Main	acall	INIT_LCD		; initialise
run	MOV	A,	#'H'
	ACALL	WRITE_TEXT
	MOV	A,	#'E'
	ACALL	WRITE_TEXT
	MOV	A,	#'L'
	ACALL	WRITE_TEXT
	MOV	A,	#'L'
	ACALL	WRITE_TEXT
	MOV	A,	#'O'
	ACALL	WRITE_TEXT

	MOV	A,	#'W'
	ACALL	WRITE_TEXT
	MOV	A,	#'O'
	ACALL	WRITE_TEXT
	MOV	A,	#'R'
	ACALL	WRITE_TEXT
	MOV	A,	#'L'
	ACALL	WRITE_TEXT
	MOV	A,	#'D'
	ACALL	WRITE_TEXT
	sjmp	$


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	DATA,	#030h	; set to 8 bit interface, only D4-D7 connected
	SETB	EN
	NOP
	CLR	EN

;-------4.1 ms Delay-----------	
	MOV	R5,	#082
INIT2	ACALL	Delay50us
	DJNZ	R5,	INIT2

;-------FUnction Set 8bit-----------------
	CLR	RS
	MOV	DATA,	#030h	; set to 8 bit interface, only D4-D7 connected
	SETB	EN
	NOP
	CLR	EN

;-------100us Delay------------
	ACALL	Delay50us
	ACALL	Delay50us

;-------FUnction Set 8bit-----------------
	CLR	RS
	MOV	DATA,	#030h	; set to 8 bit interface, only D4-D7 connected
	SETB	EN
	NOP
	CLR	EN
	ACALL	Delay50us

;-------FUnction Set 4bit-----------------
	CLR	RS
	MOV	DATA,	#020h	; set to 4 bit interface, only D4-D7 connected
	SETB	EN
	NOP
	CLR	EN
	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
	PUSH  	ACC           	;Save A for low nibble
	MOV	B,	DATA	;					DDDDCCCC
	ORL   	B,	#0F0h	;bits 7..4 <- 1, clear msn		xxxxCCCC
	ORL   	A,	#00Fh	;Don't affect bits 0-3, clear lsn 	7654xxxx
	ANL   	DATA,	A	;High nibble to display			7654CCCC
	CLR	RS
	SETB  	EN 
	NOP
	CLR   	EN 
	POP   	ACC		;Prepare to send			DDDDCCCC
	SWAP	A		;					32107654
	MOV	B,	DATA	;					DDDDCCCC
	ORL   	B,	#0F0h	;bits 7..4 <- 1, clear msn		xxxxCCCC
	ORL   	A,	#00Fh	;Don't affect bits 0-3, clear lsn 	3210xxxx
	ANL   	DATA,	A	;High nibble to display			3210CCCC
	CLR	RS
	SETB  	EN 
	NOP
	CLR   	EN 
	ACALL	Delay50us
	RET

WRITE_TEXT
	PUSH  	ACC           	;Save A for low nibble
	MOV	B,	DATA	;					DDDDCCCC
	ORL   	B,	#0F0h	;bits 7..4 <- 1, clear msn		xxxxCCCC
	ORL   	A,	#00Fh	;Don't affect bits 0-3, clear lsn 	7654xxxx
	ANL   	DATA,	A	;High nibble to display			7654CCCC
	SETB	RS
	SETB  	EN 
	NOP
	CLR   	EN 
	POP   	ACC		;Prepare to send			DDDDCCCC
	SWAP	A		;					32107654
	MOV	B,	DATA	;					DDDDCCCC
	ORL   	B,	#0F0h	;bits 7..4 <- 1, clear msn		xxxxCCCC
	ORL   	A,	#00Fh	;Don't affect bits 0-3, clear lsn 	3210xxxx
	ANL   	DATA,	A	;High nibble to display			3210CCCC
	SETB	RS
	SETB  	EN 
	NOP
	CLR   	EN 
	ACALL	Delay50us
	CPL	P3.3
	RET

	.end
