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

📄 pagsub.asm

📁 一个功能完善的大型制冷设备控制程序
💻 ASM
📖 第 1 页 / 共 4 页
字号:
;#############################################################
; FILE NAME PAGSUB.ASM
; SUBROUTE: GET_RECORD - GET ONE DISPLAY RECORD DATA 
; USING PARMENTERS:  DPTR - THE POINT TO THE PAGE BUFFER
;                    B    - THE NUMBER OF OFFSET BYTES
;
; COMMON DATA USED: 
; CHANGE REGISTER: C, A, R4, R5
; RETURN: NONE
;------------------------------------------------------------
	   PROC  GET_RECORD, GETRCDPNT
GET_RECORD:CLR   B_TMPUSE
GetNtRcd:  MOV   A,  B
           MOVC  A,  @A+DPTR
           MOV   dFLD_R7, A      ; ||---- THE COMMAMD BUTTON FLAG
           JNZ   ForNtByte       ; FOR NO TABLE END PAGE
           CLR   B_TMPUSE
ForNtByte: INC   B               ; INC THE BYTE POINTER
	   MOV   A, B            ; GET ONE BYTE 
Byte1Nt:   MOVC  A, @A+DPTR
           MOV   dFLD_R6, A      ; FIELD   BYTE
	   INC   B               ; INC THE BYTE POINTER
	   MOV   A, B 
;%%	   JNZ   Byte2Nt
;%%	   INC   DPH
Byte2Nt:   INC   B               ; NO USE BYTE 
	   MOV   A, B            ; GET ONE BYTE 
Byte3Nt:   MOVC  A, @A+DPTR
           MOV   dFLD_R5, A
	   INC   B               ; INC THE BYTE POINTER
	   MOV   A, B            ; GET ONE BYTE 
;%%	   JNZ   Byte4Nt
;%%	   INC   DPH
Byte4Nt:   MOVC  A, @A+DPTR
           MOV   dFLD_R4, A
	   INC   B               ; INC THE BYTE POINTER
           MOV   A, B            ; GET ONE BYTE
Byte5Nt:   MOVC  A, @A+DPTR
           MOV   dFLD_R3, A
	   INC   B               ; INC THE BYTE POINTER
	   MOV   A, B            ; GET ONE BYTE 
;%%	   JNZ   Byte6Nt
;%%	   INC   DPH
Byte6Nt:   MOVC  A, @A+DPTR
           MOV   dFLD_R2, A              
	   INC   B               ; INC THE BYTE POINTER
	   MOV   A, B            ; GET ONE BYTE 
Byte7Nt:   MOVC  A, @A+DPTR
           MOV   dFLD_R1, A
           INC   B
	   MOV   A, B            ; GET ONE BYTE 
	   JNZ   NextRcd
	   INC   DPH
NextRcd:   INC   dPAG_RCD_PNT         ; INC THE FIELD POINTER
	   MOV   A, dFLD_R7
           XRL   A, #040H             ; CHECK TABLE END FLAG
           JZ    TABEndFlg   
           JB    B_TMPUSE, GetNtRcd   ; NEED GET TABLE END 
           XRL   A, #0C0H             ; CHECK TABLE START FLAG
           JZ    TabFlgChk
	   RET
TabEndFlg: MOV   dTAB_RCD_BYTES,  A   ; FOR TABLE END
	   CLR   B_TMPUSE
           JMP   GetNtRcd      ; FOR NEXT OUT OF TABLE RECORD 
TabFlgChk: MOV   A, dFLD_R6
           MOV   dTAB_RCD_BYTES,  A   ; FOR TABLE RECORD
ForTabSet: MOV   A, dFLD_R4
;--           MOV   dTAB_MAXH_RCD, A     ; (R4) SAVE HIGH BYTE OF THE MAX RECORD NUMBERS
           MOV   A, dFLD_R3
           MOV   dTAB_MAXL_RCD, A     ; (R3) SAVE LOW BYTE OF THE MAX RECORD NUMBERS
           MOV   A, dFLD_R5
           CJNE  A, #80H, ChkTabEnd
           MOV   A, dFLD_R2           ; SAVE THE OFFSET OF 'O' POINT IN Y-DIS
           MOV   dGRA_YOH_OFF, A      ; ......
           MOV   A, dFLD_R1           ; ......
           MOV   dGRA_YOL_OFF, A      ; ......
           JMP   GetNtRcd
ForInRAM:  MOV   A, @R1            ; FOR INNER RAM TABLE DATA 
           JMP   IsIncIdx
ChkTabEnd: JNB   ACC.7, S_OffSet
           ADD   A, dTAB_MAXL_RCD    ; 递减 pointer reduce, 
  S_OffSet:ADD   A, dTAB_RCD_START
           CJNE  A, dTAB_MAXL_RCD, IsGreat
  IsGreat: JC    GoOnData
           SUBB  A, dTAB_MAXL_RCD
  GoOnData:MOV   dTAB_RCD_INDEX, A
           MOV   R4, B               ; RESTORE THE FIELD POINTER
           MOV   B, dTAB_RCD_BYTES
	   MUL   AB
	   ADD   A, dFLD_R1
	   MOV   R1, A
	   MOV   A, dFLD_R2
           INC   A
           JZ    ForInRAM   
           DEC   A    
	   ADDC  A, B
           MOV   dEXTPART, A
           MOV   pPORT2, A        ; SET THE EXT RAM SEGMENT
	   MOVX  A, @R1
           MOV   dEXTPART, #0
           MOV   pPORT2, dEXTPART ; RESTORE THE EXT RAM SEGMENT TO '0'
IsIncIdx:  JNZ   ForNtGet
           MOV   dTAB_RCD_INDEX, A
           SETB  B_TMPUSE         ; FOR GOTO TABLE END 
 ForNtGet: MOV   B, R4            ; RESTORE THE FIELD RECORD POINTER
           JMP   GetNtRcd
;#############################################################
; FILE NAME PAGSUB.ASM
; SUBROUTE: GETRCDP - GET THE RECORD @DATA POINT BY dPAG_RCD_PNT  
; FUNCTION: 
; PARMENTERS:   dPAG_RCD_PNT - INDEX OF CURRENT RECORD
; USEING REGISTER: A, B
; RETURN: DPTR, A, B - THE OFFSET TO START POINTER
;------------------------------------------------------------
GETRCDPNT: MOV   DPH, dPAG_DPH
	   MOV   DPL, dPAG_DPL
	   MOV   A, dPAG_RCD_PNT
	   MOV   B, #8
	   MUL   AB
	   XCH   A, B
	   ADD   A, DPH
	   MOV   DPH, A
	   MOV   A, B
	   RET
	   END
;#######################################################################
; FILE NAME PAGSUB.ASM
; SUBROUTE: DISP_PAGE - DISPLAY ONE PAGE DATA ON LCD 
; CALL FUNCTION: DELAY
; USING PARMENTERS:  dSYSPAGE - THE NUMBER OF DISPLAY PAGE POINTER
; COMMON DATA USED: 
; CHANGE REGISTER: ALL REGISTER C AND TMPEBUF
; RETURN: NONE 
;------------------------------------------------------------
	   PROC  DISP_PAGE
DISP_PAGE: MOV   A, dSYSPAGE     ; GET THE PAGE DPTR 
	   RL    A 
           MOV   DPTR, #uPAGETAB
	   MOV   B, A
;--           JB    bSIMULATE, SIMGetP  ;@@@@@@@@@@@@
	   MOVC  A, @A+DPTR
	   XCH   A, B
	   INC   A
	   MOVC  A, @A+DPTR
           MOV   dPAG_DPL, A          ; SAVE THE PAGE START POINT ADDRESS
           MOV   dPAG_DPH, B
           MOV   dPAG_RCD_PNT, #0     ; RESET PNT
           MOV   dTAB_RCD_BYTES, #0   ; RESET TO NO TABLE ON
	   ORL   A, B
	   JNZ   DispNextF
           SETB  C        ; POINT TO '00H' (PAGE TABLE END), NO PAGE IS! 
	   RET
SIMGetP:   ;@@@@@@@@@@@@@@@@@@@@

DispNextF: CALL  GETRCDPNT            ; GET THE RCECORD POINT
           MOV   sWATCHDOG, #cWATCHDOGs  ; %%RESERT THE WATCH DOG CALL
	   CLR   B_TMPUSE        ; STRING END ENABLE
;--	   JB    bSIMULATE, SIMGetD1   ;@@@@@@@@@@@@@
	   MOVC  A, @A+DPTR
	   JNZ   DispFld
           DEC   dPAG_RCD_PNT   ; BACK TO LAST FIELD RECORD 
	   CLR   C
	   RET
SIMGetD1:  ;@@@@@@@@@@@
	   JNZ   SIMDpFld
	   CLR   C
	   RET
SIMDpFld:  CALL  DIS_FIELD
	   JMP   DispNextF
DispFld:   CALL  GET_RECORD      ; B - THE OFFSET BYTE
	   CALL  DIS_FIELD
	   JMP   DispNextF
	   END

;#############################################################
; FILE NAME PAGSUB.ASM
; SUBROUTE: FORARRYADJ - ADJUST DATA POINTER IF THE RECORD IS IN TABLE
; FUNCTION: 
; PARMENTERS:   dTAB_RCD_BYTES - THE BYTES IN ONE RECORD FOR THE TABLE
;               dTAB_RCD_INDEX - THE INDEX FOR THE CURRENT RECORD
; USEING REGISTER: B
; RETURN: R1, R2 - THE POINTER TO THE DATA
;------------------------------------------------------------
FORARRYADJ:PUSH  ACC
	   MOV   A, dTAB_RCD_BYTES
	   JZ    EndAdjust
	   MOV   B, dTAB_RCD_INDEX
           MUL   AB
	   ADD   A, dFLD_R1
	   MOV   dFLD_R1, A
	   MOV   A, B
	   ADDC  A, dFLD_R2
	   MOV   dFLD_R2, A 
EndAdjust: POP   ACC
	   RET
;#############################################################
; FILE NAME PAGSUB.ASM
; SUBROUTE: DIS_FIELD - DISPLAY ONE FIELD DATA ON LCD 
; CALL FUNCTION: DELAY
; USING PARMENTERS: dPAG_DPTR - THE POINT TO THE PAGE BUFFER
;                dFLD_R1 - R7 - THE FIELD DEFINE RECORD
; COMMON DATA USED: 
; CHANGE REGISTER: C, A, B, R1, R2, R3, R4, R5, R6, R7
; RETURN: NONE
;------------------------------------------------------------
	   PROC  DIS_FIELD
DIS_FIELD: MOV   A, dFLD_R6           ; FOR DATA TYPE?
	   RLC   A
	   ORL   C, bFLD_ACTIVE       ; FIELD DISPLAY ACTIVE 
	   JC    ChkFldTyp
           RET
IsFloatT:  JMP   IsFloat
IsIntT:    JMP   IsInteger
ChkFldTyp: RLC   A
	   JC    IsIntT
	   RLC   A
	   JC    IsFloatT
	   RLC   A
	   JC    ForRAMOut
	   RLC   A
	   JC    ForROMOut 
; FOR SWITCH FIELD PROCESS
	   CALL  FORARRYADJ         ; ADJUST THE POINTER TO DATA
	   MOV   A,  dFLD_R6
	   ANL   A,  #07H
	   MOV   R6, A
	   MOV   A,  dFLD_R2
	   INC   A
	   JNZ   ExtRAMBit
           MOV   R1, dFLD_R1
	   MOV   A,  @R1
	   JMP   GetBit
ExtRAMBit: DEC   A
           MOV   dEXTPART, A
	   MOV   pPORT2,  A       ; INITIALIZE EXTERN SEGMENT ADDRESS
           MOV   R1, dFLD_R1
	   MOVX  A,  @R1          ;PARMETER  R1 - THE INTEGER WILL BE CONVERTED
GetBit:    LCALL TOC_R6BIT
	   MOV   A, dFLD_R7          
	   ANL   A, #3FH  
	   SWAP  A
	   JNC   ForPoint           ; GET [A]
	   CLR   C
	   SUBB  A, #8              ; GET [B]-NEXT 8 BYTE
ForPoint:  MOV   DPL, A
	   MOV   A, dPAG_DPL
	   SUBB  A, DPL     
	   MOV   DPL, A             ; MOVE THE POINTER TO SWITCH DISPLAY CODE
	   CLR   A
	   MOV   DPH, A
	   MOV   A, dPAG_DPH
	   SUBB  A, DPH
	   MOV   DPH, A
	   MOV   A, #8              ; THE MAX NUMBER WILL BE DISPLAY
	   JMP   DoROMOut           ; TO DISPLAY
ForROMOut: MOV   DPL, dFLD_R1       ; GET THE POINTER TO STRING 
	   MOV   DPH, dFLD_R2       ; ....
	   MOV   A, dFLD_R7
           JB    ACC.7, ForDisF 
	   ANL   A, #03FH
ForDisF:   ANL   A, #07FH
DoROMOut:  MOV   R7, A              ; SAVE THIS NUMBER FOR DISPLAY
	   MOV   R1, #xDISPBUF           
	   MOV   dEXTPART, #cSCDRAM ; FOR RESTORE AFTER PORT2 CHANGED
	   MOV   pPORT2,   #cSCDRAM ; INIT. EXT. RAM SEGMENT FOR DISPBUF
;@@@@@@@@@@@@@@@@@@@
	   LCALL MOV_ROMTORAM
	   JMP   DoRAMOut
ForRAMOut: RLC   A
           MOV   bUSE2, C           ; IS POINTER TO STRING? 
           CALL  FORARRYADJ         ; AJDUST THE DATA POINTER(R2,R1), IF THE RECORD IN TABLE
           MOV   A, dFLD_R2
           INC   A
           JZ    ForInRAM
           DEC   A
           MOV   dEXTPART, A   ; FOR RESTORE AFTER PORT2 CHANGED
	   MOV   pPORT2, A     ; INIT. EXT. RAM SEGMENT FOR DISPLAY STRING
           MOV   R1, dFLD_R1
           MOVX  A,  @R1
	   JB    bUSE2, ForStrPnt
           MOV   A,  dFLD_R7   ;   R7 - THE NUMBER OF CHARACTER IN STRING
	   ANL   A,  #3FH
	   MOV   R7, A
	   JMP   DoRAMOut
ForInRAM:  MOV   R1, dFLD_R1
           MOV   A,  @R1
           JB    bUSE2, ForStrPnt
           JMP   EndDisFld            
ForStrPnt: PUSH  ACC            ; GET STRING POINTER IN ROM 
           JNZ   ForOutP
           MOV   A, #0DH
           ANL   A, dFLD_R5     ; CLEAR REVERSE & LINES
           MOV   dFLD_R5, A
  ForOutP: MOV   A,  dFLD_R6
           ANL   A,  #7         ; GET THE TABLE NUMBER
	   MOV   DPTR, #uFIRSTTAB 
	   ADD   A, DPH         ; ADJUST THE POINTER TO USE TABLE 
	   MOV   DPH, A
           POP   ACC
	   RLC   A              ; NUM * 2
	   JNC   GetStrPnt
	   INC   DPH
GetStrPnt: PUSH  ACC
	   MOVC  A, @A+DPTR
	   MOV   dFLD_R2, A
	   POP   ACC
	   INC   A
	   MOVC  A, @A+DPTR
	   MOV   dFLD_R1, A
	   JMP   ForROMOut       
IsInteger: CALL  FORARRYADJ         ; ADJUST THE POINTER TO DATA
	   RLC   A
	   MOV   bUSE3, C      ; IS HEX NEED?
	   RLC   A
	   MOV   bUSE2, C      ; IS BCD CODE?
           RLC   A
           MOV   bUSE1, C      ; IS DOUBLE BYTES INTEGER?
	   MOV   A,  dFLD_R2
	   INC   A
	   JNZ   ForExtRAM
           MOV   R1, dFLD_R1
	   MOV   A,  @R1
           MOV   B,  A
           INC   R1
           MOV   A,  @R1  
	   JMP   ForIntOut
ForExtRAM: DEC   A
           MOV   dEXTPART, A
	   MOV   pPORT2,   A      ; INITIALIZE EXTERN SEGMENT ADDRESS
           MOV   R1, dFLD_R1
	   MOVX  A,  @R1          ;PARMETER  R1 - THE INTEGER WILL BE CONVERTED
           MOV   B,  A
           INC   R1
           MOVX  A, @R1
ForIntOut: MOV   R2, A
	   MOV   dEXTPART, #cSCDRAM  ; FOR RESTORE AFTER PORT2 CHANGED
	   MOV   pPORT2, #cSCDRAM    ; INIT. EXT. RAM SEGMENT ADDR FOR DISPBUF
	   MOV   R1, #xDISPBUF       ; R1 - THE POINTER TO THE BUFFER FOR STRING
	   MOV   A,  dFLD_R7
	   ANL   A,  #3FH
	   PUSH  ACC
	   XCH   A,  R2              ;   A, B - THE INTEGER, R2 - THE LENGTH
           JB    bUSE3, HexInt
	   JB    bUSE2, BcdInt 
	   JB    bUSE1, TwoInt
           MOV   A,  B
           LCALL INT_TOSTR  ; A - THE NUMBER OF CHARACTER IN STRING
	   JMP   DoDataOut
  BcdInt:  MOV   A,  B
           CALL  BCD_TOSTR
	   CLR   bUSE2      ; RESET THE BCD CODE CONVERT
	   JMP   DoDataOut
  HexInt:  MOV   A,  B
           CALL  HEX_TOSTR
	   CLR   bUSE3      ; RESET THE INTEGER CONVERT
	   JMP   DoDataOut
  TwoInt:  CALL  INT2_TOSTR
	   CLR   bUSE1      ; RESET THE TWO BYTES INTEGER CONVERT
           JMP   DoDataOut 
;---------------------------------- float data process
ForDotOut: MOV   R0, dFLD_R1       ; GET THE DATA POINTER
           MOV   R1, #xGRA_DIS_RATE ; GET THE DISPLAY RATE
	   CALL  LCD_DOTOUT        ;  OUTPUT ONE DOT          
	   MOV   A,  dFLD_R1
	   ADD   A,  dTAB_RCD_BYTES
	   JNC   NextPoint
	   INC   dFLD_R2
           MOV   R2, dFLD_R2
	   MOV   dEXTPART, R2
	   MOV   pPORT2, R2
NextPoint: MOV   dFLD_R1, A        ;
           MOV   R1, A  
	   MOVX  A, @R1
	   CJNE  A, #cTAB_RCD_END, Continue1
	   JMP   EndDisFld
Continue1: MOV   A, dFLD_R3       ;  FOR NEXT POSITION
           INC   A
           ANL   A, #7   
           JNZ   AfterAdj 
           INC   dFLD_R4
 AfterAdj: MOV   dFLD_R3, A 
	   MOV   A,  dFLD_R4

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -