...
$MOD52


;;;;;;ports for lcd ;;;;;;;
		EN EQU P1.2 
		RS EQU P1.0 
		RW EQU P1.1 
		LCD_DATA EQU P0
     
; Program start

; start timer 1 and then start serial rx in mode 1
start:
    LCALL INIT_LCD
    LCALL CLEAR_LCD
    mov  dptr,#0
    mov  dptr,#WelcomeText
    lcall loop
    sjmp stop

Loop:
   clr  a
   movc a,@a+dptr
   inc  dptr
   jz    WriteStringEnd
   call WRITE_TEXT
   sjmp loop
WriteStringEnd:
   ret
stop: sjmp stop
;;;;;;;lcd routines ;;;;;; 

WAIT_LCD:


		MOV		R1,#1H		; 
SEC_LOOP:
		MOV		TH0,#00H	; CLEAR TIMER 0
		MOV		TL0,#00H
		CLR		TF0			; CLEAR OVERFLOW BIT
		SETB	TR0			; START TIMER 0
		JNB		TF0,$		; WAIT FOR OVERFLOW FLAG
		CLR		TR0			; STOP TIMER 0
		
		
		
		DJNZ	R1,SEC_LOOP


RET

      

WAIT_LCD2:


		MOV		R1,#16H		; 
SEC_LOOP2:
		MOV		TH0,#00H	; CLEAR TIMER 0
		MOV		TL0,#00H
		CLR		TF0			; CLEAR OVERFLOW BIT
		SETB	TR0			; START TIMER 0
		JNB		TF0,$		; WAIT FOR OVERFLOW FLAG
		CLR		TR0			; STOP TIMER 0
		
		
		
		DJNZ	R1,SEC_LOOP2

       RET

INIT_LCD:
       LCALL WAIT_LCD2
       CLR RS
       CLR RW
       MOV LCD_DATA,#38h
       SETB EN
       CLR EN
       LCALL WAIT_LCD
       CLR RS
       CLR RW
       MOV LCD_DATA,#0Eh
       SETB EN
       CLR EN
       LCALL WAIT_LCD
       CLR RS
       CLR RW
       MOV LCD_DATA,#06h
       SETB EN
       CLR EN
       LCALL WAIT_LCD
       RET


CLEAR_LCD:

       CLR RS
       CLR RW
       MOV LCD_DATA,#01h
       SETB EN
       CLR EN
       LCALL WAIT_LCD
       RET
				
WRITE_TEXT:

       SETB RS
       MOV LCD_DATA,A
       SETB EN
       CLR EN
       LCALL WAIT_LCD
       RET
				
WelcomeText:
db 'abcdefghijklmnopqrstuvwxyz',0	
		




endloop:
       jmp endloop


END 