;------------------------------------------ ;;;;;;;;;;;;;; Era 2 Solar Date Converter (Edition by Majic) ;;;; ;;======================================================== ORG 0000 JMP main ;... ;... ;... FLG0 EQU 00h ;General Flag LPYR EQU 01H ;Leap year Flag BUF1 EQU 30H ;4 BYTEs RAM BUFFER [30H-33H] DAY EQU 34H MONTH EQU 35H YEAR EQU 36H ;... ;... ;... ;------------------------------------------ ;============== MAIN PROGRAM ============= main: ;.... ;.... your program ;.... ;========================================================= ;;;;;;;;;;;;;; FOR EXAMPLE 2007/12/13 -->1386/09/22 ;;;;;; ;;======================================================== mov YEAR,#07h ; mov MONTH,#12h ;For test mov DAY,#13h ; ;... ;... ;... ;; If your program reads Date information from RTC ,Date information must write inside ;; YEAR[36H]-MONTH[35H]-DAY[34H] locatoin ,in Binary-Coded Decimal(BCD)format ;; Of course most RTCs(like Ds1307-Ds1302 ,..) provide Date information in BCD format. ;; CALL RTC_GET_TIME ;;;(&YEAR,&MONTH,&DAY) call CONVERT_DATE ;;;; Converted Date available inside YEAR[36H]-MONTH[35H]-DAY[34]location ;;;; Also Shamsi date available inside: R5(YEARSH)-R6(MONTHSH)- R7(DAYSH) ;... ;... ;... jmp $ ;================== END OF MAIN PROGRAM ============= ;==================================================== ;*************** CONVERT_DATE Subroutine ********** ;;;; INPUT: YEAR[MILADY] - MONTH[MILADY] - DAY[MILADY] ;;;; OUTPUT:YEAR(SHAMSI) - MONTH(SHAMSI) - DAY(SHAMSI) ;;;; Also : R5(YEARSH)-R6(MONTHSH)- R7(DAYSH) ;;;; Used Registers: A,B,R0,R1,R2,R5,R6,R7 ;===================================================== CONVERT_DATE: PUSH A PUSH B PUSH 00H PUSH 01H PUSH 02H ; PUSH 05H ; PUSH 07H ; PUSH 06H MOV DPTR,#MILADY MOV A,MONTH CALL DTOB MOV R6,A CALL SUM_DAYS CALL CHECK_LEAP CALL ADD_DAYS CALL YEAR_CONVERT MOV YEAR,A MOV R5,A CALL DEF_SHAMSYDAYS CALL COUNT_DAYS JNB LPYR,CD1 MOV R6,#12 MOV R7,#30 CD1: MOV MONTH,R6 MOV DAY,R7 MOV A,YEAR ; CALL HTOB MOV YEAR,A MOV A,MONTH ; CALL HTOB MOV MONTH,A MOV A,DAY ; CALL HTOB MOV DAY,A ; POP 07H ; POP 06H ; POP 05H POP 02H POP 01H POP 00H POP B POP A RET ;----------------------------- CHECK_LEAP: CLR LPYR MOV A,YEAR CALL DTOB MOV YEAR,A MOV B,#4 DIV AB MOV A,B JNZ CK2 MOV A,R6 CLR C SUBB A,#3 JC CK3 CK1: MOV A,DAY INC A MOV DAY,A JMP CK3 CK2: CJNE A,#1,CK3 MOV A,R6 CLR C SUBB A,#3 JC CK1 JNZ CK3 MOV A,DAY CLR C SUBB A,#20H JC CK1 JNZ CK3 SETB LPYR CK3: MOV A,DAY CALL DTOB MOV BUF1+0,A RET ;========================== YEAR_CONVERT: MOV A,YEAR CLR C MOV A,BUF1+3 JNZ YE1 MOV A,BUF1+2 CJNE A,#50H,YE1 YE1: MOV FLG0,C MOV A,YEAR SUBB A,#15H JNC YE2 CLR C SUBB A,#9CH YE2: RET ;------------------------------- DEF_SHAMSYDAYS: JNB FLG0,SH1 MOV BUF1+1,#1 MOV BUF1+0,#1EH CALL ADD_DAYS JMP SH2 SH1: MOV BUF1+1,#0 MOV BUF1+0,#4FH CALL SUB_DAYS SH2: RET ;--------------------------------- COUNT_DAYS: MOV R6,#01 MOV BUF1+1,#00 MOV BUF1+0,#1FH CO1: MOV R7,BUF1+2 CALL SUB_DAYS JC CO3 MOV A,BUF1+3 JNZ CO2 MOV A,BUF1+2 JZ CO3 CO2: INC R6 CJNE R6,#07,CO1 MOV BUF1+0,#1EH JMP CO1 CO3: RET ;------------------------------ DTOB: MOV R7,A ANL A,#0FH XCH A,R7 ANL A,#0F0H SWAP A MOV B,#10 MUL AB ADD A,R7 RET ;-------------------------- SUM_DAYS: DEC A RL A MOV R7,A MOVC A,@A+DPTR MOV BUF1+3,A MOV A,R7 INC DPTR MOVC A,@A+DPTR MOV BUF1+2,A RET ;--------------------------------- ADD_DAYS: MOV R0,#BUF1 MOV R1,#BUF1+2 MOV R2,#02 CLR C AD1: MOV A,@R0 ADDC A,@R1 MOV @R1,A INC R0 INC R1 DJNZ R2,AD1 RET ;----------------------------------- SUB_DAYS: MOV R0,#BUF1 MOV R1,#BUF1+2 MOV R2,#02 CLR C SU1: MOV A,@R1 SUBB A,@R0 MOV @R1,A INC R0 INC R1 DJNZ R2,SU1 RET ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;; This subroutine converts the content of A register from HEX to BCD format HTOB: MOV B,#10 DIV AB SWAP A ORL A,B RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MILADY: DB 00H , 00H , 00H, 01FH,00H,3BH,00H,5AH,00H,78H DB 00H , 97H , 00H , 0B5H , 00H ,0D4H , 00H , 0F3H, 01H, 11H DB 01H,30H,01H,4EH END