;------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ;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