📄 lcdsub.asm
字号:
;#############################################################
; FILE NAME LCDSUB.ASM
; SUBROUTE: LCD_INIT - INITIALIZE LCD AS DOT DISPLAY AND CLEAR SCREEN
; CALL FUNCTION: LCD_CLR
; USING PARMENTERS: A - THE NUMBER OF GROUP THAT WILL BE USE
; FOR SET THE LCD SYSTEM(0 - 7)
; COMMON DATA USED:
; CHANGE REGISTER: C, A, B
; R2 - FOR BYTE COUNTER, R3 - SAVE THE OFFSET
; RETURN: NONE
;------------------------------------------------------------
PROC LCD_INIT
LCD_INIT: MOV R5, #40H
ReInit: DJNZ R5, DoInit
CALL LCD_CLR ; CLEAR THE SCREEN
CLR B_LCDCTL ; RESET LCD RIGHT CONTROL
NOP
SETB B_LCDADJ
NOP
NOP
SETB B_LCDCTL
SETB B_LCDADJ ; ...\\
MOV DPTR, #xLCDRIGHT
MOVX A, @DPTR
NtPluse: JNZ PlusOut
RET
PlusOut: SETB B_LCDCTL
CLR B_LCDADJ ; ...\\
NOP
NOP
SETB B_LCDADJ
DEC A
JMP NtPluse
DoInit: MOV dEXTPART, #0 ; INITIALIZE PORT 2
MOV pPORT2, #0
MOV R0, #xLCD_TYPE ; GET LCD TYPE
MOVX A, @R0
MOV dLCD_PTN_LINE, A
INC R0
MOVX A, @R0
SWAP A
ANL A, #0FH
MOV dLCD_CSR_LINES, A
MOVX A, @R0
ANL A, #0FH
MOV B, #12H ; 18 BYTES IN ONE GROUP SYSTEM SET DATA
MUL AB
MOV R3, A ; SAVE THE OFFSET
MOV DPTR, #Addr_LCD_CMD
MOV A, #cLCD_SYSSET_CMD
MOVX @DPTR, A
CLR A
MOV R2, A
NextSysSet: MOV DPTR, #SYS_SET_TAB
MOV A, R2
ADD A, R3
MOVC A, @A + DPTR
MOV DPTR, #Addr_LCD_DAT ; SET #ADDR_LCD_DAT
MOVX @DPTR, A
INC R2
CJNE R2, #04, ForLine
MOV dLCD_ACT_BYTES, A ; GET THE MAX LINES ON SCREEN
ForLine: CJNE R2, #06, ForByte
MOV dLCD_MAX_LINE, A ; GET THE MAX LINES ON SCREEN
ForByte: CJNE R2, #07, ForNextSet
MOV dLCD_BYTES_ROW, A ; GET THE BYTES IN ONE ROW
ForNextSet: CJNE R2, #08, NextSysSet
INC DPH ; SET #ADDR_LCD_CMD
MOV A, #cLCD_SCROLL_CMD
MOVX @DPTR, A
NextScroll: MOV DPTR, #SYS_SET_TAB
MOV A, R2
ADD A, R3
MOVC A, @A + DPTR
MOV DPTR, #Addr_LCD_DAT ; SET #ADDR_LCD_DAT
MOVX @DPTR, A
INC R2
MOV A, R2
CJNE A, #12H, NextScroll
INC DPH
MOV A, #cLCD_SRL_HDOT_CMD ;SCROLL SCREEN DOT NUMBER
MOVX @DPTR, A
DEC DPH
CLR A
MOVX @DPTR, A
INC DPH
MOV A, #cLCD_OVLAY_CMD
MOVX @DPTR, A
DEC DPH
MOV A, #cLCD_DOT13_INI_DAT ; SET TO DOT DISPLAY TYPE
MOVX @DPTR, A
INC DPH
MOV A, #cLCD_ON_CMD
MOVX @DPTR, A
MOV A, #cLCD_CSR_OFF_DAT ; DISPLAY ON & CURSOR OFF
DEC DPH
MOVX @DPTR, A
INC DPH
MOV A, #cLCD_SET_FORM_CSR_CMD ; SET CURSOR TYPE
MOVX @DPTR, A
DEC DPH
MOV A, #7
MOVX @DPTR, A
MOV A, dLCD_CSR_LINES
ORL A, #87H ; %%%%
MOVX @DPTR, A
INC DPH
MOV A, #cLCD_SET_RIGHT_CSR_CMD
MOVX @DPTR, A
MOV A, #cLCD_SET_CSRADDR_CMD ; SET LCD RAM DPTR TO 0X0000
MOVX @DPTR, A
DEC DPH ; SET #ADDR_LCD_DAT
CLR A
MOVX @DPTR, A ; SET THE HIGH ADDRESS OF CURSOR POINTER
CLR A
MOVX @DPTR, A ; SET THE LOW ADDRESS OF CURSOR POINTER
INC DPH ; SET #ADDR_LCD_CMD
MOV A, #cLCD_WRITE_RAM_CMD
MOVX @DPTR, A
DEC DPH ; SET #ADDR_LCD_DAT
MOV A, #55H ; *** WRITE TEST DATA
MOVX @DPTR, A
INC DPH
MOV A, #cLCD_SET_CSRADDR_CMD ; SET LCD RAM DPTR TO 0X0000
MOVX @DPTR, A
DEC DPH ; SET #ADDR_LCD_DAT
CLR A
MOVX @DPTR, A ; SET THE HIGH ADDRESS OF CURSOR POINTER
CLR A
MOVX @DPTR, A ; SET THE LOW ADDRESS OF CURSOR POINTER
INC DPH ; SET #ADDR_LCD_CMD
MOV A, #cLCD_READ_RAM_CMD
MOVX @DPTR, A
DEC DPH ; SET #ADDR_LCD_DAT
MOVX A, @DPTR
CJNE A, #55H, ForInit
MOV A, #5
SUBB A, R5
JNC ForInit
MOV R5, #5
ForInit: JMP ReInit
RET
SYS_SET_TAB: ; 1. FOR DMF-682A
DB 38H, 87H, 07H, 1FH, 7CH, 7FH, 20H, 00H ; P1-P8
DB 00H, 00H, 40H, 00H, 40H, 40H, 00H, 01H, 00H, 48H ; P1-P10
; 2. FOR DMF-50081/50174
DB 30H, 87H, 07H, 27H, 42H,0F0H, 30H, 00H ; P1-P8
DB 00H, 00H,0F0H, 00H, 40H,0F0H, 00H, 80H, 00H, 00H ; P1-P10
; 3. FOR DMF-50036
DB 30H, 87H, 07H, 4FH, 54H,0C8H, 50H, 00H ; P1-P8
DB 00H, 00H,0C8H, 00H, 40H,0C8H, 00H, 00H, 00H, 00H ; P1-P10
; 4. FOR CCSTN12864
DB 30H, 87H, 07H, 21H, 2CH, 40H, 20H, 00H ; P1-P8
DB 00H, 00H, 40H, 00H, 40H, 40H, 00H, 00H, 00H, 00H ; P1-P10
; 5. FOR CCSTN128128
DB 30H, 87H, 07H, 21H, 2CH, 80H, 20H, 00H ; P1-P8
DB 00H, 00H, 80H, 00H, 40H, 80H, 00H, 00H, 00H, 00H ; P1-P10
; 6. FOR CCSTN24064
DB 30H, 87H, 07H, 3CH, 4CH, 40H, 40H, 00H ; P1-P8
DB 00H, 00H, 40H, 00H, 40H, 40H, 00H, 00H, 00H, 00H ; P1-P10
; 7. FOR CCSTN240128
DB 30H, 87H, 07H, 3CH, 4CH, 80H, 40H, 00H ; P1-P8
DB 00H, 00H, 80H, 00H, 40H, 80H, 00H, 00H, 00H, 00H ; P1-P10
END
;##################################################################
; FILE NAME LCDSUB.ASM
; SUBROUTE: LCD_LCR - 清显示RAM (CLEAR 64K DISPLAY RAM)
; CALL FUNCTION: None
; USING PARMENTERS: None
; COMMON DATA USED:
; CHANGE REGISTER: DPTR, C, A, R6, R7
; RETURN: NONE
; Change Record:
; 1999/9/19 - write this subroute
;---------------------------------------------------------------
LCD_CLR: MOV DPTR, #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
CLR A
MOVX @DPTR, A ; SET THE HIGH ADDRESS OF CURSOR POINTER
CLR A
MOVX @DPTR, A ; SET THE LOW ADDRESS OF CURSOR POINTER
INC DPH ; SET #ADDR_LCD_CMD
MOV A, #cLCD_WRITE_RAM_CMD
MOVX @DPTR, A
MOV R6, #80H ; LOOP FROM 0000H - 8000H
MOV R7, #00
DEC DPH ; SET #ADDR_LCD_DAT
CLR A
ClrLCDRAM:
MOVX @DPTR, A
DJNZ R7, ClrLCDRAM
DJNZ R6, ClrLCDRAM
RET
;#############################################################
; FILE NAME LCDSUB.ASM
; SUBROUTE: LCD_DRAW_FRAME - DRAW A FRAME FOR ONE PAGE
; CALL FUNCTION:
; USING PARMENTERS: R5 - THE BYTE OFFSET IN FIELD
; dFLD_R4 - THE ROW OF FIELD
; dFLD_R3 - THE COL OF FIELD
;
; COMMON DATA USED:
; CHANGE REGISTER: C, A, R3, R4, R5
; RETURN: NONE
;------------------------------------------------------------
LCD_DRAW_FRAME:
MOV DPTR, #Addr_LCD_CMD
MOV A, #cLCD_SET_RIGHT_CSR_CMD ;--------DRAW TOP ---------
MOVX @DPTR, A
MOV A, #cLCD_SET_CSRADDR_CMD
MOVX @DPTR, A
DEC DPH ; SET #ADDR_LCD_DAT
CLR A
MOVX @DPTR, A ; SET THE HIGH ADDRESS OF CURSOR POINTER
CLR A
MOVX @DPTR, A ; SET THE LOW ADDRESS OF CURSOR POINTER
INC DPH ; SET #ADDR_LCD_CMD
MOV A, #cLCD_WRITE_RAM_CMD
MOVX @DPTR, A
MOV R6, #5
MOV R7, dLCD_BYTES_ROW
MOV B, R7 ; RESTORE FOR DRAW BUTTON
DEC DPH ; SET #ADDR_LCD_DAT
CLR A
CPL A
DrawTop: MOVX @DPTR, A
DJNZ R7, DrawTop
MOV R7, B
DJNZ R6, DrawTop
INC DPH ; --------- DRAW BUTTON -----------
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, dLCD_MAX_LINE
CLR C
SUBB A, #5
MUL AB
MOVX @DPTR, A
MOV A, B
MOVX @DPTR, A ; SET THE LOW ADDRESS OF CURSOR POINTER
INC DPH ; SET #ADDR_LCD_CMD
MOV A, #cLCD_WRITE_RAM_CMD
MOVX @DPTR, A
MOV R6, #5
MOV R7, dLCD_BYTES_ROW
DEC DPH ; SET #ADDR_LCD_DAT
CLR A
CPL A
DrawBut: MOVX @DPTR, A
DJNZ R7, DrawBut
MOV R7, dLCD_BYTES_ROW
DJNZ R6, DrawBut
INC DPH ;----------- DRAW LEFT -----------
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, #5
MOV B, dLCD_BYTES_ROW
MUL AB
MOVX @DPTR, A ; SET THE HIGH ADDRESS OF CURSOR POINTER
MOV A, B
ADDC A, #0
MOVX @DPTR, A ; SET THE LOW ADDRESS OF CURSOR POINTER
INC DPH ; SET #ADDR_LCD_CMD
MOV A, #cLCD_WRITE_RAM_CMD
MOVX @DPTR, A
MOV A, dLCD_MAX_LINE
CLR B
CLR C
SUBB A, #10
MOV R7, A
XCH A, B ; HIGH BYTE - 'B'
SUBB A, #0
INC A
MOV R6, A
DEC DPH ; SET #ADDR_LCD_DAT
MOV A, #0F8H
DrawLft: MOVX @DPTR, A
DJNZ R7, DrawLft
MOV R7, B
DJNZ R6, DrawLft
INC DPH ;----------- DRAW RIGHT -----------
MOV A, #cLCD_SET_CSRADDR_CMD
MOVX @DPTR, A
DEC DPH ; SET #ADDR_LCD_DAT
MOV A, #5
MOV B, dLCD_BYTES_ROW
MUL AB
ADD A, dLCD_ACT_BYTES
MOVX @DPTR, A ; SET THE HIGH ADDRESS OF CURSOR POINTER
MOV A, B
ADDC A, #0
MOVX @DPTR, A ; SET THE LOW ADDRESS OF CURSOR POINTER
INC DPH ; SET #ADDR_LCD_CMD
MOV A, #cLCD_WRITE_RAM_CMD
MOVX @DPTR, A
MOV A, dLCD_MAX_LINE
CLR B
CLR C
SUBB A, #10
MOV R7, A
XCH A, B ; HIGH BYTE - 'B'
SUBB A, #0
INC A
MOV R6, A
DEC DPH ; SET #ADDR_LCD_DAT
MOV A, #01FH
DrawRht: MOVX @DPTR, A
DJNZ R7, DrawRht
MOV R7, B
DJNZ R6, DrawRht
RET
;#############################################################
; FILE NAME LCDSUB.ASM
; SUBROUTE: LCD_SET_CURSOR - MOVE THE CURSOR TO THE GAVEN POSITION
; CALL FUNCTION:
; USING PARMENTERS: R5 - THE BYTE OFFSET IN FIELD
; dFLD_R4 - THE ROW OF FIELD
; dFLD_R3 - THE COL OF FIELD
;
; COMMON DATA USED:
; CHANGE REGISTER: C, A, R3, R4, R5
; RETURN: NONE
;------------------------------------------------------------
LCD_SET_CURSOR:
MOV A, dFLD_R4
JNB bLCD_DOTOUT, ColPoint
INC A
INC A
MOV B, dLCD_PTN_LINE
MUL AB
SUBB A, dLCD_CSR_LINES
ColPoint: 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 ; FOR CURSOR ACTIVE IN DISP 1
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_TWK_DAT
MOVX @DPTR, A
INC DPH
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: LCD_CURSOR_TURN - TURN THE LCD OR CURSOR ON/OFF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -