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

📄 modem.dt

📁 em78806单片机的汇编源程序
💻 DT
📖 第 1 页 / 共 2 页
字号:
	
	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 + -