cmd128.asm
来自「51系列的双CPU通过模拟I2C总线通信的例程。 文件格式为MSC-51 AS」· 汇编 代码 · 共 1,324 行 · 第 1/2 页
ASM
1,324 行
;;; WISE TM READ/WRITE PROGRAM
;;;;;;P3.4 T0
;;;;;;P3.5 T1
;REQ EQU P1.0
;ANSWER EQU P1.1
;CLK EQU P1.2
;DIN EQU P1.3
;O112 EQU P1.5
SKH EQU P1.3
SKL EQU P1.2
SKC EQU P1.5
SKD EQU P1.4
O112 EQU P1.0
LOWCK EQU 00H
HIGHCK EQU 01H
DDDD EQU 02H
OIL EQU 10H
MONEY EQU 13H
PRICE EQU 16H
GUNNUM EQU 19H
YEAR EQU 1AH
MONTH EQU 1CH
DAY EQU 1DH
HOUR EQU 1EH
MINUTE EQU 1FH
MODE EQU 0FH
ORG 0
SJMP IINT
NOP
RETI
NOP
NOP
NOP
NOP
NOP
NOP
NOP
;--- TIMER T0 INT.
ORG 0BH
LJMP IINT
;------------
NOP
NOP
NOP
NOP
NOP
RETI
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RETI
NOP
NOP
NOP
NOP
NOP
NOP
NOP
;-- COMM INT
ORG 23H
JMP IINT
;------
NOP
NOP
NOP
NOP
NOP
RETI
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
ORG 50H
IINT:
MOV A,#00H
MOV PSW,A
MOV SP,#80H ;
CLR EA
CLR HIGHCK
CLR LOWCK
CLR DDDD
BEGIN:
NOP
SETB SKL
SETB SKH
NOP
NOP
NOP ;;; POWER ON HANDSAKE-------
NOP
MOV R1,#0A3H
MOV R2,#01H
LCALL CMDB31
NOP
NOP ;;;;;;;SKHUEST TO FILL OIL
NOP
LCALL CMDB32
NOP
NOP ;;;; END THE FILL OIL
NOP
MOV R0,#GUNNUM
MOV A,#00H
MOV @R0,A
MOV R0,#OIL
MOV A,#00H
MOV @R0,A
INC R0
MOV A,#02H
MOV @R0,A
INC R0
MOV A,#22H
MOV @R0,A
INC R0
MOV R0,#MONEY
MOV A,#00H
MOV @R0,A
INC R0
MOV A,#04H
MOV @R0,A
INC R0
MOV A,#44H
MOV @R0,A
INC R0
MOV R0,#PRICE
MOV A,#02H
MOV @R0,A
INC R0
MOV A,#00H
MOV @R0,A
INC R0
LCALL CMDB33
NOP
NOP ;;;SEND FILL OIL DATA ------------------
NOP
NOP
MOV R0,#GUNNUM
MOV A,#00H
MOV @R0,A
MOV R0,#OIL
MOV A,#00H
MOV @R0,A
INC R0
MOV A,#00H
MOV @R0,A
INC R0
MOV A,#33H
MOV @R0,A
INC R0
MOV R0,#MONEY
MOV A,#00H
MOV @R0,A
INC R0
MOV A,#00H
MOV @R0,A
INC R0
MOV A,#99H
MOV @R0,A
INC R0
MOV R0,#PRICE
MOV A,#00H
MOV @R0,A
INC R0
MOV A,#03H
MOV @R0,A
INC R0
LCALL CMDB34
NOP
NOP ;;;;DIRECTLY DISPLAY ------------
NOP
LCALL CMDB35
NOP
NOP ;;;CURRENTLY OIL DATA .....
NOP
LCALL CMDB36
NOP
NOP ;;;;DAY RECORD
NOP
MOV R0,#YEAR
MOV A,#19H
MOV @R0,A
INC R0
MOV A,#99H
MOV @R0,A
INC R0
MOV R0,#MONTH
MOV A,#10H
MOV @R0,A
MOV R0,#DAY
MOV A,#01H
MOV @R0,A
NOP
LCALL CMDB37
NOP
NOP ;;;;;MONTH RECORD
NOP
MOV R0,#YEAR
MOV A,#19H
MOV @R0,A
INC R0
MOV A,#99H
MOV @R0,A
INC R0
MOV R0,#MONTH
MOV A,#08H
MOV @R0,A
NOP
LCALL CMDB38
NOP
NOP ;;;;MODIFY THE PRICE
NOP
MOV R0,#PRICE
MOV A,#02H
MOV @R0,A
INC R0
MOV A,#77H
MOV @R0,A
NOP
LCALL CMDB39
NOP
NOP ;;;;;SET THE TIME --------------
NOP
MOV R0,#YEAR
MOV A,#19H
MOV @R0,A
INC R0
MOV A,#99H
MOV @R0,A
MOV R0,#MONTH
MOV A,#06H
MOV @R0,A
MOV R0,#DAY
MOV A,#26H
MOV @R0,A
MOV R0,#HOUR
MOV A,#01H
MOV @R0,A
MOV R0,#MINUTE
MOV A,#30H
MOV @R0,A
NOP
LCALL CMDB310
NOP
NOP
NOP
MOV R0,#MODE
MOV A,#00H
MOV @R0,A
LCALL CMDB311
NOP
NOP ;;;;DISPLAY THE <SUM>
NOP
MOV R0,#MODE
MOV A,#00H
MOV @R0,A
MOV R0,#GUNNUM
MOV A,#00H
MOV @R0,A
NOP
LCALL CMDB313
NOP
NOP
NOP ;;;;;;;;CMDB312----------------------
NOP
LCALL CMDB312 ;;;DISPLAY REAL TIME
NOP
NOP ;;; POWER ON HANDSAKE-------
NOP
MOV R1,#3AH
MOV R2,#01H
LCALL CMDB31
NOP
NOP
NOP
LJMP BEGIN
;;;;;;NOT USED
ASK:
CLR SKH
MOV C,SKH
JC ASK
MOV C,DDDD
MOV SKD,C
MOV R3,#00H
WAITL:
MOV C,SKH
JC OUTT
MOV C,SKC
JC WAITL
SETB LOWCK
WAITH:
MOV C,SKH
JC OUTT
MOV C,SKC
JNC WAITH
MOV C,DDDD
CPL C
MOV SKD,C
MOV DDDD,C
INC R3
MOV A,R3
CLR C
SUBB A,#128
JNC OUTT
; MOV C,SKH
; JNC WAITL
JMP WAITL
OUTT:
RET
;;;;TEST CLOCK ..........
;;;;SEND 128 BIT DATA TO MONITOR
;;;;INPUT: 30H--->3FH:THE 128 BIT DATA
;;;;OUTPUT: E0H ----COMMUNICATION ERROR
;;;;;; EEH ----REFUSED BY MONITOR
;;;;;; AAH ----SUCCESS
S128B:
CLR SKH
MOV C,SKH
JC S128B
MOV R0,#30H
MOV A,@R0
MOV B,A
LCALL SFIRST
SETB SKH ;;;GET READY FOR MONITOR
JC ERRORS
MOV R2,#15
MOV R0,#31H
LOOPS:
MOV A,@R0
MOV B,A
LCALL SABYTE
JC ERRORS
INC R0
DJNZ R2,LOOPS
MOV R5,#0FFH
WAITSKH:
LCALL DELAY
MOV C,SKH
JC OVERSKH
DJNZ R5,WAITSKH
LJMP ERRSHOU
OVERSKH:
MOV R5,#0FFH
WAITANS:
LCALL DELAY
MOV C,SKL
JC OVERANS
DJNZ R5,WAITANS
LJMP ERRORS
OVERANS:
MOV A,#0AAH
JMP OUT128B
ERRSHOU:
MOV A,#0E0H
JMP OUT128B
ERRORS:
MOV A,#0EEH
OUT128B:
RET
;;;;TEST CLOCK ..........
;;;SEND A BYTE TO MONITOR
SABYTE:
MOV A,R2
PUSH ACC
MOV R2,#08H
MOV R6,#0FFH
R703: MOV R7,#0FFH
WAITLS:
MOV C,SKC
JNC OVERL00
DJNZ R7,WAITLS
DJNZ R6,R703
LJMP ERRORB
OVERL00:
MOV R6,#0FFH
R704: MOV R7,#0FFH
WAITHS:
MOV C,SKC
JC OVERH00
DJNZ R7,WAITHS
DJNZ R6,R704
LJMP ERRORB
OVERH00:
MOV A,B
RLC A
MOV B,A
MOV SKD,C
DJNZ R2,WAITLS
CLR C
JMP OUTTS
ERRORB:
SETB C
OUTTS:
POP ACC
MOV R2,A
RET
;;;;TEST CLOCK ..........
;;;;; SEND THE FIRST BYTE OF 128 BYTE
SFIRST:
MOV A,R2
PUSH ACC
MOV A,B
RLC A
MOV B,A
MOV SKD,C
MOV R2,#07H
MOV R6,#0FFH
RR7: MOV R7,#0FFH
WAITLF:
MOV C,SKC
JNC OVERLL
DJNZ R7,WAITLF
DJNZ R6,RR7
LJMP ERRORF
OVERLL:
MOV R6,#0FFH
R702: MOV R7,#0FFH
WAITHF:
MOV C,SKC
JC OVERHH
DJNZ R7,WAITHF
DJNZ R6,R702
LJMP ERRORF
OVERHH:
MOV A,B
RLC A
MOV B,A
MOV SKD,C
DJNZ R2,WAITLF
CLR C
JMP OUTTF
ERRORF:
SETB C
OUTTF:
POP ACC
MOV R2,A
RET
DELAY:
MOV R7,#08H ;;;WHEN R6=0F7H R7=02H THE TIME IS 1MS
DD11:MOV R6,#0ACH
DD22:DJNZ R6,DD22
DJNZ R7,DD11
RET
;;;;CHANGE+++++++++
;;;;DELAY 100 MS
DL100MS:
MOV R7,#200
DL177:MOV R6,#0F7H
DL166:DJNZ R6,DL166
DJNZ R7,DL177
RET
;;;;CHANGE++++++++++
;;;;DELAY 10 MS
DL10MS:
MOV R7,#20
DL1777:MOV R6,#0F7H
DL1666:DJNZ R6,DL1666
DJNZ R7,DL1777
RET
;;;;;CHANGE+++++++++
;;;;GENERATE CLOCK TO 4562........
;;;;SHIFT 128 BIT DATA TO MONITOR THROUGH 4562
;;;;INPUT: 30H--->3FH:THE 128 BIT DATA
;;;;OUTPUT: E0H ----COMMUNICATION ERROR
;;;;;; EEH ----REFUSED BY MONITOR
;;;;;; AAH ----SUCCESS
;;;;;;
;;;;;; DDH ----SKSJ IS BUSY ,JUST GET OUT AND WAIT A MOMENT.......
SEND128:
MOV R2,#16H ;;;;2000 MS
DL2000:
SETB SKH
SETB SKL
SETB SKH
SETB SKL
MOV C,SKH
ANL C,SKL
JC CONNN
LCALL DL100MS
DJNZ R2,DL2000
MOV A,#0DDH
LJMP OUT128
CONNN:
MOV R2,#16
MOV R0,#30H ;;SHIFT 128 BIT DATA TO 4562
LOOPWS:
MOV A,@R0
MOV B,A
LCALL WABYTE
INC R0
DJNZ R2,LOOPWS
SETB SKC
MOV R2,#05H
CCC:
SETB SKC
DJNZ R2,CCC
;;CCC:
;; SETB SKL
;; JNB SKL,CCC
;;
CONCLR: ;;;;ACTIVE THE SKHUST LINE
CLR SKH
MOV C,SKH
JC CONCLR
BBB:
SETB SKL
JB SKL,BBB
LCALL DDLL
LCALL DDLL
LCALL DDLL
LCALL DDLL
SETB SKH
SETB SKL
MOV R5,#0FFH ;;;WAIT FOR -SKH- TO TURN 1
WWWWSKH:
LCALL DELAY
MOV C,SKH
JC OOOOSKH
DJNZ R5,WWWWSKH
LJMP ERRRECE
OOOOSKH:
MOV R5,#0FFH ;;;WAIT FOR SKL TO TURN 1
WWWWANS:
LCALL DELAY
MOV C,SKL
JC OOOOANS
DJNZ R5,WWWWANS
LJMP ERRWWW
OOOOANS:
MOV A,#0AAH
JMP OUT128
ERRRECE:
MOV A,#0E0H
JMP OUT128
ERRWWW:
MOV A,#0EEH
OUT128:
RET
;;;;;CHANGE++++++++++++
;;;;GENERATE CLOCK TO 4562........
;;;;SHIFT 128 BIT DATA TO MONITOR THROUGH 4562
;;;;INPUT: 30H--->3FH:THE 128 BIT DATA
;;;;OUTPUT: E0H ----COMMUNICATION ERROR
;;;;;; EEH ----REFUSED BY MONITOR
;;;;;; AAH ----SUCCESS
;;;;;;
;;;;;; DDH ----SKSJ IS BUSY ,JUST GET OUT AND WAIT A MOMENT.......
SEND128J:
MOV R2,#16H ;;;;2000 MS
DL2000N:
SETB SKH
SETB SKL
SETB SKH
SETB SKL
MOV C,SKH
ANL C,SKL
JC CONNNN
LCALL DL100MS
DJNZ R2,DL2000N
MOV A,#0DDH
LJMP OUT128N
CONNNN:
MOV R2,#16
MOV R0,#30H ;;SHIFT 128 BIT DATA TO 4562
LOOPWSN:
MOV A,@R0
MOV B,A
LCALL WABYTE
INC R0
DJNZ R2,LOOPWSN
SETB SKC
MOV R2,#05H
CCCN:
SETB SKC
DJNZ R2,CCCN
CONCLRN: ;;;;ACTIVE THE SKHUST LINE
CLR SKH
MOV C,SKH
JC CONCLRN
BBBN:
SETB SKL
JB SKL,BBBN
SETB SKH
SETB SKL
LCALL DL100MS
LCALL DL100MS
LCALL DL100MS ;;; ENOUGH TO SET TIME
LCALL DL100MS
LCALL DL100MS
LCALL DL100MS
LCALL DL10MS
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?