⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcdsub.asm

📁 一个功能完善的大型制冷设备控制程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
; 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 + -