;Setting Delay                  : R2
;Setting Timer                  : R3
;Mode                           : R4
;Delay On Stretching the Wing   : R5-R7
;Delay                          : R6
;Long Delay                     : R6-R7




First:
        Clr P3.4
        Clr P3.5
        Clr P1.0
        Clr P1.1
	Mov R0,#00h
	Mov R1,#00h
	Mov R2,#00h
	Mov R3,#00h
	Mov R4,#00h
	Mov R5,#00h
	Mov R6,#00h
	Mov R7,#00h
	
	
        Mov 30h,#33h
        Acall Long_Delay

        Lcall Init_LCD

        Mov Dptr,#FF0Ah                 ;Inisialisasi RTC
        Mov A,#20h
	Movx @Dptr,A

        Mov Dptr,#FF0Bh                 ;Inisialisasi RTC
        Mov A,#06h
	Movx @Dptr,A


Start:
        Mov Dptr,#Judul_1
        Acall Write_Sentence

        Acall Long_Delay
        
        Mov Dptr,#FF00h
        Mov A,#00h
	Movx @Dptr,A
        Acall Two_Seconds_Delay
        Acall Two_Seconds_Delay
        Acall Two_Seconds_Delay
        Acall Two_Seconds_Delay
 
Scrolling_Text:
        Mov Dptr,#Judul_2

Scrolling_Text_1:
        Mov A,P1
        Anl A,#F0h
        Cjne A,#F0h,Enter_To_Menu
        Mov A,#16
        Movc A,@A+Dptr
        Jz Scrolling_Text
        Acall Write_Sentence
        Inc Dptr
        Acall Two_Seconds_Delay
        Sjmp Scrolling_Text_1

Enter_To_Menu:
        Mov A,P1
        Anl A,#F0h
        Cjne A,#F0h,Enter_To_Menu

Menu:
        Mov R2,#00h
        Mov R3,#00h
        Mov R4,#00h
        Mov Dptr,#Title_1
        Acall Write_Sentence
        Acall Write_Delay

Check_Delay_Up:
        Jb P1.4,Check_Delay_Down
        Cjne R4,#00h,Timer_Up
        Cjne R2,#60,Inc_R2
        Mov R2,#00h
        Acall Write_Delay
        Sjmp Check_Delay_Up

Inc_R2:
        Inc R2
        Acall Write_Delay
        Jnb P1.4,$
        Sjmp Check_Delay_Up

Manual_Open:
        Mov Dptr,#Sentence_Manual_Open
        Acall Write_Sentence

MO_1:
        Jb P1.4,Manual_Complete
        Jnb P1.2,Manual_Complete
        Setb P1.0
        Acall Long_Delay
        Clr P1.0
        Sjmp MO_1

Manual_Close:
        Mov Dptr,#Sentence_Manual_Close
        Acall Write_Sentence

MC_1:
        Jb P1.5,Manual_Complete
        Jnb P1.3,Manual_Complete
        Setb P1.1
        Acall Long_Delay
        Clr P1.1
        Sjmp MC_1


Manual_Complete:
        Jnb P1.4,$
        Jnb P1.5,$
CDU:
        Sjmp Check_Delay_Up


Check_Delay_Down:
        Jb P1.5,Check_Mode
        Cjne R4,#00h,Timer_Down
        Cjne R2,#00,Dec_R2
        Mov R2,#60
        Acall Write_Delay
        Sjmp Check_Delay_Up

Dec_R2:
        Dec R2
        Acall Write_Delay
        Jnb P1.5,$
        Sjmp Check_Delay_Up

Timer_Up:
        Cjne R4,#01h,Manual_Open
        Cjne R3,#240,Inc_R3
        Mov R3,#00h
        Acall Write_Timer
        Jnb P1.4,$
        Sjmp Check_Delay_Up

Inc_R3:
        Inc R3
        Acall Write_Timer
        Jnb P1.4,$
        Sjmp Check_Delay_Up

Timer_Down:
        Cjne R4,#01h,Manual_Close
        Cjne R3,#00,Dec_R3
        Mov R3,#240
        Acall Write_Timer
        Jnb P1.5,$
        Ajmp Check_Delay_Up

Dec_R3:
        Dec R3
        Acall Write_Timer
        Jnb P1.5,$
        Ajmp Check_Delay_Up

Check_Start:
        Jb P1.7,Reset_RTC
        Acall Delay
        Jnb P1.7,$
        Cjne R2,#00h,Check_Valid_Timer
        Mov Dptr,#Error_Setting
        Acall Write_Sentence
        Acall Two_Seconds_Delay
        Acall Two_Seconds_Delay
        Acall Two_Seconds_Delay
        Acall Two_Seconds_Delay
        Ajmp Enter_To_Menu


Check_Mode:
        Jb P1.6,Check_Start
        Cjne R4,#00h,Switch_To_Manual_Mode
        Mov R4,#01h
        Mov Dptr,#Title_2
        Acall Write_Sentence
        Acall Write_Timer

Check_For_Three_Seconds:
        Mov Dptr,#FF00h
        Mov A,#00h
	Movx @Dptr,A

Wait_Three_Seconds:
        Mov Dptr,#FF00h
        Movx A,@Dptr
        Cjne A,#03h,Wait_Mode_Release
        Mov Dptr,#Title_3
        Acall Write_Sentence
        Acall Show_Total_Time
        Jnb P1.6,$
        Mov Dptr,#Title_1
        Acall Write_Sentence
        Mov R4,#00h
        Acall Write_Delay
        Ajmp Check_Delay_Up

Wait_Mode_Release:
        Jnb P1.6,Wait_Three_Seconds
CDU_1:
        Ajmp Check_Delay_Up

Switch_To_Manual_Mode:
        Cjne R4,#01h,Switch_To_Delay_Mode
        Mov R4,#02h
        Mov Dptr,#Sentence_Manual
        Acall Write_Sentence
        Sjmp Check_For_Three_Seconds

Switch_To_Delay_Mode:
        Mov R4,#00h
        Mov Dptr,#Title_1
        Acall Write_Sentence
        Acall Write_Delay
        Sjmp Check_For_Three_Seconds

Reset_RTC:
        Jb P3.2,CDU_1
        Mov Dptr,#FF10h
        Mov A,#00h
        Movx @Dptr,A
        Inc Dptr
        Movx @Dptr,A
        Inc Dptr
        Movx @Dptr,A
        Mov Dptr,#Title_3
        Acall Write_Sentence
        Jnb P3.2,$
        Ajmp Menu

Check_Valid_Timer:
        Cjne R3,#00h,Open
        Mov Dptr,#Error_Setting
        Acall Write_Sentence
        Acall Two_Seconds_Delay
        Acall Two_Seconds_Delay
        Acall Two_Seconds_Delay
        Acall Two_Seconds_Delay
        Ajmp Enter_To_Menu

Open:
        Mov Dptr,#Sentence_Open
        Acall Write_Sentence
        
        Mov Dptr,#FF00h
        Mov A,#00h
        Movx @Dptr,A

Open_Process:
	Setb P1.0
	Clr P1.1
        Acall Long_Delay
	Clr P1.0
        Jnb P1.2,Open_Complete
        Mov Dptr,#FF00h
        Movx A,@Dptr
        Cjne A,#30,Open_Process

        Mov Dptr,#Error_Arm_Open
        Acall Write_Sentence

        Setb P3.5
        Acall Two_Seconds_Delay
        Clr P3.5
        Acall Long_Delay
        Setb P3.5
        Acall Long_Delay
        Clr P3.5
        Acall Two_Seconds_Delay
        Setb P3.5
        Acall Long_Delay
        Clr P3.5
        Sjmp $

        
Open_Complete:
        Mov A,R2
        Mov 31h,A
        Mov 32h,#00h

        Mov Dptr,#FF00h
        Mov A,#00h
        Movx @Dptr,A

Show_Delay:
        Mov Dptr,#Title_1
        Acall Write_Sentence
        Acall Write_Delay

Delay_Process:
        Mov Dptr,#FF00h
        Movx A,@Dptr
        Mov B,32h
        Cjne A,B,Delay_Process_1
        Sjmp Delay_Process

Delay_Process_1:
        Mov 32h,A
        Djnz R2,Show_Delay

        Mov A,31h
        Mov R2,A

        Mov A,R3
        Mov 31h,A
        Setb P3.4
        
        Mov Dptr,#FF00h
        Mov A,#00h
        Movx @Dptr,A
        Mov Dptr,#FF02h
        Mov A,#00h
        Movx @Dptr,A
        Mov Dptr,#FF04h
        Mov A,#00h
        Movx @Dptr,A

        Mov 32h,#00h

UV_On:
        Mov Dptr,#Title_2
        Acall Write_Sentence
        Acall Write_Timer

Timer_Process:
        Mov Dptr,#FF00h                 ;XXXXXXXXXXXX harusnya FF02h
        Movx A,@Dptr
        Mov B,32h
        Cjne A,B,Timer_Process_1
        Sjmp Timer_Process

Timer_Process_1:
        Mov 32h,A
        Djnz R3,UV_On

        Clr P3.4
        Mov A,31h
        Mov R3,A


Store_Total:
        Mov A,R3
        Mov B,#60
        Div AB                  ;Jam di A, Menit di B
        Mov 50h,A               ;Jam disimpan di 50h
        Mov Dptr,#FF10h		;Jumlahkan menit di B dengan di 10h
        Movx A,@Dptr
        
        Add A,B                 ;Menit di A
        Cjne A,#60,XX

YY:
        Subb A,#60              ;Jika Hasil >= 60 
        Mov B,50h
        Inc B
        Mov 50h,B
        Sjmp ZZ

XX:
        Jnc YY

ZZ:
        Mov Dptr,#FF10h		;Simpan menit di 10h
	Movx @Dptr,A

        Mov B,50h
        Mov Dptr,#FF11h
        Movx A,@Dptr 
        Add A,B
	Movx @Dptr,A

        Jnc Close

        Mov Dptr,#FF12h
        Movx A,@Dptr 
        Inc A
        Movx @Dptr,A

Close:
        Mov Dptr,#Sentence_Close
        Acall Write_Sentence

        Mov Dptr,#FF00h
	Mov A,#00h
        Movx @Dptr,A

Close_Process:
	Setb P1.1
        Clr P1.0
        Acall Long_Delay
	Clr P1.1
        Jnb P1.3,Check_3000
        Mov Dptr,#FF00h
        Movx A,@Dptr
        Cjne A,#30,Close_Process

        Mov Dptr,#Error_Arm_Close
        Acall Write_Sentence

        Setb P3.5
        Acall Two_Seconds_Delay
        Clr P3.5
        Acall Long_Delay
        Setb P3.5
        Acall Long_Delay
        Clr P3.5
        Acall Two_Seconds_Delay
        Setb P3.5
        Acall Long_Delay
        Clr P3.5
        Sjmp $
        
Check_3000:
        Mov Dptr,#FF12h
        Movx A,@Dptr
        Cjne A,#0Bh,High_Hour_Not_0B
        Mov Dptr,#FF11h
        Movx A,@Dptr
        Cjne A,#B8h,Low_Hour_Not_B8

Expired:
        Mov Dptr,#Display_Expired
        Acall Write_Sentence
        Sjmp $

Low_Hour_Not_B8:
        Jc Back
        Sjmp Expired


High_Hour_Not_0B:
        Jnc Expired

Back:
        Ajmp Enter_To_Menu


Show_Total_Time:
	Acall Delay
        Mov P2,#8Ah
        Clr P3.0
        Clr P3.1
        Nop
        Setb P3.1
        Acall Delay

        Mov Dptr,#FF11h
        Movx A,@Dptr
        Mov 43h,A
        Mov Dptr,#FF12h
        Movx A,@Dptr
        Mov 44h,A
        Acall Bin_To_BCD

        Mov A,48h
        Acall Write_LCD
        Mov A,47h
        Acall Write_LCD
        Mov A,46h
        Acall Write_LCD
        Mov A,45h
        Acall Write_LCD

	Acall Delay

        Ret

Write_Delay:
	Acall Delay
        Mov P2,#89h
        Clr P3.0
        Clr P3.1
        Nop
        Setb P3.1
        Acall Delay

        Mov A,R2
        Mov B,#0Ah
        Div AB
        Add A,#30h
        Mov P2,A
        Setb P3.0
        Clr P3.1
        Nop
        Setb P3.1
        Acall Delay
        
        Mov A,B
        Add A,#30h
        Mov P2,A
        Setb P3.0
        Clr P3.1
        Nop
        Setb P3.1
        Acall Delay
     
        Ret

Write_Timer:
        Acall Delay
        Mov P2,#88h
        Clr P3.0
        Clr P3.1
        Nop
        Setb P3.1
        Acall Delay

        Mov A,R3
        Mov B,#60
        Div AB
        Add A,#30h
        Mov P2,A
        Setb P3.0
        Clr P3.1
        Nop
        Setb P3.1
        Acall Delay

        Mov P2,#':'
        Setb P3.0
        Clr P3.1
        Nop
        Setb P3.1
        Acall Delay

        Mov A,B
        Mov B,#0Ah
        Div AB
        Add A,#30h
        Mov P2,A
        Setb P3.0
        Clr P3.1
        Nop
        Setb P3.1
        Acall Delay

        Mov A,B
        Add A,#30h
        Mov P2,A
        Setb P3.0
        Clr P3.1
        Nop
        Setb P3.1
        Acall Delay
        Ret


ClearLCD:
        Acall Baris_1
        Mov R7,#10h

ClearLCD_1:
        Mov  A,#20h
        Acall Write_LCD
        Djnz R7,ClearLCD_1
	Ret
	

Two_Seconds_Delay:
        Mov B,#40h
TS:
        Acall Long_Delay
        Djnz B,TS
        Ret

Long_Delay:
        Mov R7,#10h
Long:
        Acall Delay
        Djnz R7,Long
        Ret

Delay:
        Mov R6,#FFh
        Djnz R6,$
        Ret


Baris_1:
        Mov P2,#80h
        Clr P3.0
        Clr P3.1
        Nop
        Setb P3.1
        Acall Delay
        Ret

Baris_2:
        Mov P2,#C0h
        Clr P3.0
        Clr P3.1
        Nop
        Setb P3.1
        Acall Delay
        Ret

Init_LCD:
        Mov P2,#01h
        Clr P3.0
        Clr P3.1
        Nop
        Setb P3.1
        Acall Long_Delay

        Mov P2,#0Ch
        Clr P3.0
        Clr P3.1
        Nop
        Setb P3.1
        Acall Long_Delay

        Mov P2,#38h
        Clr P3.0
        Clr P3.1
        Nop
        Setb P3.1
        Acall Long_Delay

        Mov P2,#06h
        Clr P3.0
        Clr P3.1
        Nop
        Setb P3.1
        Acall Long_Delay
        Ret

Write_LCD:
        Mov P2,A
        Setb P3.0
        Clr P3.1
        Nop
        Setb P3.1
        Acall Delay
        Ret

Write_Sentence:
        Acall Baris_1
        Mov R7,#00h
Write_Sentence_1:
        Mov A,R7
        Movc A,@A+Dptr
        Acall Write_LCD
        Inc R7
        Cjne R7,#10h,Write_Sentence_1
	Ret



Bin_To_BCD:
;===================================================
;Source         43h-44h
;Destination    40h-42h
;Another used   B
;===================================================
        Mov B,#10h
        Mov 40h,#00h
        Mov 41h,#00h
        Mov 42h,#00h

Ab:
        Mov A,43h
        Clr C
        Rlc A
        Mov 43h,A
        Mov A,44h
        Rlc A
        Mov 44h,A
        Mov A,40h
        Rlc A
        Mov 40h,A
        Mov A,41h
        Rlc A
        Mov 41h,A
        Mov A,42h
        Rlc A
        Mov 42h,A
        Djnz B,Ac

        Mov A,40h
        Anl A,#0Fh
        Add A,#30h
        Mov 45h,A

        Mov A,40h
        Swap A
        Anl A,#0Fh
        Add A,#30h
        Mov 46h,A

        Mov A,41h
        Anl A,#0Fh
        Add A,#30h
        Mov 47h,A

        Mov A,41h
        Swap A
        Anl A,#0Fh
        Add A,#30h
        Mov 48h,A

        Mov A,42h
        Anl A,#0Fh
        Add A,#30h
        Mov 49h,A

        Ret

Ac:
        Mov R0,#43h
Ad:
        Dec R0
        Mov A,@R0
        Add A,#03h
        Jnb A.3,Ae
        Mov @R0,A
Ae:
        Mov A,@R0
        Add A,#30h
        Jnb A.7,Af
        Mov @R0,A
Af:
        Cjne R0,#40h,Ad
        Sjmp Ab



BCD_To_Bin:
;=============================
;Source         40h-44h
;Destination    45-46h
;Another        47h-48h
;=============================

;Kali 10000
        Mov A,44h
        Cjne A,#00h,Cek_1
        Mov 45h,#00h
        Mov 46h,#00h
        Sjmp Kali_1000

Cek_1:
        Cjne A,#01h,Cek_2
        Mov 45h,#10h
        Mov 46h,#27h
        Sjmp Kali_1000

Cek_2:
        Cjne A,#02h,Cek_3
        Mov 45h,#20h
        Mov 46h,#4Eh
        Sjmp Kali_1000

Cek_3:
        Cjne A,#03h,Cek_4
        Mov 45h,#30h
        Mov 46h,#75h
        Sjmp Kali_1000

Cek_4:
        Cjne A,#04h,Cek_5
        Mov 45h,#40h
        Mov 46h,#9Ch
        Sjmp Kali_1000

Cek_5:
        Cjne A,#05h,Cek_6
        Mov 45h,#50h
        Mov 46h,#C3h
        Sjmp Kali_1000

Cek_6:
        Mov 45h,#60h
        Mov 46h,#EAh

Kali_1000:
        Mov A,43h
        Mov B,#4
        Mul AB
        Mov B,#250
        Mul AB

        Mov 47h,A
        Mov 48h,B

        Mov A,47h
        Mov B,45h
        Add A,B
        Mov 45h,A

        Mov A,46h
        Mov B,48h
        Addc A,B
        Mov 46h,A

;Kali 100
        Mov A,42h
        Mov B,#100
        Mul AB
        Mov 47h,A
        Mov 48h,B

        Mov A,47h
        Mov B,45h
        Add A,B
        Mov 45h,A

        Mov A,48h
        Mov B,46h
        Addc A,B
        Mov 46h,A

;Kali 10
        Mov A,41h
        Mov B,#10
        Mul AB
        Mov 47h,A
        Mov 48h,B

        Mov A,47h
        Mov B,45h
        Add A,B
        Mov 45h,A

        Mov A,48h
        Mov B,46h
        Addc A,B
        Mov 46h,A

        Mov A,40h
        Mov B,45h
        Add A,B
        Mov 45h,A
        Mov A,46h
        Addc A,#0
        Mov 46h,A

        Ret

Judul_1:                Db 'UV STERILISATOR '
Judul_2:                Db '                Designed by Mhd. Paisal Hasibuan.                 ',0
Title_1:                Db '   DELAY 00  S  '
Title_2:                Db ' TIMER 00:00 HM '
Title_3:                Db 'OPERATION 0000 H'
Error_Setting:          Db ' ERROR SETTING! '
Display_Delay:          Db '   DELAY 60  S  '
Display_Timer:          Db ' TIMER  2:15 HM '
Error_Arm_Open:         Db '   OPEN ERROR   '
Error_Arm_Close:        Db '  CLOSE ERROR   '
Display_Expired:        Db '  LAMP EXPIRED  '
Sentence_Open:          Db '     OPEN       '
Sentence_Close:         Db '     CLOSE      '
Sentence_Manual:        Db '    MANUAL      '
Sentence_Manual_Open:   Db '  MANUAL OPEN   '
Sentence_Manual_Close:  Db '  MANUAL CLOSE  '
