📄 modem.dt
字号:
JMP MAIN
_SEND_DTMF:
JMP MAIN
;=======================806 send data to mcu===================
_I2C_SEND_MCU: ;SEND DATA TO MCU
JBS 0X07,CLOCK
JMP MAIN
JBS 0X07,DATA
JMP MAIN
BC 0X07,DSR ;require connect
CLR COUNTER_5MS
BS I2C_FLAG,WAIT_BUSY
_WAIT_BUSY_DOWN:
JBC I2C_FLAG,mcu_over_time ;OVERTIME CONTROL
JMP _send_fail_con_again ;DELAY 30MS ,THEN CON AGAIN
JBC 0X07,BUSY
JMP _WAIT_BUSY_DOWN
BC I2C_FLAG,WAIT_BUSY
CLR COUNTER_5MS
BS I2C_FLAG,WAIT_START
_WAIT_START:
JBC I2C_FLAG,MCU_OVER_TIME ;OVERTIME CONTROL
JMP _send_fail_con_again ;DELAY 30MS ,THEN CON AGAIN
JBS 0X07,CLOCK
JMP _send_fail_con_again
JBC 0X07,DATA
JMP _WAIT_START
BC I2C_FLAG,WAIT_START
CLR COUNTER_5MS
DISI ;WHEN COMU, DIABLE INT
CALL I2C_REC_BYTE
MOV A,I2C_TEMP
AND A,@0B00011111
MOV 0X10,A
RRC 0X10
MOV A,@0X90
MOV 0X0C,A
MOV A,0X0D
XOR A,0X10
JBS 0X03,2
JMP _send_fail_con_again
JBS I2C_TEMP,0 ;READ 1/WRITE 0
JMP _send_fail_con_again
CALL I2C_SEND_ACK
IOR 0X07
AND A,@0B11110111 ;SET DATA AS OUTPUT
IOR 0X07
clr i2c_send_total
_I2C_SEND_LOOP:
mov a,i2c_send_total
mov 0x0c,a
mov a,0x0d
mov i2c_temp,a
CALL I2C_SEND_BYTE
CALL I2C_REC_ACK
inc i2c_send_total
mov a,i2c_send_total ;IF NO ACK,DON'T REC END BIT
xor a,i2c_total
jbs 0x03,2
jmp _send_not_complete
BC STA_FLAG,IN_I2C_SEND ;send complete
BC 0X07,DSR
IOR 0X07
OR A,@0B00001100
IOR 0X07
clr i2c_temp
clr i2c_bit_cont
clr i2c_send_total
clr i2c_total
eni
jmp main
_send_not_complete:
jbs i2c_flag,no_ack
jmp _i2c_send_loop
jmp _send_fail_con_again
_send_fail_con_again:
clr i2c_flag
BC 0X07,DSR
ior 0x07
or a,@0b00001100
iow 0x07
mov a,0x01 ;reset i2c_total
mov 0x0c,a
mov a,0x0d
add a,@0x03
mov i2c_total,a
;DELAY 30MS
JMP MAIN
;=====================806 receive mcu data==========================
_I2C_REC_MCU:
CLR COUNTER_5MS ;wait start bit
BS I2C_FLAG,WAIT_START
_wait_start1:
JBC I2C_FLAG,MCU_OVER_TIME ;OVERTIME CONTROL
JMP _rec_fail
JBS 0X07,CLOCK
JMP _rec_fail
JBC 0X07,DATA
JMP _WAIT_START1
BC I2C_FLAG,WAIT_START
CLR COUNTER_5MS
DISI
clr i2c_rec_total
clr i2c_checksum
clr i2c_total
_rec_byte_loop: ;rec loop start
call i2c_rec_byte
jbc i2c_flag,end_bit
jmp _rec_fail ;rec end_bit , as fail
inc i2c_rec_total ;inc
mov a,i2c_rec_total
xor a,@0x01
jbc 0x03,2
jmp _rec_judge_add
; mov a,i2c_rec_total ;rec instruction
; xor a,@0x02
; jbc 0x03,2
; jmp _rec_instruction
mov a,i2c_rec_total ;rec data total
xor a,@0x03
jbc 0x03,2
jmp _rec_length
jmp _rec_save
_rec_judge_add:
mov a,i2c_temp ;check 806 add
and a,@0B00011111
mov 0x10,a
RRC 0X10
MOV A,@0X90
MOV 0X0C,A
MOV A,0X0D
XOR A,0X10
JBS 0X03,2
JMP _rec_fail
jbc i2c_temp,0 ;check "r /w" bit,READ 1/WRITE 0
jmp _rec_fail
jmp _rec_save
_rec_length:
mov a,@0x40 ;if instruction =0x05,no data length
mov 0x0c,a
mov a,0x0d
xor a,@0x05
jbc 0x03,2
jmp _rec_ok
mov a,i2c_temp ;get all byte total
add a,@0x03
mov i2c_total,a
_rec_save:
deca i2c_rec_total ;save to cid ram 0x40-0x7f
add a,@0x40
mov 0x0c,a
mov a,i2c_temp
mov 0x0d,a
mov a,i2c_rec_total ;judge if the last byte
sub a,@0x02
jbc 0x03,0
jmp _rec_checksum
mov a,i2c_rec_total ;last byte, judge checksum
xor a,i2c_total
jbs 0x03,2
jmp _rec_checksum
mov a,i2c_temp
xor a,i2c_checksum
jbs 0x03,2
jmp _rec_fail
jmp _rec_ok
_rec_checksum:
mov a,i2c_temp
add i2c_checksum,a
_rec_loop_ack:
CALL I2C_SEND_ACK
jmp _rec_byte_loop ;rec loop end
_rec_ok:
call i2c_send_ack
bc i2c_flag,mcu_over_time
BC 0X07,DSR
bc sta_flag,in_i2c_rec
ior 0x07
or a,@0b00001100
iow 0x07
mov a,@0x42
mov 0x0c,a
mov a,0x0d
tbl
jmp _rec_command_err
jmp _dtmf_send_reset
jmp _fsk_send_reset
jmp _rec_io_control
jmp _rec_output
jmp _rec_input_inquire
jmp _on_off_control
jmp _fsk_send_parameter
jmp _not_use
_dtmf_send_reset: ;send dtmf
mov a,@0x44
mov 0x0c,a
MOV A,0X0D
BC 0X03,7 ;IOCX PAGE 0
CALL DAIL_DTMF_HIGH ;high frequency ,high voltage
IOW 0X0E ;tone generator2 is 2DB higher than 1
MOV A,0X0D
CALL DAIL_DTMF_LOW
IOW 0X0D ;low frequency, low voltage
MOV A,@0B01100000
OR 0X03,A
; bs dtmf_flag,dtmf_send_start
bs sta_flag,in_send_dtmf
bc sta_flag,in_i2c_rec
jmp main
_fsk_send_reset: ;send fsk
jbc sta_flag,in_send_fsk
jmp main
BC 0X05,3
BC 0X0A,3
IOR 0X0F
AND A,@0B10111110 ;disable fsk,tcc
IOW 0X0F
;
MOV A,@0X44 ;SET START VALUE
mov 0x0c,a
mov a,0x0d
MOV FSK_SEND_ADD,A
MOV A,@0X43
mov 0x0c,a
mov a,0x0d
MOV FSK_BYTE_TOTAL,A
CLR FSK_SEND_TOTAL
CLR FSK_BIT_CONT
CONTR ;SET FOR 833US
OR A,@0B00000010 ;1:8 PRESCALE
AND A,@0B11110010 ;PAB 0,TCC
CONTW
MOV A,@73
MOV 0X01,A
MOV A,@0XFF
MOV 0X0C,A
IOR 0X0F ;SAVE IOCF_TEMP,IN 0XFF(CID PAGE0)
MOV 0X0D,A
MOV A,@0B00000001 ;FSK,SEND ENABLE TCC,DISABLE ALL
IOW 0X0F
bs sta_flag,in_send_fsk
bc sta_flag,in_i2c_rec
JMP main
_rec_io_control:
_rec_output:
_rec_input_inquire:
_on_off_control:
_fsk_send_parameter:
_rec_command_err:
_not_use:
jmp main
_rec_fail:
bc sta_flag,in_i2c_rec
clr i2c_flag
BC 0X07,DSR
IOR 0X07
OR A,@0B00001100
IOR 0X07
; clr i2c_temp
; clr i2c_bit_cont
; clr i2c_send_total
; clr i2c_total
JMP MAIN
;sub:dail_sub's child prog
DAIL_DTMF_HIGH:
TBL
RETL @0X44 ;D
RETL @0X5D ;1
RETL @0X54 ;2
RETL @0X4C ;3
RETL @0X5D ;4
RETL @0X54 ;5
RETL @0X4C ;6
RETL @0X5D ;7
RETL @0X54 ;8
RETL @0X4C ;9
RETL @0X54 ;0
RETL @0X5D ;*
RETL @0X4C ;#
RETL @0X44 ;A
RETL @0X44 ;B
RETL @0X44 ;C
; RETL @0X44 ;D
;sub:dail_sub's child prog
DAIL_DTMF_LOW:
TBL
RETL @0X77 ;D
RETL @0XA0 ;1
RETL @0XA0 ;2
RETL @0XA0 ;3
RETL @0X91 ;4
RETL @0X91 ;5
RETL @0X91 ;6
RETL @0X83 ;7
RETL @0X83 ;8
RETL @0X83 ;9
RETL @0X77 ;0
RETL @0X77 ;*
RETL @0X77 ;#
RETL @0XA0 ;A
RETL @0X91 ;B
RETL @0X83 ;C
; RETL @0X77 ;D
/*
;sub:dail sub
DAIL_SUB:
MOV A,DAIL_TOTAL
JBC 0X03,2
JMP DAIL_SEND_DTMF
JBS C2_FLAG,C2_80MS_DONE2 ;SEND 80MS,DELAY 80MS;SEND NEXT BUTE
RET
DAIL_SEND_DTMF:
MOV A,DAIL_BUF_TOTAL
XOR A,DAIL_TOTAL
JBC 0X03,2 ;
JMP DAIL_BUF_END
MOV A,DAIL_BUF_ADD
ADD A,DAIL_TOTAL
MOV 0X0C,A
MOV A,0X0D
BC 0X03,7 ;IOCX PAGE 0
CALL DAIL_DTMF_HIGH ;high frequency ,high voltage
IOW 0X0E ;tone generator2 is 2DB higher than 1
MOV A,0X0D
CALL DAIL_DTMF_LOW
IOW 0X0D ;low frequency, low voltage
MOV A,@0B01100000
OR 0X03,A
INC DAIL_TOTAL
CLR C2_80MS_COUNTER
BC C2_FLAG,C2_80MS_START2
BC C2_FLAG,C2_80MS_DONE2
BS C2_FLAG,C2_80MS_START
RET
DAIL_BUF_END:
BS DAIL_FLAG,DAIL_OK
RET
*/
;SUB:I2C,REC 1BYTE
I2C_REC_BYTE:
CLR I2C_TEMP
CLR I2C_BIT_CONT
_WAIT_SCL_LOW:
JBC 0X07,CLOCK
JMP _WAIT_SCL_LOW
NOP
_WAIT_SCL_HIGH:
JBS 0X07,CLOCK
JMP _WAIT_SCL_HIGH
BC 0X03,0
JBC 0X07,DATA
BS 0X03,0
RLC I2C_TEMP
INC I2C_BIT_CONT
MOV A,I2C_BIT_CONT ;IF 1ST BIT, REC STOP BIT
XOR A,@0X01
JBS 0X03,2
JMP _JUDGE_8BIT
JBC 0X03,0
JMP _JUDGE_8BIT
_END_BIT_LOOP:
JBC 0X07,CLOCK
JMP _JUDGE_8BIT
JBS 0X07,DATA
JMP _END_BIT_LOOP
BS I2C_FLAG,END_BIT
RET
_JUDGE_8BIT:
SUB A,@0X07
JBC 0X03,0
JMP _WAIT_SCL_LOW
CLR I2C_BIT_CONT
RET
;SUB : SEND ACK
I2C_SEND_ACK:
IOR 0X07
AND A,@0B11110111
IOW 0X07
_WAIT_SCL_LOW1:
JBC 0X07,CLOCK
JMP _WAIT_SCL_LOW1
BC 0X07,DATA
_WAIT_SCL_HIGH1:
JBS 0X07,CLOCK
JMP _WAIT_SCL_HIGH1
_WAIT_SCL_LOW_A1:
JBC 0X07,CLOCK
JMP _WAIT_SCL_LOW_A1
IOR 0X07
OR A,@0B00001000
IOW 0X07
RET
;SUB:SEND BYTE
I2C_SEND_BYTE:
_WAIT_SCL_LOW2:
JBC 0X07,CLOCK
JMP _WAIT_SCL_LOW2
RLC I2C_TEMP
JBC 0X03,0
BS 0X07,DATA
JBS 0X03,0
BC 0X07,CLOCK
_WAIT_SCL_HIGH2:
JBS 0X07,CLOCK
JMP _WAIT_SCL_HIGH2
INC I2C_BIT_CONT
SUB A,@0X07
JBC 0X03,0
JMP _WAIT_SCL_LOW2
CLR I2C_BIT_CONT
RET
;SUB:REC ACK
I2C_REC_ACK:
_WAIT_SCL_LOW3:
JBC 0X07,CLOCK
JMP _WAIT_SCL_LOW3
IOR 0X07
OR A,@0B00001000
IOW 0X07
_WAIT_SCL_HIGH3:
JBS 0X07,CLOCK
JMP _WAIT_SCL_HIGH3
JBC 0X07,DATA
JMP _REC_NO_ACK
_WAIT_SCL_LOW_A2:
JBC 0X07,CLOCK
JMP _WAIT_SCL_LOW_A2
IOR 0X07
AND A,@0B11110111
IOR 0X07
RET
_REC_NO_ACK:
BS I2C_FLAG,NO_ACK
JMP _WAIT_SCL_LOW_A2
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -