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

📄 telephone.asm

📁 实现LPC936对电话模块的控制,936是一个51核的处理器,用户通过串口可以控制lpc936的各个功能,是51编程比较完备的范例
💻 ASM
📖 第 1 页 / 共 3 页
字号:
mov	msg_rece_length,#00hljmp	_package_write_msg_start_dial:mov	A,#PHONE_DIAL_SIZEclr	Csubb	A,phone_dial_lengthsetb	Csubb	A,msg_rece_lengthjnc	$+3hretmov	R2,#LOW(msg_rece_buffer)inc	R2mov	R3,#msg_rece_lengthmov	DPH,#HIGH(phone_dial_buffer)_msg_start_dial_cyc:djnz	R3,_msg_start_dial_exitinc	R2mov	DPL,R2movx	A,@DPTRpush	ACCmov	DPL,#LOW(phone_dial_buffer)mov	A,phone_dial_tailadd	A,DPLmov	DPL,Apop	ACCmovx	@DPTR,Ainc	phone_dial_tailanl	phone_dial_tail,#PHONE_DIAL_SIZE_MASKinc	phone_dial_lengthsjmp	_msg_start_dial_cyc_msg_start_dial_exit:setb	phone_dial_startret_msg_stop_dial:mov	phone_dial_length,#00hmov	phone_dial_head,phone_dial_tailret_msg_set_dial_parameter:jnb	msg_send_ready_flag,$+4hretmov	DPTR,#msg_rece_bufferinc	DPLmovx	A,@DPTRmov	dtmf_on_period,Ainc	DPLmovx	A,@DPTRmov	dtmf_off_period,Amov	DPTR,#msg_send_buffermov	A,#MSG_SET_DIAL_PARAMETER ;'U'movx	@DPTR,Ainc	DPLmov	A,dtmf_on_periodmovx	@DPTR,Ainc	DPLmov	A,dtmf_off_periodmovx	@DPTR,Ainc	DPLclr	Amovx	@DPTR,Amov	msg_send_length,#04hmov	msg_send_index,#00hsetb	msg_send_ready_flagclr	msg_rece_ready_flagmov	msg_rece_length,#00hljmp	_package_write_msg_set_hold_period:jnb	msg_send_ready_flag,$+4hretmov	DPTR,#msg_rece_bufferinc	DPLmovx	A,@DPTRmov	hold_period,Amov	DPTR,#msg_send_buffermov	A,#MSG_SET_HOLD_PERIOD ;'O'movx	@DPTR,Ainc	DPLmov	A,hold_periodmovx	@DPTR,Ainc	DPLclr	Amovx	@DPTR,Amov	msg_send_length,#03hmov	msg_send_index,#00hsetb	msg_send_ready_flagclr	msg_rece_ready_flagmov	msg_rece_length,#00hljmp	_package_write_msg_set_hook_period:jnb	msg_send_ready_flag,$+4hretmov	DPTR,#msg_rece_bufferinc	DPLmovx	A,@DPTRmov	hook_updown_period,Amov	DPTR,#msg_send_buffermov	A,#MSG_SET_HOOK_PERIOD ;'U'movx	@DPTR,Ainc	DPLmov	A,hook_updown_periodmovx	@DPTR,Ainc	DPLclr	Amovx	@DPTR,Amov	msg_send_length,#03hmov	msg_send_index,#00hsetb	msg_send_ready_flagclr	msg_rece_ready_flagmov	msg_rece_length,#00hljmp	_package_write_msg_hook:jnb	msg_send_ready_flag,$+4hretmov	DPTR,#msg_rece_bufferinc	DPLmovx	A,@DPTRmov	R4,Amov	R2,#HIGH(timer_stamp_buffer)mov	R3,#LOW(timer_stamp_buffer)lcall	_time_formatcjne	R4,#30h,$+7hclr	PHONE_HOOKsjmp	$+4hsetb	PHONE_HOOKmov	DPTR,#msg_send_buffermov	A,#MSG_HOOK ;'H'movx	@DPTR,Ainc	DPLmov	A,R4movx	@DPTR,Ainc	DPLmov	R2,DPLmov	R4,#08h_msg_hook_return_timer:mov	DPL,R3movx	A,@DPTRmov	DPL,R2movx	@DPTR,Ainc	R2inc	R3djnz	R4,_msg_hook_return_timerinc	DPLclr	Amovx	@DPTR,Asetb	msg_send_ready_flagmov	msg_send_length,#0bhmov	msg_send_index,#00hmov	msg_rece_length,#00hclr	msg_rece_ready_flagljmp	_package_write_msg_monitor:jnb	msg_send_ready_flag,$+4hretmov	DPTR,#msg_rece_bufferinc	DPLmovx	A,@DPTRmov	R4,Acjne	R4,#30h,$+7hclr	PHONE_MONITORsjmp	$+4hsetb	PHONE_MONITORmov	DPTR,#msg_send_buffermov	A,#MSG_MONITOR ;'M'movx	@DPTR,Ainc	DPLmov	A,R4movx	@DPTR,Ainc	DPLclr	Amovx	@DPTR,Amov	msg_send_length,#03hmov	msg_send_index,#00hsetb	msg_send_ready_flagclr	msg_rece_ready_flagmov	msg_rece_length,#00hljmp	_package_write;ABC,abc		1101~1111;D,d			0000;0			1100;1~9			0001~1001DTMF_CODE_TAB:DB	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh	      DB	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh	      DB	0FFh,0FFh,0FFh,0Ch,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0Bh,0FFh,0FFh,0FFh,0FFh,0FFh	      DB	0Ah,01h,02h,03h,04h,05h,06h,07h,08h,09h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh	      DB	0FFh,0Dh,0Eh,0Fh,00h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh	      DB	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh	      DB	0FFh,0Dh,0Eh,0Fh,00h,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh	      DB	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh	      DB	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh	      DB	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh	      DB	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh	      DB	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh	      DB	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh	      DB	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh	      DB	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh	      DB	0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh,0FFh_msg_send_dtmf:mov	DPTR,#msg_rece_bufferinc	DPLmovx	A,@DPTRmov	DPTR,#DTMF_CODE_TABmovc	A,@A+DPTRpush	ACCanl	ACC,#0F0hjz	_msg_send_dtmf_successpop	ACCjnb	msg_send_ready_flag,$+4hretmov	DPTR,#msg_send_buffermov	A,#MSG_SND_DTMF ;movx	@DPTR,Ainc	DPLmov	A,#MSG_ERROR ;movx	@DPTR,Ainc	DPLclr	Amovx	@DPTR,Amov	msg_send_length,#03hmov	msg_send_index,#00hsetb	msg_send_ready_flagclr	msg_rece_ready_flagmov	msg_rece_length,#00hlcall	_package_writeret_msg_send_dtmf_success:mov	R2,#HIGH(tone_timer_stamp_buffer)mov	R3,#LOW(tone_timer_stamp_buffer)lcall	_time_formatpop	ACClcall	_phone_send_dtmfclr	msg_rece_ready_flagmov	msg_rece_length,#00hsetb	tone_return_ok_flagljmp	_tone_start_return_msg_stop_dtmf:jnb	msg_send_ready_flag,$+4hretlcall	_phone_stop_dtmfmov	DPTR,#msg_send_buffermov	A,#MSG_STOP_DTMF ;movx	@DPTR,Ainc	DPLclr	Amovx	@DPTR,Amov	msg_send_length,#02hmov	msg_send_index,#00hsetb	msg_send_ready_flagclr	msg_rece_ready_flagmov	msg_rece_length,#00hljmp	_package_write;//****************************End Msg Proc Function******************************;//***************************SYSTEM FUNCTION SUPPORT******************************;--------------------;format time to HEX code;R2 R3				;30*4+11+1;--------------------TIMER_FORMAT_STRING:DB '0','1','2','3','4','5','6','7'		;HEX STRING TAB		    DB '8','9','a','b','c','d','e','f'_time_format:clr	ET0			;disable TIMER0 and save time_stamp to stackpush	time_stamp+3hpush	time_stamp+2hpush	time_stamp+1hpush	time_stampsetb	ET0mov	R7,#04h			;?11set repeat counter_time_format_circle:pop	ACC			;get time_stamp valuepush	ACC			;save time_stamp (because format 4bit/one time)anl	A,#0Fh			;get 0~3bit mov	DPTR,#TIMER_FORMAT_STRINGmovc	A,@A+DPTR		;read HEX stringmov	DPH,R2mov	DPL,R3movx	@DPTR,A			;save char to extern address (R2(h) R3(l))inc	R3			;increase addresspop	ACC			;get time_stamp againswap	Aanl	A,#0Fh			;get 4~7bitmov	DPTR,#TIMER_FORMAT_STRINGmovc	A,@A+DPTR		;read HEX stringmov	DPH,R2mov	DPL,R3movx	@DPTR,A			;save char to extern address (R2(h) R3(l))inc	R3			;increase addressdjnz	R7,_time_format_circle	;30*4ret				;1;--------------------;;;--------------------;//************************End SYSTEM FUNCTION SUPPORT*****************************;//_dial_stop_ok;--------------------;;14+12*8+12+PC(PACKAGE_WRITE);--------------------_dial_stop_ok:jb	dial_return_ok_flag,$+4h		;?2retjnb	msg_send_ready_flag,$+4h		;?2retmov	DPTR,#msg_send_buffer			;?2mov	A,#MSG_FINISH_DIAL			;?1movx	@DPTR,A					;?2inc	DPL					;?1mov	R2,DPL					;?2mov	R3,#LOW(dial_timer_stamp_buffer)	;?1mov	R4,#08h					;?1-----------------14_dial_stop_ok_timer:mov	DPL,R3movx	A,@DPTRmov	DPL,R2movx	@DPTR,Ainc	R2inc	R3djnz	R4,_dial_stop_ok_timer			;?12*8inc	DPLclr	Amovx	@DPTR,Asetb	msg_send_ready_flagmov	msg_send_length,#0ahmov	msg_send_index,#00hclr	tone_return_ok_flagljmp	_package_write				;12;--------------------;;18+12*8+12+PC(PACKAGE_WRITE);--------------------_tone_start_return:jb	tone_return_ok_flag,$+4h		;?2retjnb	msg_send_ready_flag,$+4h		;?2retmov	DPTR,#msg_send_buffer			;?2mov	A,#MSG_SND_DTMF				;?1movx	@DPTR,A					;?2inc	DPL					;?1mov	A,#MSG_SUCCESS				;?1movx	@DPTR,A					;?2inc	DPL					;?1mov	R2,DPL					;?2mov	R3,#LOW(tone_timer_stamp_buffer)	;?1mov	R4,#08h					;?1-----------18_tone_start_return_timer:mov	DPL,R3					;?2movx	A,@DPTR					;?2mov	DPL,R2					;?2movx	@DPTR,A					;?2inc	R2					;?1inc	R3					;?1djnz	R4,_tone_start_return_timer		;?2------------12*8inc	DPL					;?1clr	A					;?1movx	@DPTR,A					;?2setb	msg_send_ready_flag			;?1mov	msg_send_length,#0bh			;?2mov	msg_send_index,#00h			;?2clr	tone_return_ok_flag			;?1ljmp	_package_write				;?2------------14;--------------------;;14+12*8+12+PC(PACKAGE_WRITE);--------------------_sample_start_return:jb	sample_return_ok_flag,$+4h		;?2retjnb	msg_send_ready_flag,$+4h		;?2retmov	DPTR,#msg_send_buffer			;?2mov	A,#MSG_START_SAMPLE			;?1movx	@DPTR,A					;?2inc	DPL					;?1mov	R2,DPL					;?2mov	R3,#LOW(sample_timer_stamp_buffer)	;?1mov	R4,#08h					;?1--------14_sample_start_return_timer:mov	DPL,R3					;?2movx	A,@DPTR					;?2mov	DPL,R2					;?2movx	@DPTR,A					;?2inc	R2					;?1inc	R3					;?1djnz	R4,_sample_start_return_timer		;?2--------12*8inc	DPL					;?1clr	A					;?1movx	@DPTR,A					;?2setb	msg_send_ready_flag			;?1mov	msg_send_length,#0ah			;?2mov	msg_send_index,#00h			;?2clr	sample_return_ok_flag			;?1ljmp	_package_write				;?2---------12;--------------------;DSR Status Scan;IF dsr_save_status != UART_DSR && UART_DSR == 0;	INFORPC(CURRENT TIMER);dsr_save_status = UART_DSR;20+PC(TIME_FORMAT)+12*8+12+PC(PACKAGE_WRITE);--------------------_DSR_STATUS_ALARM:mov	C,UART_DSR				;?1read DSR valuejc	$+5h					;?2if DSR is invalid(=1),save DSR to dsr_save_statusjb	dsr_save_status,_dsr_status_alarm_ok	;?2if DSR is valid(=0) and dsr_save_status is invalid						;jump to save 5ms counter valuemov	dsr_save_status,Cret_dsr_status_alarm_ok:				;?save 5ms counter value and ready to returnmov	dsr_save_status,C			;?1save DSR value to dsr_save_statusmov	R2,#HIGH(dsr_timer_stamp_buffer)	;?1load 5ms counter value saving addressmov	R3,#LOW(dsr_timer_stamp_buffer)		;?1lcall	_time_format				;?2format 5ms counter value to HEX string setb	dsr_return_ok_flag			;?1ready to return_dsr_status_alarm_return:jb	dsr_return_ok_flag,$+4h			;?2ret						jnb	msg_send_ready_flag,$+4h		;?2retmov	DPTR,#msg_send_buffer			;?2mov	A,#MSG_SYSTEM_TIMER	;'T'		;?1movx	@DPTR,A					;?2inc	DPL					;?1mov	R2,DPL					;?2mov	R3,#LOW(dsr_timer_stamp_buffer)		;?1mov	R4,#08h					;?1	-------------------20+PC(TIME_FORMAT)_dsr_alarm_return_timer:mov	DPL,R3					;?2movx	A,@DPTR					;?2mov	DPL,R2					;?2movx	@DPTR,A					;?2inc	R2					;?1inc	R3					;?1djnz	R4,_dsr_alarm_return_timer		;?2	-------------------12*8inc	DPL					;?1clr	A					;?1movx	@DPTR,A					;?2setb	msg_send_ready_flag			;?1mov	msg_send_length,#0ah			;?2mov	msg_send_index,#00h			;?2clr	dsr_return_ok_flag			;?1ljmp	_package_write				;?2	-------------------12+;--------------------;Ring Status Scan;IF ring_save_status != PHONE_RING && PHONE_RING == 1;	INFORPC(RING TIMER);ring_save_status = PHONE_RING;13+PC(TIME_FORMAT)+15+12*8+12+PC(PACKAGE_WRITE);--------------------_RING_STATUS_ALARM:mov	C,PHONE_RING				;?1read Ring Statusjnc	$+5h					;?2if Ring is invalid,save ring status and exitjnb	ring_save_status,_ring_status_alarm_ok	;?2if ring is valid and ring_save_status is invalid						;jump to save 5ms counter value and ready to returnmov	ring_save_status,C			;save ring statusret						_ring_status_alarm_ok:				;save ring timer and reback to PCmov	ring_save_status,C			;?1save ring statusmov	R2,#HIGH(ring_timer_stamp_buffer)	;?2load ring timer saving addressmov	R3,#LOW(ring_timer_stamp_buffer)	;?2lcall	_time_format				;?2format timer value to HEX stringsetb	ring_return_ok_flag			;?1ready to return message-----13+TIME_FORMAT_ring_status_alarm_return:jb	ring_return_ok_flag,$+4h		;?2retjnb	msg_send_ready_flag,$+4h		;?2retmov	DPTR,#msg_send_buffer			;?2mov	A,#MSG_RING	;'R'			;?1movx	@DPTR,A					;?2inc	DPL					;?1mov	R2,DPL					;?2mov	R3,#LOW(ring_timer_stamp_buffer)	;?2mov	R4,#08h					;?1	--------------15_ring_alarm_return_timer:mov	DPL,R3					;?2movx	A,@DPTR					;?2mov	DPL,R2					;?2movx	@DPTR,A					;?2inc	R2					;?1inc	R3					;?1djnz	R4,_ring_alarm_return_timer		;?2	--------------12*8inc	DPL					;?1clr	A					;?1movx	@DPTR,A					;?2setb	msg_send_ready_flag			;?1mov	msg_send_length,#0ah			;?2mov	msg_send_index,#00h			;?2clr	ring_return_ok_flag			;?1ljmp	_package_write				;?2	---------------12;//_sample_init:mov	sample_length,#00hmov	sample_tail,#00hmov	sample_head,#00hclr	sample_start_flagmov	sample_interval,#01hret;--------------------;;最大指令周期18+24*N+16+PC(_PACKAGE_WRITE);--------------------_SAMPLE_DATA_REBACK:mov	A,sample_length			;?1judge if there are some datas in sample bufferjnz	$+3h				;?2retjnb	msg_send_ready_flag,$+3h	;?2if there are some datas,judge if being enabled to sendretjb	sample_start_flag,_SAMPLE_DATA_REBACK_ON	;?2					;if sample is being,size of data > 16 , sending, else exitsjmp	_SAMPLE_DATA_REBACK_MOVE	;if sample is end ,go to send _SAMPLE_DATA_REBACK_ON:mov	A,sample_length			;?1judge if how mang data in sample buffer,if >16 sendingclr	C				;?1subb	A,#10h				;?1jnc	$+3h				;?2ret_SAMPLE_DATA_REBACK_MOVE:mov	DPTR,#msg_send_buffer		;?2load the first char ,mov	A,#MSG_SAMPLE_DATA		;?1movx	@DPTR,A				;?2mov	R2,#01h				;?1	上=18_SAMPLE_DATA_REBACK_CYC:cjne	R2,#31,_SAMPLE_DATA_REBACK_END	;?2-------*30if R2 < 31 continue to sendmov	DPTR,#sample_buffer		;?2mov	A,sample_head			;?1add	A,DPL				;?1mov	DPL,A				;?1movx	A,@DPTR				;?2inc	sample_head			;?1anl	sample_head,#SAMPLE_SIZE_MASK	;? 2push	ACC				;? 1get the data and mov pointmov	DPTR,#msg_send_buffer		;?2mov	A,R2				;?1add	A,DPL				;?1mov	DPL,A				;?1pop	ACC				;?1movx	@DPTR,A				;?2inc	R2				;?1save data to send buffer,and mov to next data addressdjnz	sample_length,_SAMPLE_DATA_REBACK_CYC	;?2----------24*30_SAMPLE_DATA_REBACK_END:mov	DPTR,#msg_send_buffer		;?2	下=15+_PACKAGE_WRITEsave msg eof to send buffermov	A,R2				;?1add	A,DPL				;?1mov	DPL,A				;?1clr	A				;?1movx	@DPTR,A				;?2setb	msg_send_ready_flag		;?1ready to send buffersetb	C				;?1addc	A,R2				;?1mov	msg_send_length,A		;?1mov	msg_send_index,#00h		;?1ljmp	_package_write			;?2END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -