?? lcm.asm
字號(hào):
;LCD模塊處理程序
;RWLCDM -- 讀寫(xiě)字符型LCD模塊
;Input: B.1 -- RS, B.0 -- RW(RW=1 read, RW=0 write)
; A -- byte want to write into LCD (only available at write mode)
;Output: A -- byte read from LCD (only available at read mode)
;A, PSW not protected
PROC RWLCDM
RWLCDM:
CLR EN
MOV C, B.0
MOV RW, C ;SET R/W BIT
MOV C, B.1
MOV RS, C ;SET REGISTER SELECTION BIT
MOV PORTL, #0FFH
SETB EN
JB B.0, POS1
MOV PORTL, A ;WRITE TO LCD
CLR EN
RET
POS1: MOV A, PORTL ;READ FROM LCD
CLR EN
RET
END
;DOLCDON -- 開(kāi)顯示
;影響寄存器: A, B, PSW
PROC DOLCDON
DOLCDON:
MOV B, #00H
MOV A, #0CH
CALL RWLCDM
CALL WAITBF
RET
END
;DOLCDOFF -- 關(guān)顯示
;影響寄存器: A, B, PSW
PROC DOLCDOFF
DOLCDOFF:
MOV B, #00H
MOV A, #08H
CALL RWLCDM
CALL WAITBF
RET
END
;DOFUNCREG -- 設(shè)置功能寄存器
PROC DOFUNCREG
DOFUNCREG:
MOV B, #00H
MOV A, #38H
CALL RWLCDM ;置DL為1(8位接口),N=1(2行顯示),F=0(5*7點(diǎn)陣)
RET
END
;INITLCM -- LCM的上電初始化
PROC INITLCM
INITLCM:
MOV R6, #20
CALL DELAY ;延時(shí)20ms
CALL DOFUNCREG
MOV R6, #08
CALL DELAY ;置DL為1并等待8ms
CALL DOFUNCREG
MOV R6, #01
CALL DELAY ;置DL為1并等待1ms
CALL DOFUNCREG
CALL WAITBF ;置DL為1
CALL DOFUNCREG
CALL WAITBF ;置功能寄存器
CALL DOLCDOFF ;關(guān)顯示,關(guān)光標(biāo),不閃爍
MOV B, #00H
MOV A, #01H
CALL RWLCDM
CALL WAITBF ;清屏
MOV B, #00H
MOV A, #06H
CALL RWLCDM ;I/D=1, S=0
CALL WAITBF ;增量方式, 整體顯示不移動(dòng)
MOV B, #00H
MOV A, #14H
CALL RWLCDM ;S/C=0,R/L=1
CALL WAITBF ;光標(biāo)移動(dòng),右移
CALL DOLCDON ;開(kāi)顯示
RET
END
;WAITBF -- 等待直到BUSY FLAG不忙
;影響寄存器: A, B, PSW
PROC WAITBF
WAITBF:
MOV B, #01H ;讀狀態(tài)寄存器
LOOP: CALL RWLCDM
JB ACC.7, LOOP
RET
END
;DRAWRAM
;將RAM中存放的字符串寫(xiě)入LCDM中
;入口: R1為RAM中字符串起始地址
; R2為要寫(xiě)入的字符個(gè)數(shù), A為L(zhǎng)CDM中DDRAM起始地址
;出口: 無(wú)
;影響寄存器: A, B, PSW, R1, R2, R3
PROC DRAWRAM
DRAWRAM:
MOV R3, A
MOV B, #00H
SETB ACC.7
CALL RWLCDM
CALL WAITBF ;寫(xiě)入DDRAM地址
LPB: CLR C
MOV A, R3
SUBB A, #08H
JC JPUP
MOV B, #00H
MOV A, R3 ;DDRAM地址大于等于8
ADD A, #38H
SETB ACC.7
CALL RWLCDM
CALL WAITBF ;重新寫(xiě)入DDRAM地址
LPU: MOV B, #02H
MOV A, @R1
CALL RWLCDM
CALL WAITBF ;寫(xiě)入數(shù)據(jù)
INC R1
DJNZ R2, LPU
RET
JPUP: MOV B, #02H ;DDRAM地址小于8
MOV A, @R1
CALL RWLCDM
CALL WAITBF
INC R1
INC R3
DJNZ R2, LPB
RET
END
;DRAWROM
;將ROM中存放的字符串寫(xiě)入LCDM中
;入口: DPTR為ROM中字符串的起始地址
; R2為要寫(xiě)入的字符個(gè)數(shù), A為L(zhǎng)CDM中DDRAM起始地址
;出口: 無(wú)
;影響寄存器: A, B, PSW, DPTR, R2, R3
PROC DRAWROM
DRAWROM:
MOV R3, A
MOV B, #00H
SETB ACC.7
CALL RWLCDM
CALL WAITBF ;寫(xiě)入DDRAM地址
LPB: CLR C
MOV A, R3
SUBB A, #08H
JC JPUP
MOV B, #00H
MOV A, R3 ;DDRAM地址大于等于8
ADD A, #38H
SETB ACC.7
CALL RWLCDM
CALL WAITBF ;重新寫(xiě)入DDRAM地址
LPU: MOV B, #02H
CLR A
MOVC A, @A+DPTR
CALL RWLCDM
CALL WAITBF ;寫(xiě)入數(shù)據(jù)
INC DPTR
DJNZ R2, LPU
RET
JPUP: MOV B, #02H ;DDRAM地址小于8
CLR A
MOVC A, @A+DPTR
CALL RWLCDM
CALL WAITBF
INC DPTR
INC R3
DJNZ R2, LPB
RET
END
;CLEARN -- 將LCM上若干個(gè)字符填為某一值
;入口: R2為要清除的字符個(gè)數(shù), A為L(zhǎng)CM中DDRAM的起始地址, R3為字符
;出口: 無(wú)
;影響寄存器: A, B, PSW, R2
PROC CLEARN
CLEARN:
CLR C
SUBB A, #08H
JC LPU
ADD A, #40H
SJMP PROS
LPU: ADD A, #08H
PROS: MOV B, #00H ;寫(xiě)指令寄存器
SETB ACC.7
CALL RWLCDM
CALL WAITBF
LOOP: MOV B, #02H ;寫(xiě)數(shù)據(jù)寄存器
MOV A, R3 ;空格
CALL RWLCDM
CALL WAITBF
DJNZ R2, LOOP
RET
END
;FILLDISPBUF
;將16位二進(jìn)制數(shù)轉(zhuǎn)為4位十進(jìn)制ASCII碼數(shù), 并填入顯示緩沖區(qū)中
;入口: R0指向要轉(zhuǎn)換的16位二進(jìn)制字, R1指向顯示緩沖區(qū)
;出口: @R1為顯示緩沖區(qū), 不保留原16位數(shù)(@R0)
;影響寄存器: B, R2, PSW, DSPNEG, @R0, R3
PROC FILLDISPBUF
FILLDISPBUF:
INC R0
MOV A, @R0
DEC R0
MOV C, ACC.7
MOV DSPNEG, C ;取符號(hào)位
JNC TP1
CALL NEG16 ;如果是負(fù)數(shù)則求補(bǔ)
TP1: MOV A, #0AH
CALL DIV16_4
JNB DSPNEG, FTP1
MOV CTEMP, #LOW(100)
MOV CTEMP+1, #HIGH(100)
JMP FTP2
FTP1: MOV CTEMP, #LOW(1000)
MOV CTEMP+1, #HIGH(1000)
FTP2: MOV A, R1
MOV R3, A
MOV R1, #CTEMP
CALL CMPR0R1
MOV A, R3
MOV R1, A
JC FTP3
INC R1 ;有小數(shù)點(diǎn)
INC R1
INC R1
MOV A, #0AH
CALL DIV16_4
ADD A, #30H
MOV @R1, A
DEC R1
MOV @R1, #2EH
DEC R1
MOV R3, #02H
LOOP2: MOV A, #0AH
CALL DIV16_4
ADD A, #30H
MOV @R1, A
DEC R1
DJNZ R3, LOOP2 ;將3位原碼填入緩沖區(qū)
INC R1
JNB DSPNEG, TTP3
MOV @R1, #2DH
RET
TTP3: CJNE @R1, #30H, TTP4
MOV @R1, #20H
TTP4: RET
FTP3: ;無(wú)小數(shù)點(diǎn)
MOV A, #0AH
CALL DIV16_4
INC R1
INC R1
INC R1
MOV R3, #03H
LOOP1: MOV A, #0AH
CALL DIV16_4
ADD A, #30H
MOV @R1, A
DEC R1
DJNZ R3, LOOP1 ;將3位原碼填入緩沖區(qū)
JNB DSPNEG, TTP1
INC R1
CJNE @R1, #30H, TTP2
MOV @R1, #2DH
DEC R1
TTP1: MOV @R1, #20H
RET
TTP2: DEC R1
MOV @R1, #2DH
RET
END
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -