📄 lcdsub.asm
字号:
; CALL FUNCTION:
; USING PARMENTERS: A - THE DATA OF TURN SET
; COMMON DATA USED:
; CHANGE REGISTER: DPTR
; RETURN: NONE
;------------------------------------------------------------
LCD_CURSOR_TURN:
PUSH ACC
MOV DPTR, #Addr_LCD_CMD ; SET #ADDR_LCD_CMD
JZ OffDisp
MOV A, #cLCD_ON_CMD
JMP OutTurnC
OffDisp: MOV A, #cLCD_OFF_CMD
OutTurnC: MOVX @DPTR, A
DEC DPH ; SET #Addr_LCD_DAT
POP ACC
MOVX @DPTR, A
RET
;#############################################################
; FILE NAME LCDSUB.ASM
; SUBROUTE: LCD_SET_POSITION - MOVE THE POINTER TO THE GAVEN POSITION
; CALL FUNCTION:
; USING PARMENTERS: R5 - THE BYTE OFFSET IN STRING
; dFLD_R4 - THE ROW OF START POSITION
; dFLD_R3 - THE COL OF START POSITION
;
; COMMON DATA USED:
; CHANGE REGISTER: C, A, R2, R3, R4, R5, R6, R7
; RETURN: NONE
;------------------------------------------------------------
LCD_SET_POSITION:
MOV A, dFLD_R4
JNB bLCD_DOTOUT, PointCol
MOV B, dLCD_PTN_LINE
MUL AB
PointCol: MOV B, dLCD_BYTES_ROW
MUL AB
MOV R4, A
MOV A, dFLD_R3 ; THE FRIST ADD NO CARRY SET
ADD A, R5
ADD A, R4
MOV R3, A
CLR A
JB bLCD_ACTSCREEN, AddrSet
MOV A, #40H ; FOR DRAM
AddrSet: ADDC A, B
MOV R4, A
MOV DPTR, #Addr_LCD_CMD ; SET #ADDR_LCD_CMD
MOV A, #cLCD_ON_CMD
MOVX @DPTR, A
DEC DPH
MOV A, #cLCD_CSR_OFF_DAT ; DISPLAY ON & CURSOR OFF
MOVX @DPTR, A
INC DPH
MOV A, #cLCD_SET_DOWN_CSR_CMD
MOVX @DPTR, A
MOV A, #cLCD_SET_CSRADDR_CMD
MOVX @DPTR, A
DEC DPH ; SET #ADDR_LCD_DAT
MOV A, R3
MOVX @DPTR, A ; SET THE LOW ADDRESS OF CURSOR POINTER
MOV A, R4
MOVX @DPTR, A ; SET THE HIGH ADDRESS OF CURSOR POINTER
RET
;#############################################################
; FILE NAME LCDSUB.ASM
; SUBROUTE: LCDBLKLCR - CLEAR ONE BLOCK LCD IN ONE LINE
; CALL FUNCTION: None
; USING PARMENTERS: R5 - THE NUMBER OF PATTEN WILL BE CLEAR
; dFLD_R4 - THE ROW NUMBER IN SCREEN
; dFLD_R3 - THE COLLOM IN SCREEN
;
; PATTEN -- 定议为一字符所显示区域的大小或一汉字显示区域大小的一半
;? THE ZOOM THAT ONE ASCII CAN DISPLAY OR THE HALF OF CHINESE WORD DISPLAY
; COMMON DATA USED:
; CHANGE REGISTER: C, A, B, R3, R4, R5, R6, R7
; RETURN: NONE
; Change Record:
; 1999/9/19 - write this subroute
;------------------------------------------------------------
PROC LCDBLKCLR
LCDBLKCLR: MOV A, dFLD_R4
JB bLCD_DOTOUT, ForOutD
MOV B, dLCD_PTN_LINE ; GET DOT LINES
MUL AB
ForOutD: MOV B, #dLCD_BYTES_ROW
MUL AB
ADD A, dFLD_R3 ; ** AS 8 DOT IN ONE LINE FOR PATTEN
MOV R3, A
CLR A
JB bLCD_ACTSCREEN, PointOut
MOV A, #40H
PointOut: ADDC A, B
MOV R4, A
MOV DPTR, #Addr_LCD_CMD ; SET #ADDR_LCD_CMD
MOV A, #cLCD_SET_RIGHT_CSR_CMD
MOVX @DPTR, A
MOV A, #cLCD_SET_CSRADDR_CMD
MOVX @DPTR, A
DEC DPH ; SET #ADDR_LCD_DAT
MOV A, R3
MOVX @DPTR, A ; SET THE LOW ADDRESS OF CURSOR POINTER
MOV A, R4
MOVX @DPTR, A ; SET THE HIGH ADDRESS OF CURSOR POINTER
INC DPH
JB bLCD_DOTOUT, ForDotC
MOV A, #cLCD_WRITE_RAM_CMD
MOVX @DPTR, A
DEC DPH ; SET #ADDR_LCD_DAT
DLCDTXTC: MOV A, #cSPACE
MOVX @DPTR, A ; OUTPUT SPACE IN TEXT MODE
DJNZ R5, DLCDTXTC
RET
ForDotC: MOV R7, dLCD_PTN_LINE
NextLine: MOV A, #cLCD_WRITE_RAM_CMD
MOVX @DPTR, A
DEC DPH ; SET #ADDR_LCD_DAT
MOV A, R5
MOV R6, A
NextClear: CLR A
MOVX @DPTR, A ; CLEAR THE RAM
DJNZ R6, NextClear
INC DPH
MOV A, #cLCD_SET_CSRADDR_CMD
MOVX @DPTR, A
DEC DPH ; SET #ADDR_LCD_DAT
MOV A, dLCD_BYTES_ROW
ADD A, R3
MOVX @DPTR, A ; SET THE LOW BYTE OF CURSOR
MOV R3, A
CLR A
ADDC A, R4
MOVX @DPTR, A ; SET THE HIGH BYTE OF CURSOR
MOV R4, A
INC DPH
DJNZ R7, NextLine
RET
END
;#############################################################
; FILE NAME LCDSUB.ASM
; SUBROUTE: LCD_WTR_STR - OUTPUT ONE ASCII OR WORD IN TEXT MODE
; CALL FUNCTION:
; USING PARMENTERS: R1 - POINTER TO STRING FOR OUTPUT
; R7 - THE NUMBER OF WORD
; dFLD_R3 - THE ROW OF START POSITION
; dFLD_R4 - THE COL OF START POSITION
; dFLD_R5 - THE EFFICENT OF OUTPUT
; COMMON DATA USED:
; CHANGE REGISTER: C, A, B, R1, R2, R3, R4, R5, R6, R7
; bUSE1 - FOR RIGHT LINE
; bUSE2 - FOR UP or DOWN LINE
; bUSE3 - FOR CHINESE (1) or CHAR (0) PATTEN
; RETURN: NONE
;------------------------------------------------------------
PROC LCD_WTR_STR
LCD_WTR_STR:MOV A, dFLD_R5
RLC A
MOV bLCD_RTLINE, C
RLC A
MOV bLCD_LTLINE, C
RLC A
MOV bLCD_UPLINE, C
RLC A
MOV bLCD_DNLINE, C
RLC A
MOV bLCD_LENGTH, C
RLC A
MOV bLCD_DECOUT, C
RLC A
MOV bLCD_REVERSE, C
CLR bUSE1
CLR bUSE2
MOV R5, #0 ; INITIALIZE OFFSET OF BYTE FROM START
NextChar: MOV A, R7 ; FOR NEXT CHAR
JZ EndOutC
DJNZ R7, CharOut
MOV C, bLCD_RTLINE ; FOR RIGHT LINE DRAW
MOV bUSE1, C ;
CharOut: MOVX A, @R1 ; GET THE CHAR CODE
INC R1 ; FOR NEXT CHAR
JZ ForStrEnd
CJNE A, #0FH, IsBytOut ; DOT OUTPUT
SETB bLCD_DOTOUT
JMP NextChar
IsBytOut: CJNE A, #0EH, ForBytOut ; ASCII OUTPUT
CLR bLCD_DOTOUT
JMP NextChar
EndOutC: RET
ForStrEnd: JNB bLCD_LENGTH, EndOutC
DEC R1 ; NOT FOR NEXT
MOV A, #cSPACE ; STRING END DISABLE
ForBytOut: JB bLCD_DOTOUT, ForDotW
MOV DPTR, #Addr_LCD_CMD
PUSH ACC
MOV A, #cLCD_WRITE_RAM_CMD ; = 42H WRITE DATA & INCREASE ADDR.
MOVX @DPTR, A
DEC DPH
POP ACC
MOVX @DPTR, A
INC R5
JMP NextChar
ForDotW: CJNE A, #cMINPARTA, IsPage
IsPage: JNC OutChar
DEC A
SWAP A ; 16*PAGE_NUMBER
MOV dDOTPAGE, A ; CHANGE THE PAGE NUMBER
INC R7 ;%%%
JMP NextChar
OutChar: CJNE A, #cMINPARTB, IsPartB
IsPartB: JC IsPartA
MOV R6, #20H ; CHINESE WORD 20H BYTES DOT ARRY
DJNZ R7, C_Word
MOV C, bLCD_RTLINE ; FOR RIGHT LINE DRAW
MOV bUSE1, C ;
C_Word: SETB bUSE3
MOV DPTR, #uDOTTAB ; CHINESE WORD LIB POINTER
PUSH ACC
MOV A, dDOTPAGE ; ADJUST THE THE DOT PAGE
ADD A, DPH ; 100H*(10H*PAGE_NUMBER) = 80H*20H*PAGE_NUMBER
MOV DPH, A ; GET THE PAGE START POINTER
POP ACC
SUBB A, #cMINPARTB ;
JMP OutDot
IsPartA: MOV R6, #10H ; ASCII CHAR 10H BYTES DOT ARRY
CLR bUSE3
MOV DPTR, #ASCDOTTAB ; ASCII LIB POINTER
CLR C
SUBB A, #cMINPARTA ; subtruct the start number
OutDot: MOV B, R6
MUL AB
ADD A, DPL
MOV DPL, A
MOV A, B
ADDC A, DPH
MOV DPH, A ; GET START POINTER TO CHAR DOT ARRY
CLR B_EN_INT ; CLOSE ALL INTERRUPT
MOV pPORT2, #cSCDRAM
MOV R0, #xDOTBLK ; COPY DOT ARRAY TO RAM
NtDotByt: CLR A
MOVC A, @A+DPTR
MOVX @R0, A
INC R0
INC DPTR
DJNZ R6, NtDotByt
MOV R0, #xDOTBLK
NextPartW: CALL LCD_SET_POSITION ; USE: dFLD_R4, dFLD_R3
INC DPH
MOV A, #cLCD_WRITE_RAM_CMD
MOVX @DPTR, A
DEC DPH
MOV C, bLCD_UPLINE ; FOR UPLINE ATTRIB
MOV bUSE2, C
NextByteW: CJNE R6, #0FH, GetLineW
MOV C, bLCD_DNLINE ; FOR DOWN LINE ATTRIB
MOV bUSE2, C
GetLineW: MOVX A, @R0 ; FRIST BYTE
INC R0
JNB bUSE2, ForLeftL
MOV A, #0FFH ; ADD UP | DOWN LINE
CLR bUSE2
ForLeftL: JNB bLCD_LTLINE, ForRightL
SETB ACC.7
ForRightL: JNB bUSE1, ForRevDis
JB bUSE3, ForRevDis ; IS IT FULL WORD OUTPUT
SETB ACC.0 ; ADD RIGHT LINE
ForRevDis: JNB bLCD_REVERSE, DisByte
CPL A ; REVESE DISPLAY
DisByte: MOVX @DPTR, A
INC R6
JNB bLCD_DECOUT, ChkNtByte
INC R0
INC R6
ChkNtByte: CJNE R6, #10H, NextByteW ; IS LAST LINE?
INC R5 ; FOR NEXT WORD OUTPUT
MOV R6, #0
CLR bLCD_LTLINE
JNB bUSE3, ByteMove
CLR bUSE3
JMP NextPartW
ByteMove: MOV pPORT2, dEXTPART ; RESTORE THE EXT. RAM SEGMENT
SETB B_EN_INT ; OPEN INTERRUPT AS IT IS!
JMP NextChar
END
;#############################################################
; FILE NAME LCDSUB.ASM
; SUBROUTE: LCD_DOTOUT - OUTPUT ONE DOT TO SCREEN
; CALL FUNCTION: CMDnOUT
; USING PARMENTERS: R0 - THE FLOAT DATA POINTER
; R1 - THE RATE FOR DISPLAY
; dFLD_R4,dFLD_R3 - THE OFFSET OF COL FOR LEFT(BYTE, DOT)
; COMMON DATA USED:
; dGRA_YOH_OFF,dGRA_YOL_OFF - THE '0' BASE LINE
; CHANGE REGISTER: C, A, B, ALL REGISTERS
; RETURN: NONE
;------------------------------------------------------------
PROC LCD_DOTOUT
LCD_DOTOUT: CLR B_EN_INT ; CLOSE ALL INTERRUPT
MOV pPORT2, #cSCDRAM ; FOR DISPLAY RATE GET
LCALL MOVPR1_RS
MOV pPORT2, dEXTPART ; RESTORE THE FLOAT DATA POINTER
MOV A, R4
JZ ForLine ; IS 1:1 FOR DISPLAY
LCALL F3_MUL
ForLine: LCALL F3_INT
CLR C
MOV R6, A
CLR A
MOV R4, A ; CLEAR FOR TOP OVER JIMP
MOV R5, A
MOV A, dGRA_YOL_OFF ; ADJUST BASE LINE OFFSET
SUBB A, R6 ; ..
XCH A, B ; ..
MOV R6, A ; ..
MOV A, dGRA_YOH_OFF ; ..
SUBB A, R6
JC TopOver
JNZ ButOver
MOV A, B
MOV B, dLCD_MAX_LINE
CJNE A, B, ForButOff
ForButOff:JC TurnByte
ButOver: MOV A, dLCD_MAX_LINE
TurnByte: MOV B, dLCD_BYTES_ROW
MUL AB
ADD A, dFLD_R4
MOV R4, A
CLR A
ADDC A, B
MOV R5, A
TopOver: MOV A, #40H ; FOR SECOND DRAM
ADDC A, R5
MOV R5, A
MOV DPTR, #Addr_LCD_CMD ; SET #ADDR_LCD_CMD
MOV A, #cLCD_SET_RIGHT_CSR_CMD
MOVX @DPTR, A
MOV A, #cLCD_SET_CSRADDR_CMD
MOVX @DPTR, A
DEC DPH ; SET #ADDR_LCD_DAT
MOV A, R4
MOVX @DPTR, A ; SET THE LOW ADDRESS OF CURSOR POINTER
MOV A, R5
MOVX @DPTR, A ; SET THE HIGH ADDRESS OF CURSOR POINTER
INC DPH
MOV A, #cLCD_READ_RAM_CMD
MOVX @DPTR, A ; SET THE HIGH ADDRESS OF CURSOR POINTER
DEC DPH ; SET #ADDR_LCD_DAT
MOVX A, @DPTR ; READ CURRUNT BYTE
PUSH ACC
INC DPH
MOV A, #cLCD_SET_LEFT_CSR_CMD
MOVX @DPTR, A
DEC DPH ; SET #ADDR_LCD_DAT
MOVX A, @DPTR ; READ NEXT FOR CURSOR COME BACK
INC DPH
MOV A, #cLCD_WRITE_RAM_CMD
MOVX @DPTR, A
DEC DPH
CLR A
MOV R6, dFLD_R3
CALL SET_R6BIT
POP B
ORL A, B
MOVX @DPTR, A
SETB B_EN_INT ; OPEN INTERRUPT AS IT IS!
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -