**********************************************************************
* 			RTC-1287 Subroutines
* Subrutin-subrutin ini dirancang untuk sebagai pendukung pengoperasian 
* Modul RTC-1287 oleh Modul DST-51
* Terdiri dari:
*	- INIT_RTC 	: Insial RTC (Osilator ON, Mode BCD, 24 Jam)
*	- BACA_WAKTU	: Baca Waktu yang tersimpan di 1287/12887
*	- SET_WAKTU	: Set Waktu yang tersimpan di 1287/12887
*	- SET_ALARM	: Set Alarm yang tersimpan di 1287/12887
*	- BACA_ALARM	: Baca Alarm yang tersimpan di 1287/12887
*
*
* 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.centrin.net.id/delta.com

	.Code
Detik		EQU	00H
Detik_Alarm	EQU	01H
Menit		EQU	02H
Menit_Alarm	EQU	03H
Jam		EQU	04H
Jam_Alarm	EQU	05H
Hari		EQU	06H
Tanggal		EQU	07H
Bulan		EQU	08H
Tahun		EQU	09H
RegA		EQU	0AH
RegB		EQU	0BH

	Org	*
;Inisial RTC 1287/12887 dengan mengaktifkan osilator internal (Reg A)
;Data mode BCD dengan format 24 Jam (Reg B)

Init_RTC:
	Mov	DPL,#RegA
        Mov   	A,#020H			;Aktifkan Oscillator                        
        Movx  	@DPTR,A                 ;      
        Mov   	DPL,#RegB              	;BCD, 24H Mode    
        Mov   	A,#002H                 ;      
        Movx  	@DPTR,A                 ;      
        Ret                                  

;Tampilkan kalender ke Monitor melalui Serial Port PC
;Tampilan:
;	Hari Tanggal Bulan Tahun

Kalender_Display:
	Lcall	Ambil_Hari		;Ambil Data Hari dari RTC	
	Push	DPH			;Ambil data nama hari berdasar
        Mov   	DPTR,#Nama_Hari         ;data dari RTC         	
        Lcall 	Kirim_NamaKalender     	;dan kirim ke Serial Port                   
	Pop	DPH			

	Lcall	Ambil_Tanggal		;Ambil Data tanggal dari RTC
	Lcall 	ASCII_Out               ;Kirim ke Serial Port 
        Lcall 	SPACE_CODE              ;Spasi          

	Lcall	Ambil_Bulan		;Ambil Data Bulan dari RTC
	Push	DPH			;
        Mov   	DPTR,#Nama_Bulan        ;Ambil Data Nama Bulan berdasar          
        Lcall 	Kirim_NamaKalender      ;data dari RTC                  
        Pop	DPH 

	Lcall	Ambil_Tahun		;Ambil Data Tahun dari RTC
	Lcall	ASCII_Out		;Kirim ke Serial Port
        Lcall 	Enter_Code              ;Enter
        RET                                  

Kirim_NamaKalender          
	Push  	A                           
Next:        
	Mov   	A,#00H                        
        Movc  	A,@A+DPTR                      
        Inc   	DPTR                           
        Cjne  	A,#00Fh,Next                
        Pop   	A                           
        Djnz  	A,Kirim_NamaKalender                   
        Lcall 	KirimPesan_Serial                        
        Lcall 	SPACE_CODE                        
        Ret                                  


;Display_2Digit:
	Lcall	Hex_ASCII2
        Lcall 	Serial_Out                        
        Xch   	A,B                         
        Lcall 	Serial_Out                       
        Ret      

;Isi Data RTC dari Serial Port PC dan tampilkan hasilnya di Serial Port PC                            
;Data dikonversi ke hexa

Isi_RTC:
	Lcall 	Serial_In                        
        Lcall 	Serial_Out                        
        Push  	A                           
        Lcall 	Serial_In                        
        Lcall 	Serial_Out                        
        Xch   	A,B                         
        Pop   	A                           
        Lcall 	ASCII_HEX                        
        Ret                                  

;Tampilkan jam menit dan detik ke serial port
Display_Waktu:         
	Lcall 	Clrscr                        
        Lcall 	Clrscr                        
	Lcall	Ambil_Jam
	Lcall	ASCII_Out
        Mov   	A,#03AH                        
        Lcall 	Serial_Out                        
	Lcall	Ambil_Menit
	Lcall	ASCII_Out
        Mov   	A,#03AH                        
        Lcall 	Serial_Out                        
	Lcall	Ambil_Detik
	Lcall	ASCII_Out
        RET                                  

Clrscr:
	Push  	A                           
        Mov   	A,#00DH                        
        Lcall 	Serial_Out                        
        Lcall 	Delay_5mS                       
        Lcall 	Delay_5mS                       
        Pop   	A                           
        Ret                                  

;Set Jam, menit, detik, hari, tanggal, bulan dan tahun 
;Tampilan:
;	- Jam:Menit:Detik Hari Tanggal Bulan Tahun
Set_Waktu:
        Lcall 	Isi_RTC        		;Ambil Data Jam dari Serial Port                
        Mov   	DPL,#Jam              	;isi ke memori jam dari RTC    
        Movx  	@DPTR,A                 ;      
        Mov   	A,#03Ah                 ;Kirim ':' ke Serial Port      
        Lcall 	Serial_Out              ;         
        Lcall 	Isi_RTC                 ;Ambil Data Menit dari Serial Port       
        Mov   	DPL,#Menit              ;isi ke memori menit dari RTC   
        Movx  	@DPTR,A                 ;      
        Mov   	A,#03Ah                 ;Kirim ':' ke Serial Port      
        Lcall 	Serial_Out              ;         
        Mov   	DPL,#Detik              ;Ambil Data Detik dari Serial Port    
        Lcall 	Isi_RTC                 ;isi ke memori detik dari RTC       
        Movx  	@DPTR,A                 ;      
        Lcall 	Isi_RTC                 ;Ambil Data Hari dari Serial Port       
        Mov   	DPL,#Hari              	;isi ke memori hari dari RTC  
        Movx  	@DPTR,A                 ;
        Lcall 	Isi_RTC                 ;Ambil Data Tanggal dari Serial Port       
        Mov   	DPL,#Tanggal            ;isi ke memori tanggal dari RTC    
        Movx  	@DPTR,A                 ;     
        Lcall 	Isi_RTC                 ;Ambil Data Bulan dari Serial Port       
        Mov   	DPL,#Bulan              ;isi ke memori bulan dari RTC
        Movx  	@DPTR,A                 ;      
        Lcall 	Isi_RTC                 ;Ambil Data Tahun dari Serial Port       
        Mov   	DPL,#Tahun              ;isi ke memori tahun dari RTC  
        Movx  	@DPTR,A                 ;     
        Lcall 	Clrscr                  ;Hapus Layar Monitor    
        Ret                                  

;Rutin ii digunakan untuk mengaktifkan alarm interrupt
Set_Alarm:
        Mov   	DPL,#RegB              ;RTC Interrupt active    
        Mov   	A,#000h                ;      
        Movc  	A,@A+DPTR              ;      
        Setb  	A.5                    ;    
        Movx  	@DPTR,A                ;      
        Lcall 	Isi_RTC                ;Ambil Data Jam Alarm dari Serial        
        Mov   	DPL,#Jam_Alarm         ;Port dan simpan ke memori Jam Alarm
        Movx  	@DPTR,A                ;RTC
        Mov   	A,#03AH                ;Kirim ':' ke Serial Port        
        Lcall 	Serial_Out             ;           
        Lcall 	Isi_RTC                ;Ambil Data Menit Alarm dari Serial       
        Mov   	DPL,#Menit_Alarm       ;Port dan simpan ke memori Menit     
        Movx  	@DPTR,A                ;Alarm RTC 
        Mov   	A,#03Ah                ;Kirim ':' ke Serial Port        
        Lcall 	Serial_Out             ;           
        Lcall 	Isi_RTC                ;Ambil Data Detik Alarm dari Serial       
        Mov   	DPL,#Detik_Alarm       ;Port dan simpan ke memori Detik   
        Movx  	@DPTR,A                ;Alarm RTC 
        Lcall 	Clrscr                 ;Hapus Layar Monitor       
	Ret

;Baca isi alarm yang tersimpan di memori alarm RTC dan tampilkan di serial
;port
Baca_Alarm:
	Push	07H			
	Lcall	Ambil_JamAlarm
	Lcall	ASCII_Out
        Mov   	A,#03AH                        
        Lcall 	Serial_Out                        
	Lcall	Ambil_MenitAlarm
	Lcall	ASCII_Out
        Mov   	A,#03AH                        
        Lcall 	Serial_Out                        
	Lcall	Ambil_DetikAlarm
	Lcall	ASCII_Out
        Lcall 	Enter_Code                        
	Pop	07H
	Ret

;Rutin alarm interrupt
Alarm_Interrupt:
	Clr	EA
	Lcall	Init_RTC
	Push	DPH
	Mov	DPTR,#Alarm_Message
	Lcall	KirimPesan_Serial
	Lcall	Enter_code
	Pop	DPH
	Setb	EA
	Reti			

PesanRTC_OFF:
	DB	'RTC OFF'$0A,$0D,$0F

;Rutin-rutin pengambilan data dari memori RTC berupa:
;	- Detik Alarm
;	- Menit Alarm
;	- Jam Alarm
;	- Detik
;	- Menit
;	- Jam
;	- Hari
;	- Tanggal
;	- Bulan
;	- Tahun
Ambil_DetikAlarm:
	Mov	DPL,#detik_Alarm
	Mov	A,#00H
	Movc	A,@A+DPTR
	Ret

Ambil_MenitAlarm:
	Mov	DPL,#Menit_Alarm
	Mov	A,#00H
	Movc	A,@A+DPTR
	Ret

Ambil_JamAlarm:
	Mov	DPL,#Jam_Alarm
	Mov	A,#00H
	Movc	A,@A+DPTR
	Ret

Ambil_detik:
	Mov	DPL,#detik
	Mov	A,#00H
	Movc	A,@A+DPTR
	Ret

Ambil_Menit:
	Mov	DPL,#Menit
	Mov	A,#00H
	Movc	A,@A+DPTR
	Ret

Ambil_Jam:
	Mov	DPL,#Jam
	Mov	A,#00H
	Movc	A,@A+DPTR
	Ret

Ambil_Hari:
	MOV   	DPL,#Hari		;Ambil Nama Hari
	Mov	A,#00H
	Movc	A,@A+DPTR
	Ret

Ambil_Tanggal
	Mov	DPL,#Tanggal
	Mov	A,#00H
	Movc	A,@A+DPTR
	Ret

Ambil_Bulan
	Mov	DPL,#Bulan
	Mov	A,#00H
	Movc	A,@A+DPTR
	Ret

Ambil_Tahun
	Mov	DPL,#Tahun
	Mov	A,#00H
	Movc	A,@A+DPTR
	Ret

;Tabel-tabel pesan berupa nama hari, bulan, pesan set waktu, set alarm,
;Alarm aktif

Nama_Hari:
	DB	$0F,'Minggu',$0F
	DB	'Senin',$0F
	DB	'Selasa',$0F
	DB	'Rabu',$0F
	DB	'Kamis',$0F
	DB	'Jumat',$0F
	DB	'Sabtu',$0F
	
Nama_Bulan:
	DB	$0F,'Januari',$0F
	DB	'Februari',$0F
	DB	'Maret',$0F
	DB	'April',$0F
	DB	'Mei',$0F
	DB	'Juni',$0F
	DB	'Juli',$0F
	DB	'Agustus',$0F
	DB	'September',$0F
	DB	' ',$0F,' ',$0F,' ',$0F,' ',$0F,' '$0F,' ',$0F
	DB	'Oktober',$0F
	DB	'Nopember',$0F
	DB	'Desember',$0F

Alarm_Message
	DB	'Alarm Aktif',0DH,0AH,0FH

Pesan_SetWaktu:
	DB	'Set Waktu',0DH,0AH,0FH

Pesan_SetAlarm
	DB	'Set Alarm',0DH,0AH,0FH

