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

📄 svrsub.asm

📁 一个功能完善的大型制冷设备控制程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;###########################################################
; FILE: SERSUB.ASM 
; NAME: I2CINIT - INITIALIZE THE I2C BUS LINE, CONTROIL REGISTERS
;                 AND ENABLE INT. FLAG
; PARMENTERS:  NONE
; RETURN: NONE
;###########################################################
I2CINIT: CLR   B_EN_INT
         MOV   rI2CADDR, #cSLAVE0    ; Init. station number for slave mode
         SETB  P1.6
         SETB  P1.7
         PUSH  PSW
         MOV   PSW, #cSELRG1         ; INIT. THE REGISTER GROUP 1
         MOV   R3, #0               
         POP   PSW
         SETB  B_EI2CINT
         SETB  B_EN_INT
         MOV   rI2CCTRL, #cI2CRESET   ; RESET I2C BUS WORKING ENABLE
         RET
         
;###########################################################         
; FILE: IO_SUB.ASM 
; NAME: I2CS_INI - INITIALIZE THE I2C BUS LINE AS SEND MODE
; PARMENTERS:
;     A - THE NUMBER OF BYTES WILL BE SEND
;     B - THE ADDRESS OF DATA BUFFER
; COMMOND: dSTATION - THE STATION ADDRESS
; RETURN: ALL REGISTERS IN THREE GROUP
;###########################################################
I2CS_INI: PUSH  PSW
          MOV   PSW, #cSELRG1       ; INIT. THE REGISTER GROUP 1
          nop
          nop
          nop
          nop
          MOV   R6, A               ; THE NUMBER OF BYTES WILL BE SEND
          MOV   R0, B               ; THE ADDRESS OF DATA BUFFER
          MOV   R2, dSTATION        ; INITIALIZE I2C AS MASTER & SEND MODE
          MOV   R3, A               ; BACKUP THE NUMBER OF BYTES WILL BE SEND
          SETB  P1.6
          SETB  P1.7
          SETB  B_I2CSTA            ; ENABLE THE I2C START WORKING
          POP   PSW
          RET

;###########################################################         
; FILE: IO_SUB.ASM 
; NAME: I2CR_INI - INITIALIZE THE I2C BUS LINE AS RECEIVE MODE
; PARMENTERS:
;     A - THE NUMBER OF BYTES WILL BE SEND
;     B - THE ADDRESS OF BUFFER THAT RECEIVE DATA WILL SAVE IN
; COMMOND: dSTATION - THE STATION ADDRESS
; RETURN: ALL REGISTERS IN THREE GROUP
;###########################################################
I2CR_INI: PUSH  PSW
          MOV   PSW, #cSELRG1       ; INIT. THE FRIST REGISTER GROUP 
          nop
          nop
          nop
          nop
          nop
          MOV   R6, A               ; THE NUMBER OF BYTES WILL BE SEND
          MOV   R0, B               ; THE ADDRESS OF DATA BUFFER
          MOV   R2, dSTATION        ; INITIALIZE I2C AS MASTER
          INC   R2                  ; & RECEIVE MODE
          MOV   R3, A               ; BACKUP THE NUMBER OF BYTES WILL BE SEND
          SETB  P1.6
          SETB  P1.7
          SETB  B_I2CSTA            ; ENABLE THE I2C START WORKING
          POP   PSW
          RET

;###########################################################         
; FILE: IO_SUB.ASM 
; NAME: I2CTEST - TEST IF THE I/O OPERATION IS OK! THAT ON I2C BUS LINE 
; PARMENTERS: R3 - IN THRID GROUP SPECIAL REGISTER
; RETURN: C - '0' - I2C OK, '1' - I2C BREAK!
;###########################################################
I2CTEST:  PUSH  PSW
          MOV   PSW, #cSELRG1        ; INIT. FRIST REGISTER GROUP 
T_Wait:   CJNE  R3, #0, ErrTst
          POP   PSW
          CLR   C
          RET
ErrTst:   CJNE  R3, #0FFH, T_Wait
          INC   R3                   ; CLEAR R3 FOR NEXT 
          POP   PSW
          SETB  C
          RET

;###########################################################         
; FILE: IO_SUB.ASM 
; NAME: I2CREAD - READ OUT DATA FROM 8583 
; PARMENTERS: R2 - THE START ADDRESS IN 8583
;             R3 - THE NUMBER OF BYTES WILL BE READ OUT
; RETURN: I2CTBUF, C
;###########################################################
I2CREAD: MOV   A, R2
         MOV   B, #dI2CTBUF
         MOV   R0,  B
         MOV   @R0, A        ; READY THE SEND DATA TO BUFFER 
         MOV   A, #01H
         CALL  I2CS_INI
         CALL  I2CTEST
         JC    ReadEnd
         MOV   B, #dI2CTBUF
         MOV   A, R3
         CALL  I2CR_INI
         CALL  I2CTEST
ReadEnd: RET
;###########################################################         
; FILE: IO_SUB.ASM 
; NAME: I2CWRITE - WRITE DATA TO 8583 
; PARMENTERS: I2CTBUF  - THE BUFFER THAT DATA IS
;             A        - THE NUMBER OF BYTES
; RETURN: C
;###########################################################
I2CWRITE:MOV   B, #dI2CTBUF
         CALL  I2CS_INI
         CALL  I2CTEST
         RET 

;###########################################################         
; FILE: IO_SUB.ASM 
; NAME: WR_TIME - WRITE DATE TO 8583 
; PARMENTERS: TIMEBUF
; RETURN: C
;###########################################################
WR_TIME:    MOV   dSTATION, #cSLAVE1
            MOV   R0, #dI2CTBUF
            MOV   A, #03        ; THE START ADDRESS THAT WILL WRITE TO
            MOV   @R0, A
            INC   R0
            MOV   R1, #xTIMEBUF + 1
            MOVX  A, @R1        ; MINUTE
            MOV   @R0, A
            INC   R1
            INC   R0
            MOVX  A, @R1        ; HOUR
            MOV   @R0, A
            INC   R1
            INC   R0
            MOVX  A, @R1        ; GET DATE
            MOV   R2, A
            INC   R1
            INC   R0
            MOVX  A, @R1        ; GET MOUTH 
            MOV   R3, A
            INC   R1
            MOVX  A, @R1        ; GET WEEK
            RR    A
            RR    A
            RR    A
            ORL   A, R3
            MOV   @R0, A        ; WEEK + MOUTH
            DEC   R0
            INC   R1
            MOVX  A, @R1        ; GET YEAR
            ANL   A, #03
            RR    A
            RR    A
            ORL   A, R2
            MOV   @R0, A        ; DATE + YEAR
            MOV   R0, #dI2CTBUF
            MOV   A, #05
            CALL  I2CWRITE
            RET

;###########################################################
; FILE: IO_SUB.ASM 
; NAME: UP_TIME - UPDATE THE SYSTEM DATE AND TIME 
; PARMENTERS: NONE
; CHANGE: A, R0, R1
; RETURN: TIMEBUF, DATEBUF
;###########################################################
UP_TIME:    MOV   dSTATION, #cSLAVE1           
            MOV   R2, #03
            MOV   R3, #04
            CALL  I2CREAD
            MOV   pPORT2, #0    ; CLEAR HIGH ADDRESS BITS 
            MOV   R1, #dI2CTBUF
            MOV   R0, #xTIMEBUF
            INC   R0
            MOV   A, @R1        ; MINUTE
            MOVX  @R0, A
            INC   R1
            INC   R0
            MOV   A, @R1        ; HOUR
            MOVX  @R0, A
            INC   R1
            INC   R0
            MOV   A,  @R1
            PUSH  ACC
            ANL   A,  #3FH
            MOVX  @R0, A        ; DATE
            INC   R1
            INC   R0
            MOV   A, @R1        
            ANL   A, #1FH
            MOVX  @R0, A        ; MOUTH
            MOV   A, @R1
            INC   R0
            RL    A
            RL    A
            RL    A
            ANL   A, #07
            MOVX  @R0, A        ; WEEK
            INC   R0
            POP   ACC
            RL    A
            RL    A
            ANL   A, #03        
            MOV   B, A
            MOVX  A, @R0
            ANL   A, #03
            CJNE  A, B, UpYear
            RET
UpYear:     MOVX  A, @R0
            INC   A
YearSav:    MOVX  @R0, A        ; YEAR
            RET
            
;#############################################################
; FILE NAME IO_SUB.ASM
; SUBROUTE: I2CWRUN - SENK ONE BYTE MESSAGE TO PIC CPU. 
; CALL FUNCTION:  I2C_R_INI, I2CTEST
; PARMENTERS:  A - THE BYTE WILL BE SEND TO PIC
; CHANGE REGISTERS: A, R1
; RETURN: NONE
;------------------------------------------------------------
I2CWRUN: MOV   dSTATION, #cSLAVE2
         MOV   R2, #cTESTNUM
         MOV   B, #dI2CTBUF
         MOV   R1,  B
         MOV   @R1, A        ; READY THE SEND DATA TO BUFFER 
RunReW:  MOV   A,  #1
         MOV   B, #dI2CTBUF
         CALL  I2CS_INI
         CALL  I2CTEST
         JNC   RunErr
         DJNZ  R2, RunReW
         MOV   B, #1
         MOV   A, #eERRI2C
;--          LCALL PUTEVENT
RunErr:  RET

;#############################################################
; FILE NAME IO_SUB.ASM
; SUBROUTE: GET_KEY - CHECK THE KEYBORD, IF SOME KEY PRESSED, READ IT. 
; CALL FUNCTION:  I2C_R_INI, I2CTEST
; PARMENTERS:  NONE
; CHANGE REGISTERS: A, B, R1, R5
; RETURN: REGISTER A - THE KEYBORD ACTING CODE IF KEY BE PRESSED AND
;                      C - FLAG IF ANY KEY BE PRESSED OR RELEASE
;------------------------------------------------------------
GET_KEY: JB    B_PIC_ON, NoKeyOn
         MOV   dSTATION, #cSLAVE2           
         MOV   B, #dI2CTBUF
         MOV   A, #1
         CALL  I2CR_INI
         CALL  I2CTEST
         JC    NoKeyOn
         MOV   R1, #dI2CTBUF
         MOV   A, @R1
         ANL   A, #3FH        ; NOT CARE DOWN and UP CASE
         CLR   C
         SUBB  A, #1AH        ; IS IT FUNCTION KEY? 
         MOV   A, @R1
         JNC   IsKeyOn
         JB    ACC.3, NoKeyOn
IsKeyOn: SETB  C
         RET
NoKeyOn: CLR   C
         RET
;#############################################################
; FILE NAME IO_SUB.ASM
; SUBROUTE: GETSECRET - GET THE SECRET CODE TO R0 & A
; CALL FUNCTION:  NONE
; PARMENTERS:  NONE
; CHANGE REGISTERS: A, B, R0, R6
; RETURN: REGISTER A - THE SECRET INPUT CODE
;------------------------------------------------------------
GETSECRET:  MOV   R6, #4
	    MOV   R0, #0
	    MOV   tFMQTIME, #cSECRETDt  ; SECRET CODE INPUT DELAY
NextSecret: MOV   A, tFMQTIME
	    JZ    EndGetSct
	    LCALL GET_KEY
	    JNC   NextSecret
	    MOV   B, A
	    ANL   A, #70H
	    XRL   A, #70H
	    JNZ   EndGetSct
	    MOV   tFMQTIME, #cSECRETDt 
	    MOV   A, R6
	    MUL   AB
	    ADD   A, R0    
	    MOV   R0, A
	    DJNZ  R6, NextSecret
	    RET
EndGetSct:  CLR   A
	    RET

;#############################################################
; FILE NAME INTSUB.ASM
; INTERRUPT: PROQUEST - FOR SEND DATA TO MAIN FOR SYSTEM COMMUNICATION 
; FUNCTION:  DEFUALT
; PARMENTERS: 
;        R0 - THE DISTATION STATION, IF IT'S NEEDED. 
; RETURN: dCOMMODE, If Set bit.7 is communction error
;------------------------------------------------------------
		    PROC   PROQUEST
PROQUEST:   MOV    A, dCOMMODE
            ANL    A, #03FH        ; 
            JNZ    COMProc
            RET
COMProc:    PUSH   PSW
	    MOV    PSW, #cSELRG2   ; SET THE WORK REGISTER GROUP = 2
            CJNE   A, #cCOMMODE8, ChkTimOver
            INC    dCOMMODE          ; FOR SEND AFTER  DATA PROCESS 
            CALL   uCOMPROC
            JZ     ProcEnd
            CJNE   A, #cCOMMODE13, ForUserP           ;
  ForRtn:   MOV    iCTRYNUM, #cMAXTRY
            MOV    dCOMMODE, A
            LJMP   ForEcho
  ForUserP: CALL   DATAPROC          ; USER PROCESS RECEIVED DATA
            JNZ    ForRtn            ; IS DATA NEED RETURN?
  ProcEnd:  MOV    A,  #cCOMMODE9
            MOV    dCOMMODE, A
ChkTimOver: MOV    R0, tCOMDELAY   ;   1. COM DELAY CHECK FOR NEXT BYTE RECEIVE
            CJNE   R0, #0, ForEcho
           ;CJNE   A, #cCOMMODE19, ForMode20
  TimeOver: JNC    EndComm         ; 通信超时, 置通信错误标志
  EndComm:  SETB   ACC.7
            JMP    EndOver
ForEcho:    CJNE   A, #cCOMMODE9, ForMode20   
            MOV    A, #cOKECHO          
            CALL   SENDBYTE 
	    JC     NoDone
	    CLR    B_ADDONLY          ;!!!!!
            MOV    dCOMMODE,#0h
	    JMP    ENDOVER1
  ForMode20:cjne   a, #cCOMMODE20,ForMode2
	    SETB   bCOMMLCK
            MOV    A, #cERRECHO          
            CALL   SENDBYTE
            JC     NoDone
            MOV    A, #cERRECHO          
            CALL   SENDBYTE 
	    CLR    B_ADDONLY          ;!!!!!
            MOV    dCOMMODE,#0h
	    JMP    ENDOVER1
  ForMode2: CJNE   A, #cCOMMODE2, ForMode10
            SETB   bCOMMLCK
            MOV    A,dCOMMODE
	    INC    A
  	    MOV    dCOMMODE, A
            CLR    B_RS_RW                ; FOR RECEIVE ADDRESS AGAIN
	    POP    PSW
	    RET 
  IncOver:  INC    A
  EndOver:  MOV    dCOMMODE, A
  ENDOVER1: MOV    tCOMDELAY, #cCOMDELAYt ; Reset the time counter
	    CLR    B_RS_RW                ; FOR RECEIVE ADDRESS AGAIN
	    SETB   B_EN_INT		  ;$$$$$$$$$$$$$$$
	    CLR    bCOMMLCK 
	    POP    PSW
	    RET 
 ForMode10: CJNE   A, #cCOMMODE10, ForSend
            CLR    bCOMMLCK
            MOV    A, #cERRECHO
            SETB   B_ADDONLY          ;!!!!! 
   EndSend: ;CALL   SENDBYTE
            ;JC     NoDone
   RstComm: SETB   B_ADDONLY   ; RESET COMMUITION MODE
            CLR    A
            JMP    EndOver
NoDone:     DJNZ   iCTRYNUM, NoCase
	    SETB   B_ADDONLY   ; FOR STATION DATA RECEIVE, ONLY
	    MOV    A, dCOMMODE
            SETB   ACC.7
            JMP    EndOver            
  NoCase:   POP    PSW
	    RET
 ForMode17: CJNE   A, #cCOMMODE17, NoCase
            MOV    A,  R3
            CALL   SENDBYTE
            JC     NoDone
            MOV    A, dCOMMODE
	    clr    a
            JMP    EndOver
ForSend:    CJNE   A, #cCOMMODE11, ForMode13
            MOV    A, #cCOMSYNC
            CALL   SENDBYTE
            JC     NoDone
            CALL   SENDBYTE
            JC     NoDone
            CALL   SENDBYTE
            JC     NoDone
            MOV    A, dCOMMODE
            JMP    IncOver
  NoDoneT:  JMP    NoDone
 ForMode13: CJNE   A, #cCOMMODE13, SendFunc
	    MOV    A, R2           ; SEND COUNT
            CALL   SENDBYTE
	    JC     NoDone
	    MOV    R3,  A
	    DEC    R2
    NormSnd:INC    dCOMMODE
	    MOV    A, dCOMMODE
  SendFunc: CJNE   A, #cCOMMODE14, SendParam
            MOV    A, R1          ; SEND FUNCTION CODE
  ForSendB: CALL   SENDBYTE
	    JC     NoDone
  ForNextS: ADD    A,  R3
	    MOV    R3, A
	    DJNZ   R2, SendNext
            MOV    dCOMMODE, #cCOMMODE16         
   SendNext:INC    dCOMMODE
	    MOV    A, dCOMMODE
  SendParam:CJNE   A,  #cCOMMODE15, SendData
	    MOV    A,  R4
            JMP    ForSendB
  SendData: CJNE   A,  #cCOMMODE16, ForMode17
            MOV    A,  R1
            JB     BA_BLKSEND, SendBlk
	    MOV    A,  R5
	    CALL   SENDBYTE
            JC     NoDone
	    XCH    A,  R7
	    XCH    A,  R6
	    MOV    R5, A
            MOV    A,  R7
            DEC    dCOMMODE
	    JMP    ForNextS
  SendBlk:  MOV    A,  R6          ; FOR BLOCK POINTER
	    ADD    A, R7
	    MOV    R0, A
            MOV    A,  R5          ; THE BLOCK SEGMENT
	    INC    A              
	    JNZ   ExtDataS
	    MOV   A,  @R0
	    JMP   ByteSend
   ExtDataS:MOV   dEXTPART, R5
	    MOV   pPORT2, R5   ; SET EXT. RAM SEGMENT
	    MOVX  A,  @R0
	    MOV   dEXTPART, #0
	    MOV   pPORT2, dEXTPART  ; RESTORE THE EXT RAM SEGMENT TO '0'
   ByteSend:CALL  SENDBYTE
	    JC    NoDoneT
	    DEC   dCOMMODE 
            INC   R6	           ; INC THE ADDRESS POINTER
	    CJNE  R6, #0, ForNtByt 
	    INC   R5
   ForNtByt:JMP   ForNextS
   	    RET
;////////////////////////////////////////////////////////////////
;   LOCAL SUBROUTIONE
;-----------------------------------------------

⌨️ 快捷键说明

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