📄 8bit.asm
字号:
;------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
;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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -