📄 slavetel.asm.bak
字号:
;**************从控制器芯片电话接收*********************************
; 从控制器,主要管理2路电话;并且把数据整理好,得到允许之后,发给主控制器
;
;****************************************************************
;DATAOUT接到主控制器的P3.5,DATACLK接到P3.4
;REQ用于数据准备好之后向主控制器的P0.0发送请求信号。从主控制器的P2.0回到INT1
;****************************************************************************
; I/O PORT PIN DEFINED
TEL_DATA EQU P1 ; LOW NIABBLE
TEL1_HOLD BIT P1.7
TEL1_RING BIT P1.6
TEL1_TOE BIT P1.5
TEL1_STD BIT P1.4
TEL1_MUSIC0 BIT P2.0
TEL1_MUSIC1 BIT P2.1
TEL2_HOLD BIT P3.7
TEL2_RING BIT P3.6
TEL2_TOE BIT P3.5
TEL2_STD BIT P3.4
TEL2_MUSIC0 BIT P2.2
TEL2_MUSIC1 BIT P2.3
REQ BIT P ;请求接收 OUTPUT
DATAOUT BIT
DATACLK BIT
;***********************************************************************
; 自己使用的RAM的定义
BIT 00H ;发送完成标志位。=1,还未完成。20H.1
TEL1_STRU EQU 21H ; 2 TEL LINE STRU
; .0 TEL RING OPENED CONTIU
; .1 TEL KEY END
; .2 TEL OPENDED
; .3 TEL DATA IN DISABLE
; .4 TEL DISABLE
TEL1_NUM EQU 2BH ; TEL LINE 1 KEY NUM
TEL1_DELAY EQU 2CH ; TEL LINE 1 DELAY TIME
TEL1_DELAY1 EQU 2DH
TEL1_DELAY2 EQU 2EH ; TEL LINE 1 DELAY TIME BETWEEN 2 KEY INPUT
TEL1_AGAIN EQU 2FH
TEL1_KEY EQU 30H
TEL2_NUM EQU 31H ; TEL LINE 2 KEY NUM
TEL2_DELAY EQU 32H ; TEL LINE 2 DELAY TIME
TEL2_DELAY1 EQU 33H
TEL2_DELAY2 EQU 34H ; TEL LINE 2 DELAY TIME BETWEEN 2 KEY INPUT
TEL2_AGAIN EQU 35H
TEL2_KEY EQU 36H
TEL1_BUF EQU 08H ; TEL LINE 1 KEY BUFFER 08H - 1FH 24 BYTES
TEL2_BUF EQU 48H ; TEL LINE 2 KEY BUFFER 48H - 5FH 24 BYTES
;***********************************************************************
ORG 0000H
AJMP SYS_START
ORG 0003H ; INT0外部中断0
CLR EX0
RETI
NOP
NOP
ORG 000BH ; TIME0 OUT定时0中断
CLR ET0
RETI
NOP
NOP
ORG 0013H ; INT1外部中断1
CLR EX1
AJMP SEND
NOP
NOP
ORG 001BH ; TIME1 OUT定时1中断
CLR ET1
RETI
NOP
NOP
NOP
ORG 0023H ; COM I/O串口中断
CLR ES
RETI
NOP
NOP
ORG 002BH ;TIME2 OUT 降压检测中断
CLR IEN0.5
RETI
NOP
NOP
ORG 0033H ;I2C中断
CLR IEN1.0
RETI
NOP
NOP
ORG 003BH ;键盘中断
CLR IEN1.1
RETI
NOP
NOP
ORG 0043H ;比较器2中断
CLR IEN1.2
RETI
NOP
NOP
ORG 0053H ; WDT TIMER OUT.要使用WDT
CLR IEN0.6
AJMP SYS_START
NOP
NOP
ORG 0063H ;比较器1中断
CLR IEN1.5
RETI
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ORG 050H
SYS_START:
MOV TEL1_STRU,#00H
MOV TEL2_STRU,#00H
MOV TEL1_DELAY,#0DH
MOV TEL2_DELAY,#0DH
MOV TEL1_DELAY2,#08H
MOV TEL2_DELAY2,#08H
MOV TEL1_AGAIN,#07H
MOV TEL2_AGAIN,#07H
NOP
NOP
NOP
ACALL INIT_TEL1
NOP
NOP
NOP
ACALL INIT_TEL2
NOP
NOP
;*******************子程序**********************************
INIT_TEL1: MOV R0,#TEL1_BUF
MOV R2,#018H
MOV A,#0CH
INIT_TEL1_2: MOV @R0,A
INC R0
DJNZ R2,INIT_TEL1_2
MOV TEL1_AGAIN,#07H
MOV TEL1_NUM,#00H
NOP
NOP
NOP
RET
NOP
NOP
NOP
INIT_TEL2: MOV R0,#TEL2_BUF
MOV R2,#018H
MOV A,#0CH
INIT_TEL2_2: MOV @R0,A
INC R0
DJNZ R2,INIT_TEL2_2
MOV TEL2_AGAIN,#07H
MOV TEL2_NUM,#00H
NOP
NOP
NOP
RET
;************************************************************************
;
; 用来检测电话
;
;************************************************************************
TIMER_OUT:
PUSH PSW
PUSH ACC
PUSH B
MOV ACC,R0
PUSH ACC
MOV ACC,R2
PUSH ACC
MOV ACC,R3
PUSH ACC
MOV TH1,#0F2H
DJNZ SYS_DELAY1,TEL_START
DJNZ SYS_DELAY,TEL_START
LJMP SYS_AGAIN
TEL_START:
DJNZ TEL1_DELAY1,TEL1_1 ; TLE LINE 1 TIMER OUT CLOSED
DJNZ TEL1_DELAY,TEL1_1
CLR TEL1_HOLD ; CLOSE TEL1
CLR TEL1_MUSIC0
CLR TEL1_MUSIC1
SETB TEL1_STRU.3
MOV A,TEL1_STRU
ANL A,#0AH
MOV TEL1_STRU,A
MOV TEL1_KEY,#0FFH
LJMP TEL1_END
TEL1_1:
JB TEL1_STRU.4,TEL1_END1 ; IF TEL1 DISABLE TOTO TEL1_END
JB TEL1_STRU.1,TEL1_END1 ; IF TEL1 DATA INPUT FINISHED GOTO TEL1_END
JB TEL1_STRU.2,TEL1_2 ; IF TEL1 OPENED GOTO TEL1_DATA INPUT
JB TEL1_RING,TEL1_1_1 ; TEL1 RING NONE
NOP
NOP
JB TEL1_RING,TEL1_1_1 ; TEL1 RING NONE
JB TEL1_STRU.0,TEL1_1_2
SETB TEL1_STRU.0
MOV TEL1_DELAY,#03H
TEL1_END1:
LJMP TEL1_END
TEL1_1_1:
CLR TEL1_STRU.0
MOV TEL1_AGAIN,#07H ; TEST TEL1 RING 7 TIMES
LJMP TEL1_END
TEL1_1_2:
DJNZ TEL1_AGAIN,TEL1_END1
SETB TEL1_HOLD ; TEL1 OPEN
SETB TEL1_MUSIC0
SETB TEL1_STRU.2
SETB TEL1_STRU.3
CLR TEL1_STRU.0
MOV TEL1_KEY,#0FFH
MOV TEL1_DELAY2,#0AH
MOV TEL1_DELAY,#020H
LJMP TEL1_END
TEL1_2:
JB TEL1_STD,TEL1_2_1
NOP
NOP
JB TEL1_STD,TEL1_2_1
MOV TEL1_KEY,#0FFH
DJNZ TEL1_DELAY2,TEL1_END1
CLR TEL1_STRU.3 ; INPUT DATA ENABLE
LJMP TEL1_END
TEL1_2_1:
MOV TEL1_DELAY2,#0AH
JB TEL1_STRU.3,TEL1_END1 ; IF INPUT DATA DISABLE GOTO TEL1_END
SETB TEL1_TOE ; INPUT TEL1 8870 DATA
MOV R3,#05H
TEL1_2_2:
NOP
MOV A,TEL_DATA
ANL A,#00FH
MOV R2,A
NOP
MOV A,TEL_DATA
ANL A,#00FH
XRL A,R2
JZ TEL1_2_3
DJNZ R3,TEL1_2_2
CLR TEL1_TOE
MOV TEL1_KEY,#0FFH
SETB TEL1_STRU.3
AJMP TEL1_END
TEL1_2_3:
CLR TEL1_TOE
MOV A,R2
JZ TEL1_2_4 ; IF INPUT DATA = 0 ERROR
CLR C ; IF INPUT DATA > 12 ERROR
SUBB A,#0DH
JC TEL1_2_5
TEL1_2_4:
MOV TEL1_KEY,#0FFH ; DATA ERROR
SETB TEL1_STRU.3
AJMP TEL1_END
TEL1_2_5:
MOV A,R2
XRL A,TEL1_KEY
JZ TEL1_2_6
MOV A,R2
MOV TEL1_KEY,A
MOV TEL1_AGAIN,#07H
AJMP TEL1_END
TEL1_2_6:
DJNZ TEL1_AGAIN,TEL1_END
CLR TEL1_MUSIC0
SETB TEL1_STRU.3
MOV TEL1_DELAY,#010H
MOV TEL1_KEY,#0FFH
MOV A,#TEL1_BUF
ADD A,TEL1_NUM
MOV R0,A
MOV A,R2
XRL A,#0BH ; * KEY = SPACE
JZ TEL1_2_7
MOV A,R2
XRL A,#0CH ; # KEY = END
JZ TEL1_2_8
MOV A,R2
MOV B,#0AH
DIV AB
MOV @R0,B
TEL1_2_7: INC TEL1_NUM
MOV A,TEL1_NUM
XRL A,#018H ; ON KEY NUM = 24 END
JZ TEL1_2_8
AJMP TEL1_END
TEL1_2_8:
MOV A,TEL1_NUM
CLR C
SUBB A,#05H
JNC TEL1_2_9
CLR TEL1_HOLD
MOV TEL1_STRU,#00H
MOV TEL1_NUM,#00H
AJMP TEL1_END
TEL1_2_9:
SETB TEL1_MUSIC1
SETB TEL1_STRU.1
SETB TEL1_STRU.3
SETB TEL1_STRU.4
MOV TEL1_DELAY,#03H
MOV TEL1_DELAY1,#00H
TEL1_END:
DJNZ TEL2_DELAY1,TEL2_1 ; TLE LINE 1 TIMER OUT CLOSED
DJNZ TEL2_DELAY,TEL2_1
CLR TEL2_HOLD ; CLOSE TEL2
CLR TEL2_MUSIC0
CLR TEL2_MUSIC1
SETB TEL2_STRU.3
MOV A,TEL2_STRU
ANL A,#0AH
MOV TEL2_STRU,A
MOV TEL2_KEY,#0FFH
LJMP TEL2_END
TEL2_1:
JB TEL2_STRU.4,TEL2_END1 ; IF TEL2 DISABLE TOTO TEL2_END
JB TEL2_STRU.1,TEL2_END1 ; IF TEL2 DATA INPUT FINISHED GOTO TEL2_END
JB TEL2_STRU.2,TEL2_2 ; IF TEL2 OPENED GOTO TEL2_DATA INPUT
JB TEL2_RING,TEL2_1_1 ; TEL2 RING NONE
NOP
NOP
JB TEL2_RING,TEL2_1_1 ; TEL2 RING NONE
JB TEL2_STRU.0,TEL2_1_2
SETB TEL2_STRU.0
MOV TEL2_DELAY,#03H
TEL2_END1:
LJMP TEL2_END
TEL2_1_1:
CLR TEL2_STRU.0
MOV TEL2_AGAIN,#07H ; TEST TEL2 RING 7 TIMES
LJMP TEL2_END
TEL2_1_2:
DJNZ TEL2_AGAIN,TEL2_END1
SETB TEL2_HOLD ; TEL2 OPEN
SETB TEL2_MUSIC0
SETB TEL2_STRU.2
SETB TEL2_STRU.3
CLR TEL2_STRU.0
MOV TEL2_KEY,#0FFH
MOV TEL2_DELAY2,#0AH
MOV TEL2_DELAY,#020H
LJMP TEL2_END
TEL2_2:
JB TEL2_STD,TEL2_2_1
NOP
NOP
JB TEL2_STD,TEL2_2_1
MOV TEL2_KEY,#0FFH
DJNZ TEL2_DELAY2,TEL2_END1
CLR TEL2_STRU.3 ; INPUT DATA ENABLE
LJMP TEL2_END
TEL2_2_1:
MOV TEL2_DELAY2,#0AH
JB TEL2_STRU.3,TEL2_END1 ; IF INPUT DATA DISABLE GOTO TEL2_END
SETB TEL2_TOE ; INPUT TEL2 8870 DATA
MOV R3,#05H
TEL2_2_2:
NOP
MOV A,TEL_DATA
ANL A,#00FH
MOV R2,A
NOP
MOV A,TEL_DATA
ANL A,#00FH
XRL A,R2
JZ TEL2_2_3
DJNZ R3,TEL2_2_2
CLR TEL2_TOE
MOV TEL2_KEY,#0FFH
SETB TEL2_STRU.3
AJMP TEL2_END
TEL2_2_3:
CLR TEL2_TOE
MOV A,R2
JZ TEL2_2_4 ; IF INPUT DATA = 0 ERROR
CLR C ; IF INPUT DATA > 12 ERROR
SUBB A,#0DH
JC TEL2_2_5
TEL2_2_4:
MOV TEL2_KEY,#0FFH ; DATA ERROR
SETB TEL2_STRU.3
AJMP TEL2_END
TEL2_2_5:
MOV A,R2
XRL A,TEL2_KEY
JZ TEL2_2_6
MOV A,R2
MOV TEL2_KEY,A
MOV TEL2_AGAIN,#07H
AJMP TEL2_END
TEL2_2_6:
DJNZ TEL2_AGAIN,TEL2_END
CLR TEL2_MUSIC0
SETB TEL2_STRU.3
MOV TEL2_DELAY,#010H
MOV TEL2_KEY,#0FFH
MOV A,#TEL2_BUF
ADD A,TEL2_NUM
MOV R0,A
MOV A,R2
XRL A,#0BH ; * KEY = SPACE
JZ TEL2_2_7
MOV A,R2
XRL A,#0CH ; # KEY = END
JZ TEL2_2_8
MOV A,R2
MOV B,#0AH
DIV AB
MOV @R0,B
TEL2_2_7: INC TEL2_NUM
MOV A,TEL2_NUM
XRL A,#018H ; ON KEY NUM = 24 END
JZ TEL2_2_8
AJMP TEL2_END
TEL2_2_8:
MOV A,TEL2_NUM
CLR C
SUBB A,#05H
JNC TEL2_2_9
CLR TEL2_HOLD
MOV TEL2_STRU,#00H
MOV TEL2_NUM,#00H
AJMP TEL2_END
TEL2_2_9:
SETB TEL2_MUSIC1
SETB TEL2_STRU.1
SETB TEL2_STRU.3
SETB TEL2_STRU.4
MOV TEL2_DELAY,#03H
MOV TEL2_DELAY1,#00H
TEL2_END:
POP ACC
MOV R3,ACC
POP ACC
MOV R2,ACC
POP ACC
MOV R0,ACC
POP B
POP ACC
POP PSW
SETB ET1
RETI
************************************************************************
;
; P1.4外部中断,把解码的电话发送给主控CPU
;
;************************************************************************
SEND:
RETI
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -