📄 lcd.a51
字号:
public ClearScreen
public _ShowHex
public _ShowText
;------------------------------------------
RS_PIN equ p3.0
RW_PIN equ p3.1
E_PIN equ p3.5
;------------------------------------------
?DT?_ShowHex?lcd segment data overlayable
rseg ?DT?_ShowHex?lcd
cBytesCount: ds 1
cRegBak1: ds 1
;------------------------------------------
?DT?_ShowText?LCDAsm segment data
rseg ?DT?_ShowText?LCDAsm
cXPos: ds 1
cYPos: ds 1
;------------------------------------------
LCDAsmCodeSeg segment code
rseg LCDAsmCodeSeg
_ShowHex:
; input:
; r7: address r5: bytes count
mov cBytesCount, r5
mov a, r7
mov r1, a
showhex_loop:
mov a, @r1
swap a
anl a, #0fh
clr c
subb a, #0ah
jc label2
add a, #'A'
sjmp label1
label2:
add a, #(0ah + '0')
label1:
mov cRegBak1, r1
lcall showchar
mov r1, cRegBak1
mov a, @r1
anl a, #0fh
clr c
subb a, #0ah
jc label4
add a, #'A'
sjmp label3
label4:
add a, #(0ah + '0')
label3:
mov cRegBak1, r1
lcall showchar
mov a, #' '
lcall showchar
mov r1, cRegBak1
inc r1
djnz cBytesCount, showhex_loop
ret
_ShowText:
; input:
; r6:r7 : text buffer pointer (in code)
mov DPL, r7
mov DPH, r6
mov b, #0
loop_show:
mov a, b
movc a, @a + dptr
inc b
jz showtext_quit
lcall showchar
sjmp loop_show
showtext_quit:
ret
ClearScreen:
lcall lcdreset
mov cXPos, #0
mov cYPos, #0
ret
showchar:
push acc
mov a, cXPos
mov r7, cYPos
cjne r7, #0, line2
sjmp setadr
line2:
add a, #040h
setadr:
orl a, #080h ;设置ddram地址
lcall lcdwc
pop acc
lcall lcdwd ;写字符
inc cXPos
mov a, cXPos
cjne a, #10h, showchar_quit
inc cYPos
mov cXPos, #0
showchar_quit:
ret
lcdreset: ;初始化程序
clr E_PIN
call delay5ms ;延时15ms
call delay5ms
call delay5ms
mov a,#38h ;显示模式设置(不检测忙信号)
call lcdwcn ;共三次
call delay5ms
mov a,#38h
call lcdwcn
call delay5ms
mov a,#38h
call lcdwcn
mov a,#38h ;显示模式设置(以后均检测忙信号)
call lcdwc
mov a,#08h ;显示关闭
call lcdwc
mov a,#01h ;显示清屏
call lcdwc
mov a,#06h ;显示光标移动设置
call lcdwc
mov a,#0ch ;显示开及光标设置
call lcdwc
ret
lcdwc: ;送控制字子程序(检测忙信号)
call waitidle
lcdwcn: ;送控制字子程序(不检测忙信号)
clr RS_PIN ;rs=0 rw=0 e=高脉冲
clr RW_PIN
mov p1,a
setb E_PIN
nop
clr E_PIN
ret
lcdwd: ;写字符子程序
call waitidle
setb RS_PIN ;rs=1 rw=0 e=高脉冲
clr RW_PIN
mov p1,a
setb E_PIN
nop
clr E_PIN
ret
waitidle:
push acc ;正常读写操作之前必须检测lcd控制器状态
mov p1,#0ffh
clr RS_PIN ;rs=0 rw=1 e=高电平
setb RW_PIN
setb E_PIN
wtd_pa:
nop ;db7: 0 lcd控制器空闲
jb p1.7,wtd_pa ; 1 lcd控制器忙
clr E_PIN
pop acc
ret
delay5ms:
mov r1,#25 ;延时子程序(5ms)
dl5_pa:
mov r2,#100
djnz r2,$
djnz r1,dl5_pa
ret
delay400ms:
mov r0,#20 ;延时子程序(400ms)
dl4_pa:
mov r1,#100
dl4_pb:
mov r2,#100
djnz r2,$
djnz r1,dl4_pb
djnz r0,dl4_pa
ret
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -