元器件交易网-中发网全新升级平台
关注我们:
首页 > 技术资料 > 正文

制作单片机的万年历方法介绍

  ;真正的万年历: 84 bytes 的 51 ASM

  ;==SUB_WNL=== 万年历 ==*******

  SJ DATA 30H ; 世纪 BCD 00 TO 99

  NH DATA 31H ; 年号 BCD 00 TO 99 0000 TO 9999 年

  YF DATA 32H ; 月份 BCD 01 TO 12

  org 000h

  MOV SP, #40H

  MOV SJ, #21H ;2004-05

  MOV NH, #01H

  MOV YF, #4H

  ACALL SUB_WNL

  SJMP $

  ;===============SUB_WNL===================

  ; 入口:

  ; SJ DATA 30H ; 世纪 BCD 00 TO 99

  ; NH DATA 31H ; 年号 BCD 00 TO 99 0000 TO 9999 年

  ; YF DATA 32H ; 月份 BCD 01 TO 12

  ; 出口

  ; ACC -- 本月天数 BCD 28 to 31

  ; B -- 本月1日的星期数 1 to 6 == 星期1 to 星期6

  ; 0 -- 星期日

  ; 使用: ACC, B, R5, R6

  ; STACK: 3 bytes (不包括调用)

  ORG 50H

  SUB_WNL:

  PUSH PSW

  MOV A, SJ

  ACALL BCD2BIN_MOD4

  ; x 400年: (大周期)

  ; =146097天 = 7 * 20871 + 0 天

  ; x 100年:

  ; 000年 = 7 * 0 + 0 + 1 - 1 1 = 0 * 2 + 1 ****

  ; 100年 = 7 * 5217 + 7 + 1 - 2 2 = 1 * 2

  ; 200年 = 7 * 10435 + 7 + 1 - 4 4 = 2 * 2

  ; 300年 = 7 * 15653 + 7 + 1 - 6 6 = 3 * 2

  ; {1,2,4,6}

  MOV A, R6 ; A=R6= SJ_BIN MOD 4

  RLC A ; A=A*2+C A = {1,2,4,6} ****

  XRL A, #10000111B ; A = 87H - A ; 边界调整

  MOV R5, A ; A = {86H, 85H, 83H, 81H} ; R5: 星期

  MOV A, NH

  JZ WNL_1

  ACALL BCD2BIN_MOD4

  XCH A, R5

  SUBB A, R5 ; 0 年 ; 0 = 0 + 0 + 1 + (-1) ***

  MOV R5, A

  WNL_1:

  MOV A, YF

  ADD A, #(WNL_TAB-$-4)

  MOVC A, @A+PC

  MOV R6, A

  SWAP A

  ACALL WNL_F0; 大年对>=3月调整准备

  ADDC A, R5 ; 月调整

  MOV B, #7

  DIV AB ; B = A MOD 7

  MOV A, R6

  ACALL WNL_F0; 大年调整准备

  ADDC A, #28

  POP PSW

  RET

  WNL_TAB:

  DB 3*2 + 5 * 32+0 ;1 BIT 0 : "2月" 标志

  DB 0*2+1+1 * 32+0 ;2 ** BIT 1..2: 月大小

  DB 3*2 + 1 * 32+16 ;3 00:28 天

  DB 2*2 + 4 * 32+16 ;4 01:----

  DB 3*2 + 6 * 32+16 ;5 10: 30 天

  DB 2*2 + 2 * 32+16 ;6 11: 31 天

  DB 3*2 + 4 * 32+16 ;7 BIT 3: 0 -----

  DB 3*2 + 7 * 32+16 ;8 BIT 4: 0: 1/2月

  DB 2*2 + 3 * 32+16 ;9 1: >=3月

  WNL_F0: ; 6 BYTES ; 大年调整准备

  RRC A ;0AH

  ANL A, #07H ;0BH

  ;0CH

  ANL C, F0 ;0DH

  ;0EH

  RET ;0FH

  DB 3*2 + 5 * 32+16 ;10H BIT 5..7: 星期调整数

  DB 2*2 + 1 * 32+16 ;11H 0:---

  DB 3*2 + 3 * 32+16 ;12H 1-7: 调整数

  BCD2BIN_MOD4:

  ; 功能:A. 1 BYTES BCD TO BIN

  ; B. MOD 4

  ; C. MUL 2

  ; 入口:

  ; A : SJ OR NH

  ; F0 : 大世纪

  ; 出口

  ; ACC -- (BIN(A) 4) * 2 - (BIN(A) MOD 4) - F0

  ; R6 -- BIN(A) MOD 4

  ; C -- IIF( (BIN(A) MOD 4)=0, 1, 0 )

  ; 使用: ACC, B, R6, PSW

  ; STACK: 0 bytes (不包括调用)

  MOV R6, A ; BCD ==> BIN

  ANL A, #0F0H ; 16X+Y ==> 10X+Y

  SWAP A

  MOV B, #(256-6) ; (256-6)*X + (16X+Y)

  MUL AB ;

  ADD A, R6 ; = 256X + (10X+Y)

  MOV R6, A ; MOD4

  ANL A, #3

  XCH A, R6 ; R6 = BIN MOD 4 = {0,1,2,3}

  ; X 4年:3 * 365 + 366 = 7*209 + (-2) **

  XRL A, R6 ; A = (BIN 4)

  RR A ; A = (BIN 4 ) * 2 **

  MOV C, F0 ; 大世纪调整

  SUBB A, R6

  ;X 1 年:

  ;0 年 0 = 0 + 0 + 1 + (-1) ***

  ;1 年 366 = 7*52 + 1 + 1

  ;2 年 366 + 365 = 7*104 + 2 + 1

  ;3 年 366 + 365 + 365 = 7*156+3 + 1

  ; {-1,1,2,3}

  CJNE R6, #1, $ + 3 ; C = IIF(R6>=1, 0, 1)

  MOV F0, C ; C=1 为大年/大世纪

  RET

  ;-----------------------------

  END ;======== END OF FILE

  • 微笑
  • 流汗
  • 难过
  • 羡慕
  • 愤怒
  • 流泪