📄 svrsub.asm
字号:
;###########################################################
; 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 + -