?? 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 + -