******************************************************************************
*	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
******************************************************************************
	.CODE
;-------------
;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	Int0
	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

INT0:
	Push	DPH				;Simpan register2 yg digunakan
	Push	DPL				;dalam rutin ini ke stack
	Push	A				;
	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	A.3,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	A.0,TungguIRQ
	Jnb	INT0,TungguIRQ
;----------

	Jnb	Gagang,LoopDTMF		;Periksa kondisi hook
ONHook:
	Lcall	Init_LCD		;ON Hook, hapus layar LCD
	Pop	A			;Ambil register-register yang disim
	Pop	DPL			;pan di stack
	Pop	DPH			;
	Setb	EX0			;Aktifkan interupsi DTMF
	Reti
