$MOD51
;******************************************************************************
;*       PROGRAM PENAMPIL JAM DENGAN RTC 1287 DAN DTMF DENGAN MODUL DF-88                             
;*               - Menampilkan jam setiap detik ke serial port DST-51         
;*               - Menampilkan nada DTMF ke LCD setiap penekanan tombol keypad
;*               - Menampilkan pesan "ring" setiap sinyal dering
;* Disain oleh:
;*       Paulus Andi Nalwan, ST
;*       electronic@sby.centrin.net.id
;*
;*       DELTA ELECTRONIC
;*       Kompleks Ruko Manyar Megah Indah Plaza D-22
;*       Ngagel Jaya Selatan
;*       Surabaya 60284
;*       Phone/fax: 62-31-5020210
;*       http://www.delta-electronic.com
;******************************************************************************
        CSEG
;-------------
;Deklarasi I/O
;-------------
Gagang			Bit	T0		;Detektor Gagang telephone
						;dan ring
InterupsiDTMF		Bit	INT0		;Detektor interupsi DTMF

;-------------
;Konstanta yang digunakan
;-------------
BanyakPulsa_Ring	EQU	-40		;Jumlah sinyal dalam 1x ring
Alamat_DF88	EQU	8000H			;Alamat Modul DF88

;-------------
;Rutin DST-51 yang digunakan
;-------------
Delay_1detik		EQU	015CH	;Delay 1 detik
PosisiAwal_LCD		EQU	0216H	;cursor LCD pindah ke posisi awal
Init_LCD		EQU	0237H	;Inisialisasi LCD
KirimPesan_LCD		EQU	022BH	;Kirim pesan yang ditunjuk DPTR ke
					;LCD
Kirim_Karakter		EQU	0295H	;Kirim Akumulator ke LCD
Baris2_LCD		EQU	029FH	;Cursor LCD pindah ke baris 2
Init_MT8888		EQU	0682H	;Reset MT8888


	Org	2000H			;Vektor Reset
	Ajmp	Start			;
	Org	2003H			;Vektor Interupsi Eksternal 0
        Ajmp    INTR0
	Org	200BH			;Vektor Interupsi Timer 0
	Ajmp	Ring
	Org	2013H			;Vektor Interupsi Eksternal 1
	Reti
	Org	201BH			;Vektor Interupsi Timer 1
	Reti				;
	Org	2023H			;Vektor Interupsi Serial
	Reti				;

Start:
	Acall	Init_Ring		;Inisial Software untuk Ring Detektor
	Mov	DPTR,#Alamat_DF88	;Reset MT8888
	Lcall	Init_Mt8888		;
	Setb	EX0			;Aktifkan Interupsi DTMF
	Lcall	Init_LCD
        Ajmp    $


Init_Ring:
	Clr	TF0				;Hapus Flag Timer 0
	Mov	TMOD,#05H			;Timer 0 Mode 16 bit counter
	Lcall	Reset_Counter0			;Set Counter 0 -40
	Setb	TR0				;Start Timer 0
	Setb	ET0				;Aktifkan Timer 0 Interrupt
	Setb	EA				;Aktifkan interupsi semua
	Ret

Reset_Counter0:
	Mov	TH0,#0FFH
	Mov	TL0,#BanyakPulsa_Ring
	Ret

;***** Subroutine untuk menampilkan pesan 'ring' di LCD setiap ring terjadi ***

Ring:
	Clr	EA				;Matikan Seluruh interupsi
	Clr	ET0				;
	Clr	TR0				;Matikan Counter 0
	Push	DPH				;Simpan DPTR di Stack
	Push	DPL				;
	Lcall	Baris2_LCD
	Mov	DPTR,#Pesan_Ring		;Tampilkan Pesan Ring
	Lcall	KirimPesan_LCD			;
	Lcall	Reset_Counter0			;
	Lcall	Delay_1detik
	Lcall	Init_LCD
	Pop	DPL				;Ambil DPTR dari Stack
	Pop	DPH				;
	Setb	TR0				;Aktifkan Counter 0
	Setb	ET0				;Aktifkan interupsi counter 0
	Setb	EA				;Aktifkan Seluruh Interrupt
	Setb	C				;Set Carry Flag
	Reti

Pesan_Ring:
	DB	'Ring',0FH

INTR0:
	Push	DPH				;Simpan register2 yg digunakan
	Push	DPL				;dalam rutin ini ke stack
        Push    ACC                               ;
	Clr	EX0				;Matikan Interupsi 0
	Lcall	Baris2_LCD			;Cursor pindah ke baris 2
LoopDTMF:
	Mov	DPTR,#Alamat_DF88		;Ambil Data DTMF dari register
	Movx	A,@DPTR				;data MT8888
	Anl	A,#0FH				;
	Cjne	A,#10,BukanNol			;Konversi 10 ke nol
	Clr	A				;
BukanNol:
	Add	A,#30H				;Ubah ke ASCII Numerik
	Lcall	Kirim_Karakter			;Kirim ke LCD
	Mov	DPTR,#Alamat_DF88+100H		;

;---------
;Bagian ini berfungsi untuk menunggu sinyal DTMF hilang sambil memeriksa
;kondisi Hook
TungguDTMF:
	Movx	A,@DPTR				
	Jb	Gagang,ONHook			;Bila ON Hook, lompat ke 
						;label ONHook
        Jnb     ACC3,TungguDTMF           
	Mov	DPTR,#Alamat_DF88+100H		
;---------
;Bagian ini berfungsi untuk menunggu interupsi MT8888 non aktif sambil
;memeriksa kondisi Hook
TungguIRQ:
	Movx	A,@DPTR
	Jb	Gagang,ONHook
        Jnb     ACC0,TungguIRQ
	Jnb	INT0,TungguIRQ
;----------

	Jnb	Gagang,LoopDTMF		;Periksa kondisi hook
ONHook:
	Lcall	Init_LCD		;ON Hook, hapus layar LCD
        Pop     ACC                       ;Ambil register-register yang disim
	Pop	DPL			;pan di stack
	Pop	DPH			;
	Setb	EX0			;Aktifkan interupsi DTMF
	Reti
        END

