📄 telephone.asm
字号:
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 + -