	.DATA
CP_Counter	Ds	1
	.CODE
	Org	*
Init_MT8888:
	INC   DPH
	MOVX  A,@DPTR
	CLR   A
	MOVX  @DPTR,A
	MOVX  @DPTR,A
	MOV   A,#008h
	MOVX  @DPTR,A
	CLR   A
	MOVX  @DPTR,A
	MOVX  A,@DPTR
	MOV   A,#00Dh
	MOVX  @DPTR,A
	MOV   A,#000h
	MOVX  @DPTR,A
	RET   


Kirim_DTMF:
	Anl	A,#0FH			;Bila terjadi angka 0 maka
	Cjne	A,#00H,BukanNol_DTMF	;ubah menjadi 0AH atau 10 desimal
	Mov	A,#0AH			;

BukanNol_DTMF:	
	MOVX  @DPTR,A                ;Kirim_DTMF
	INC   DPH                    ;
	MOVX  A,@DPTR                ;Baca Status Register
	RET   

;Mode Call Progress Detector
CP_Mode:
	Inc	DPH
	Mov	A,#0FH
	Movx	@DPTR,A
	Mov	A,#00H
	Movx	@DPTR,A
	Ret

;Deteksi adanya call progress
;Dilakukan dengan mendeteksi adanya sinyal 3000H - 8000H Cycle sebanyak 40x
;berturut-turut

Awal_CP:
	Mov	TMOD,#11H

Loop2Awal_CP:
	Mov	CP_Counter,#0100		;CP Counter = 100

LoopAwal_CP:
	Lcall	Reset_Timer0			;Hitung lebar pulsa low
	Jb	INT0,*				;dg Timer 0
	Setb	TR0				;
	Jnb	INT0,*				;Tunggu CP High
	Clr	TR0				;Stop Timer 0
	Mov	R7,#06H			;Apakah pulsa low 400H -
	Mov	R6,#04H			;600H Cycle?
	Mov	A,TH0			;(300 Hz - 450 Hz)
	Lcall	Filter				;
	Jc	Loop2Awal_CP			;Tidak! CP Counter = 40H
	Djnz	CP_Counter,LoopAwal_CP	;Ya! CP Counter - 1
	Ret					;CP Counter = 0, return

;CP di atas 3000H Cycle, Reset Timer dan hitung lebar pulsa low lagi
;CP di bawah 3000H Cycle, Noise! Teruskan hitung lebar pulsa low tanpa direset
;Sampai FE00H Cycle CP tidak kembali high, CP berakhir 1x

TungguAkhir_CP:
LoopDeteksi_AkhirCP
	Acall	Reset_Timer0		

TungguCP_Low:
	Jb	INT0,*				;Tunggu CP Low
	Setb	TR0				;Timer 0 aktif
TungguCP_high:	
	Jnb	INT0,PeriksaLbr_Pulsa		;CP masih low, periksa timer
	Clr	TR0				;CP high, stop timer
	Mov	A,TH0				;Periksa CP < 300H Cycle
	Subb	A,#03H				;
	Jc	TungguCP_Low			;Tidak! Tunggu CP Low lagi
						;dan teruskan timer menghitung
	Ajmp	LoopDeteksi_AkhirCP			;Ya! reset timer dan tunggu CP Low

PeriksaLbr_Pulsa:
	Mov	A,TH0				;Periksa CP sudah mencapai
	Subb	A,#0FEH				;FE00H Cycle?
	Jnc	CP_Selesai1x			;Ya! CP 1x selesai
	Ajmp	TungguCP_High			;Tidak! CP 1x belum selesai

CP_Selesai1x:
	Ret

;	- Reset MT8888 (Bila IC MT8888 terpasang pada DF-88 Kit)
;	- Timer 0 Mode 1 (16 bit Counter)
;	- Tunggu 1 pulsa
;	- Timer 0 aktif
;	- Bila 0,065 detik tidak ada pulsa berarti satu pulse dial selesai
;	- Bila ditemukan 10 pulse, konversi ke 0
;

;Get_Pulse:
AmbilPulse_Dial
	Push	06H
	Lcall	Init_mt8888		;Reset MT8888
	Mov	B,#0FFH
	Djnz	B,*
	Mov	TMOD,#21H		;Timer 0 Mode 1
	Mov	R6,#00H			;Reset Jumlah Pulse
	Jnb	T0,*			;Tunggu Pulsa muncul
	Mov	B,#0FFH			;Delay anti bouncing
	Djnz	B,*			;
	Jnb	T0,*			;

Tunggu_PulsaSelesai:
	Mov	TH0,#00H		;Reset Timer
	Mov	TL0,#00H		;
	Jb	T0,*			;Satu Pulsa selesai
	Inc	R6			;Tambah Jumlah Pulse	
	Setb	TR0			;Timer 0 aktif
Tunggu:
	Jbc	TF0,Over		;Timer 0 Overflow, tambah R7
	Jnb	T0,Tunggu		;Tunggu kembali high

	Mov	B,#0FFH			;Delay anti bouncing
Anti_BLoop:				;
	Nop
	Djnz	B,Anti_BLoop		;
	Jnb	T0,*			;
	Clr	TR0			;Stop Timer 0
	Ajmp	Tunggu_PulsaSelesai	;

Over:
	Clr	TR0
	Mov	A,R6			;Jumlah Pulse disimpan ke Acc A
	Cjne	A,#0AH,Tidak_Konversi	;Bila Jumlah Pulse <> 10, tidak kon
					;versi
	Mov	A,#00H			;Bila = 10, konversi ke 0
	
Tidak_Konversi:
	Pop	06H
	Ret

KirimPulse_Dial
	Push	A
	Cjne	A,#00H,LoopKirim_Pulsa	
	Mov	A,#0AH
LoopKirim_Pulsa:
        SETB  	P1.1                          
        LCALL 	Delay_75mS                        
        CLR   	P1.1                          
        LCALL 	Delay_75mS                        
	Djnz	A,LoopKirim_Pulsa
        LCALL 	Delay_1detik                       
	Pop	A
        RET                                  

Reset_Timer0:
	Mov	TH0,#00H
	Mov	TL0,#00H
	Mov	R7,#00H
	Ret
