USH R0<br/> LD R0, #43H ; timer A run, Fxx/1<br/> LD TACON, R0<br/> LD R0, TADATA<br/>  
USH R0<br/> LD R0, #134; the FREQ dividor<br/> LD TADATA, R0<br/> BITS ADCON.6 ; Enable the DA int <br/>; Backup the interrupt setting<br/> DI<br/> LD R0, IMR00<br/>  
USH R0<br/> LD R0, #00<br/> LD IMR00, R0<br/> LD R0, IMR01<br/>  
USH R0<br/> LD R0, #00<br/> LD IMR01, R0<br/> LD R0, IMR1<br/>  
USH R0 <br/> LD R0, #00 <br/> LD IMR1, R0<br/>; Initial the interrupt setting <br/> BITS ADCON.5 ; Enable the AD/DA clk<br/> BITS IMR00.0 ; Enable the DA INT<br/> BITS IMR00.1 ; Enable timer A<br/> BITS DACON.0 ; Enable DA<br/> EI<br/>; Dial out the DTMF wave<br/> DA_LOOP:<br/> _macro_READ R2, _tm_LOWF_INDEX ; Get the low freq DA out<br/> _macro_READ R0, _tm_LOWF_INDEX+1<br/> _macro_READ R1, _tm_LOWF_CNTR<br/> ADD R0, R1<br/> INCC R2<br/> LD ILH, R2<br/> LD ILL, R0<br/> LDC @IL<br/> LD R0, TBL<br/> PUSH R0<br/> LD R1, TBH<br/> _macro_READ R0, _tm_HIGF_INDEX ; Get the high freq DA out<br/> _macro_READ R2, _tm_HIGF_INDEX+1<br/> _macro_READ R3, _tm_HIGF_CNTR<br/> ADD R2, R3<br/> INCC R0<br/> LD ILH, R0<br/> LD ILL, R2<br/> LDC @IL<br/> LD R2, TBL<br/> LD R3, TBH<br/> POP R0<br/> ADD R0, R2<br/> ADC R1, R3<br/> SR R1<br/> RRC R0<br/> SR R1<br/> RRC R0<br/> SR R1 <br/> RRC R0<br/> _macro_READ R1, _tm_LOWF_CNTR ; loop the DTMF wave<br/> INC R1<br/> _macro_READ R2, _tm_LOWFDA_CNT<br/> CP R1, R2<br/> Jp ULE, %F1<br/> LD R1, #0<br/> %1: <br/> _macro_WRITE _tm_LOWF_CNTR, R1<br/> _macro_READ R1, _tm_HIGF_CNTR<br/> INC R1<br/> _macro_READ R2, _tm_HIGFDA_CNT<br/> CP R1, R2<br/> Jp ULE, %F2<br/> LD R1, #0<br/> %2: <br/> _macro_WRITE _tm_HIGF_CNTR, R1<br/> LD _sr_DA_OUT, R0<br/> WAIT_DA:<br/> NOP <br/> BITT _sr_DTMF_FLAG.bFINISH<br/> Jp Z, WAIT_DA<br/> BMS<br/> BITR _sr_DTMF_FLAG.bFINISH<br/> _macro_READ R0, _tm_TIME_CNTR ; output enough long time<br/> _macro_READ R1, _tm_TIME_CNTR+1<br/> INC R1<br/> INCC R0<br/> _macro_WRITE _tm_TIME_CNTR, R0<br/> _macro_WRITE _tm_TIME_CNTR+1, R1<br/> CP R1, #0<br/> Jp NZ, DA_LOOP<br/> CP R0, #cDIAL_TIME<br/> Jp ULE, DA_LOOP<br/> <br/> LD R0, #7FH ; output enough long empty time<br/> LD _sr_DA_OUT, R0<br/> DTMF_WTIME:<br/> NOP <br/> BITT _sr_DTMF_FLAG.bDTMF_FINISH <br/> Jp Z, DTMF_WTIME<br/> BITR _sr_DTMF_FLAG.bDTMF_FINISH<br/> _macro_READ R0, _tm_TIME_CNTR<br/> _macro_READ R1, _tm_TIME_CNTR+1<br/> INC R1<br/> INCC R0<br/> _macro_WRITE _tm_TIME_CNTR, R0<br/> _macro_WRITE _tm_TIME_CNTR+1, R1<br/> CP R1, #0<br/> Jp NZ, DTMF_WTIME<br/> CP R0, #cDTSLI_TIME<br/> Jp ULE, DTMF_WTIME<br/> <br/> BITR _sr_DTMF_FLAG.bDIAL_INP<br/>; Disable the DA clk and interrupt</p><p> DI<br/> BITR ADCON.5 ; Disable the AD/DA clk<br/> BITR DACON.0 ; Disable the DA <br/>; Restore the IMR <br/> POP R0<br/> LD IMR1, R0<br/> POP R0<br/> LD IMR01, R0<br/> POP R0<br/> LD IMR00, R0<br/> POP R0<br/> LD TADATA, R0<br/> POP R0<br/> LD TACON, R0<br/> EI<br/> <br/>_dial_out_exit:<br/> ld r3,#IS_TIMER_A_DIALOUT<br/> lcall InterruptServer_Unregist<br/> ld r3,#IS_DA_DIALOUT<br/> lcall InterruptServer_Unregist</p><p> _macro_FREE STACK_SIZE<br/> bits p4.0<br/> <br/> RET<br/>.end<br/></p>
| 通信人家园 (https://www.txrjy.com/) | Powered by C114 |