📄 myproj.asm
字号:
org 0000h
LJMP Main
org 0100h
SDA BIT P2.3 ;数据通信口
SCL BIT P2.4
SENDDAT DATA 34H
RECVDAT DATA 35H
RS EQU P2.2
RW EQU P2.1
E EQU P2.0
Main:
setb SCL
setb SDA
setb p0.0
call InitLCD
mov RECVDAT,#00H
mov SENDDAT,#99H
Repeat:
CALL WRITE
mov R6,#02H
;call DelayMs
CALL READ
call DispNum
jmp Repeat
;R0位置 R3字符
WriteByte: ;送单个字符
mov A,R0
add A,#80H
Call EnterI
mov A,R3
Call EnterD
ret
EnterI: ;送命令
Clr RS
CLR RW
SETB E
MOV P1,A
CLR E
Call Delay
RET
EnterD: ;送数据
SETB RS
CLR RW
SETB E
MOV P1,A
CLR E
Call Delay
RET
DispNum:
mov A,#80H
call EnterI
mov A,RECVDAT
anl A,#0f0H
swap A
add A,#30H
call EnterD
mov A,RECVDAT
anl A,#0fH
add A,#30H
call EnterD
ret
READ:
LCALL STA
MOV A,#0A0H
LCALL WRBYT
LCALL CACK
;JB F0,READ
MOV A,#00H
LCALL WRBYT
LCALL CACK
;JB F0,READ
LCALL STA
MOV A,#0A1H
LCALL WRBYT
LCALL CACK
;JB F0,READ
MOV R1,#RECVDAT
LCALL RDBYT
MOV @R1,A
LCALL MNACK
LCALL STOP
RET
WRITE:
LCALL STA
MOV A,#0A0H
LCALL WRBYT
LCALL CACK
;JB F0,WRITE
MOV A,#00H
LCALL WRBYT
LCALL CACK
;JB F0,WRITE
MOV R1,#SENDDAT
MOV A,@R1
LCALL WRBYT
LCALL CACK
;JB F0,WRITE
LCALL STOP
RET
STA:
SETB SDA ;启动(设SDA脚为SDA数据传输,设SCL为SCL时钟)
SETB SCL
CLR SDA
CLR SCL
RET
STOP:
CLR SDA;停止
SETB SCL
SETB SDA
RET
MNACK:
SETB SDA;发送非应答位
SETB SCL
CLR SCL
CLR SDA
RET
CACK:
CLR F0
SETB SDA;应答位检查子程序
SETB SCL
MOV C,SDA
JNC CEND
SETB F0
CEND:
CLR SCL
CLR SDA
RET
WRBYT:
MOV R3,#08H;发送一个字节数据子程序
WLP:
RLC A
mov SDA,C
SETB SCL
CLR SCL
CLR SDA
DJNZ R3,WLP
RET
RDBYT:
MOV A,#00H
CLR C
MOV R3,#08H ;从SDA上接受一个字节数据子程序(读入字节放入R7与A中)
SETB SDA
RLP:
SETB SCL
MOV C,SDA
RLC A
CLR SCL
DJNZ R3,RLP
CLR SDA
RET
Delay: ;延时子程序
mov r7,#2H
d1:mov r6,#255
d2:djnz r6,d2
djnz r7,d1
ret
;秒级延时子程序以130050us为单位,最大为130050us
DelaySs:
mov r6,#0ffh
ss:
mov r7,#0ffh
djnz r7,$
djnz r6,ss
djnz r5,DelaySs
ret
;毫秒延时子程序以510us为单位,最大为130050us
DelayMs:
mov r7,#0ffh
djnz r7,$
djnz r6,DelayMs
ret
;微秒延时以2us为单位,最大为510us
DelayUs:
djnz r7,$
ret
;----------------------------------
;初始化LCD夜晶并用软件复位
;----------------------------------
InitLCD:
MOV A,#038H
LCALL EnterI
LCALL LcdBUSY ;判忙
MOV A,#038H ;设置为8总线16*2 5*8点阵
LCALL EnterI
MOV A,#01H ;清屏
LCALL EnterI
MOV A,#06H ;设读写字符时地址加1,且整屏显示不移动
LCALL EnterI
MOV A,#0CH ;开显示,不开开光标显示,光标和光标所在的字符闪烁
LCALL EnterI
LCALL Delay
ret
;------------------------------------
;判忙子程序[用于判断LCD是否在忙于写入,如LCD在忙于别的事情,那就等LCD忙完后才操作]
;入口参数:无
;出口参数:无
;-------------------------------------
LcdBUSY:
PUSH ACC
CLR RS
SETB RW
TT0:
SETB E
MOV A,P1
CLR E
ANL A,#80H
JNZ TT0
POP ACC
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -