;--------------------------------------------------------------
;---------------------------------------------------------------
;------------------------------------------------------
;Author: Ashwin.V
;Country:India
;Code:LCD interface in 8bit mode
;CPU:At89c51@11.0592Mhz
;Tips:All you need to do is call the line where you want to display the message,
;mov the charecter to lcd_data and call datw.
;If you want to display a string, move the address of the hardcodded string into dptr and call datw.
;---------------------------------------------------------------------------
;---------------------------------------------------------------------------
RS EQU P3.0
EN EQU P3.1
lcd_data DATA 30h
org 0000h
ljmp lcd8_main
org 0030h
;___________________________________________________________________________
;------------------------------delay subroutines----------------------------
;___________________________________________________________________________
;------------------------------100us delay----------------------------------
delay_100us:
push 00h
mov r0,#46
delay_100us_loop:
djnz r1,delay_100us_loop
pop 00h
ret
;------------------------------16ms delay----------------------------------
delay_16ms:
push 00h
push 01h
mov r0,#30
delay_16ms_loop1:
mov r1,#255
delay_16ms_loop2:
djnz r1,delay_16ms_loop2
djnz r0,delay_16ms_loop1
pop 01h
pop 00h
ret
;--------------------------half second delay-------------------------------
delay_half_second:
push 00h
push 01h
push 02h
mov r2,#0ah
delay_half_second1:
mov r1,#64h
delay_half_second2:
mov r0,#0ffh
back:
djnz r0,back
djnz r1, delay_half_second2
djnz r2,delay_half_second1
pop 02h
pop 01h
pop 00h
ret
;_________________________________________________________________
;----------------message definition and display-------------------
;_________________________________________________________________
disp_message:
push acc
push 00h
mov r0,#17 ; maximum of 16charecters on lcd display
disp_message_loop1:
mov a,#00h ; reset accumulator
movc a,@a+dptr
djnz r0,disp_message_loop2
pop 00h
pop acc
ret
disp_message_loop2:
mov lcd_data,a
acall datw
acall delay_100us
inc dptr
sjmp disp_message_loop1
disp_ashwin:
DB " Hello ashwin "
disp_testing:
DB "Testing 4bit LCD"
disp_initialising:
DB "Initialising...."
disp_ready:
DB " 4bit LCD ready "
disp_clear:
DB " "
;___________________________________________________________________________
;--------------------command and data write subroutines---------------------
;___________________________________________________________________________
cmdw:
push acc
mov a,lcd_data
mov p0,a
clr rs
setb en
clr en
pop acc
ret
datw:
push acc
mov a,lcd_data
mov p0,a
setb rs
setb en
clr en
pop acc
ret
;___________________________________________________________________________
;--------------------------line select subroutines--------------------------
;___________________________________________________________________________
line1:
mov lcd_data,#80h ;initial position of cursor
acall cmdw
acall delay_100us
ret
line2:
mov lcd_data,#0c0h ;initial position of cursor
acall cmdw
acall delay_100us
ret
;___________________________________________________________________________
;----------------------lcd initialisation subroutine------------------------
;___________________________________________________________________________
lcd8_initialise:
acall delay_16ms ;wait more than 15ms after vdd reaches 4.5v
mov lcd_data,#38h ;2line 5x7 matrix
acall cmdw
acall delay_100us
mov lcd_data,#0fh ;display on, cursor on, cursor blinking
acall cmdw
acall delay_100us
mov lcd_data,#01h ;clear screen
acall cmdw
acall delay_100us
mov lcd_data,#06h ;cursor and display shifts(right/left)
acall cmdw
acall delay_100us
ret
;___________________________________________________________________________
;-------------------------------lcd main code-------------------------------
;___________________________________________________________________________
lcd8_main:
mov p0,#00h
clr RS ;make out pins
clr EN ;make out pins
mov IE,#00h
acall lcd8_initialise
;---------------------------------------------------------------------------
acall line1
mov dptr,#disp_initialising
acall disp_message
acall delay_half_second
acall delay_half_second
acall delay_half_second
acall delay_half_second
lcall line2 #
mov dptr,#disp_ready
acall disp_message
acall delay_half_second
acall delay_half_second
acall delay_half_second
acall delay_half_second
lcall line1
mov dptr,#disp_testing
acall disp_message
acall delay_half_second
acall delay_half_second
lcd8_loop:
acall line2
mov dptr,#disp_clear
acall disp_message
acall line2
mov lcd_data,#'a'
acall datw
acall delay_half_second
mov lcd_data,#'b'
acall datw
acall delay_half_second
mov lcd_data,#'c'
lcall datw
acall delay_half_second
mov lcd_data,#'d'
lcall datw
acall delay_half_second
acall line2
mov dptr,#disp_ashwin
lcall disp_message
acall delay_half_second
acall delay_half_second
sjmp lcd8_loop
end