⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s52wnl.asm

📁 单片机实现的万年历
💻 ASM
📖 第 1 页 / 共 2 页
字号:
  JNB P0.3,WAITT6
  AJMP SETG11
SETGOUT:
  LCALL DISPLAY
  JNB P0.1,SETGOUT
  LCALL GENGXIAN
  MOV 32H,#80H
  MOV 31H,#00H     ;1302晶振开始振荡
  LCALL  WRITE
  MOV 32H,#8EH
  MOV 31H,#80H     ;禁止写入1302
  LCALL  WRITE
  CLR 08H
  CLR 09H
  CLR 0AH
  CLR 0BH
  CLR 0CH
  CLR 0DH
  CLR 0EH
  CLR 0FH
  CLR ET1                 ;关闪中断
  CLR TR1
  LJMP MAIN1

;;闪动调时程序~~~~~~~~~~~~~~~~~~~~~~~~~~~
INTT1:
  PUSH ACC
  PUSH PSW
GFLASH:
  CPL 0FH
  JB 0FH,GFLASH1
  MOV 7CH,4CH  ;全部显示
  MOV 7BH,4BH
  MOV 7AH,4AH
  MOV 79H,49H
  MOV 78H,48H
  MOV 77H,47H
  MOV 76H,46H
  MOV 75H,45H
  MOV 74H,44H
  MOV 73H,43H
  MOV 72H,42H
  MOV 71H,41H
  MOV 70H,40H
GFLASHOUT:
  POP PSW
  POP ACC
  RETI
GFLASH1:
  JB 0AH,GFLASH2 ;调年闪
  MOV 7CH,#0FH
  MOV 7BH,#0FH
  AJMP GFLASHOUT
GFLASH2:
  JB 0BH,GFLASH3 ;调月闪
  MOV 7AH,#0FH
  MOV 79H,#0FH
  AJMP GFLASHOUT
GFLASH3:
  JB 0CH,GFLASH4 ;调日闪
  MOV 77H,#0FH
  MOV 76H,#0FH
  AJMP GFLASHOUT
GFLASH4:
  JB 0DH,GFLASH5 ;调星期闪
  MOV 78H,#0FH
  AJMP GFLASHOUT
GFLASH5:
  JB 0EH,GFLASH6 ;调小时闪
  MOV 75H,#0FH
  MOV 74H,#0FH
  AJMP GFLASHOUT
GFLASH6:
  MOV 73H,#0FH  ;调分钟闪
  MOV 72H,#0FH
  AJMP GFLASHOUT

;加一程序~~~~~~~~~~~~~~~~~~~~~~~~~

ADD1:
  MOV A,R7
  ADD A,#1
  DA A
  RET
;减一程序~~~~~~~~~~~~~~~~~~~~~~~~~
JIAN1:
  MOV A,R7
  DEC A
  CJNE A,#4FH,KK1
  MOV A,#49H
KK1:
  CJNE A,#3FH,KK2
  MOV A,#39H
KK2:
  CJNE A,#2FH,KK3
  MOV A,#29H
KK3:
  CJNE A,#1FH,KK4
  MOV A,#19H
KK4:
  CJNE A,#0FH,KK5
  MOV A,#09H
KK5:
  RET

;分离程序~~~~~~~~~~~~~~~~~~~~~~~~~

DIVIDE:
  MOV A,R0
  ANL A,#0FH
  MOV R1,A
  MOV A,R0
  SWAP A
  ANL A,#0FH
  MOV R2,A
  RET

;写1302程序~~~~~~~

WRITE:
  CLR SCLK
  NOP
  SETB RST
  NOP
  MOV A,32H
  MOV R4,#8
WRITE1:
  RRC A     ;送地址给1302
  NOP
  NOP
  CLR SCLK
  NOP
  NOP
  NOP
  MOV IO,C
  NOP
  NOP
  NOP
  SETB SCLK
  NOP
  NOP
  DJNZ R4,WRITE1
  CLR SCLK
  NOP
  MOV A,31H
  MOV R4,#8
WRITE2:
  RRC A
  NOP     ;送数据给1302
  CLR SCLK
  NOP
  NOP
  MOV IO,C
  NOP
  NOP
  NOP
  SETB SCLK
  NOP
  NOP
  DJNZ R4,WRITE2
  CLR RST
  RET

;读1302程序~~~~~~~~~~~~~~~~~~~~~~~~~

READ:
  CLR SCLK
  NOP
  NOP
  SETB RST
  NOP
  MOV A,32H
  MOV R4,#8
READ1:
  RRC A    ;送地址给1302
  NOP
  MOV IO,C
  NOP
  NOP
  NOP
  SETB SCLK
  NOP
  NOP
  NOP
  CLR SCLK
  NOP
  NOP
  DJNZ R4,READ1
  MOV R4,#8
READ2:
  CLR SCLK
  NOP    ;从1302中读出数据
  NOP
  NOP
  MOV C,IO
  NOP
  NOP
  NOP
  NOP
  NOP
  RRC A
  NOP
  NOP
  NOP
  NOP
  SETB SCLK
  NOP
  DJNZ R4,READ2
  MOV 31H,A
  CLR RST
  RET
;BCD码转换为10进制程序~~~~~

BCD_10:
  MOV A,R0
  ANL A,#0FH
  MOV R1,A  ;高位×10, 加低位
  MOV A,R0
  SWAP A
  ANL A,#0FH
  MOV B,#10
  MUL AB
  ADD A,R1
  MOV R0,A
  RET

;查一年数据程序~~~~~~~~~~~~~~~~

CHECKMONTH:
  LCALL BCD_10
  MOV A,R0
  MOV B,#04
  MUL AB
  MOV R1,A
  MOV DPTR,#TAB
  MOVC A,@A+DPTR
  MOV R7,A   ;第一字节送R7
  INC R1
  MOV A,R1
  MOVC A,@A+DPTR
  MOV R6,A  ;第二字节送R6
  INC R1
  MOV A,R1
  MOVC A,@A+DPTR
  MOV R5,A   ;第三字节送R6
  INC R1
  MOV A,R1
  MOVC A,@A+DPTR
  MOV R4,A  ;第四字节送R4
  RET



;;;;;自动更新农历;;;
                        ;;;;;;;;;;;;;;;;;;;;
              GENGXIAN:    MOV R2,#00H
	                   MOV R3,#00H
                           MOV A,month
                           CJNE A,#01H,GM2
                           MOV R0,day   ;当前月为一月
                           LCALL BCD_10 ;当前日转换为10进制,送R2
                           MOV A,R0
                           MOV R2,A
                           AJMP TIAOZHENG1
                   GM2:  CJNE A,#02H,GM3
                           MOV R0,day    ;当前月为二月
                           LCALL BCD_10 ;;当前日转换为10进制,
                           MOV A,R0      ;再加31,送R2
                           ADD A,#31
                           MOV R2,A
                           AJMP TIAOZHENG1
                    GM3: CJNE A,#03H,GM4
                           MOV R0,day    ;当前月为三月
                           LCALL BCD_10  ;当前日转换为10进制,
                           MOV A,R0      ;再加59,送R2
                           ADD A,#59
                           MOV R2,A
                           AJMP TIAOZHENG1
                   GM4:  CJNE A,#04H,GM5
                           MOV R0,day     ;当前月为四月
                           LCALL BCD_10   ;;当前日转换为10进制,
                           MOV A,R0       ;再加90,送R2
                           ADD A,#90
                           MOV R2,A
                           AJMP TIAOZHENG1
                    GM5: CJNE A,#05H,GM6
                           MOV R0,day     ;当前月为五月
                           LCALL BCD_10   ;当前日转换为10进制,
                           MOV A,R0       ;再加120,送R2
                           ADD A,#120
                           MOV R2,A
                           AJMP TIAOZHENG1
                    GM6: CJNE A,#06H,GM7
                           MOV R0,day     ;当前月为六月
                           LCALL BCD_10   ;当前日转换为10进制,
                           MOV A,R0       ;再加151,送R2
                           ADD A,#151
                           MOV R2,A
                           AJMP TIAOZHENG1
                    GM7: CJNE A,#07H,GM8
                           MOV R0,day     ;当前月位七月
                           LCALL BCD_10   ;当前日转换为10进制,
                           MOV A,R0       ;再加181,送R2
                           ADD A,#181
                           MOV R2,A
                           AJMP TIAOZHENG1
                     GM8:CJNE A,#08H,GM9
                           MOV R0,day     ;当前月为八月
                           LCALL BCD_10   ;当前日转换为10进制,
                           MOV A,R0       ;再加212,送R2
                           ADD A,#212
                           MOV R2,A
                           AJMP TIAOZHENG1
                     GM9:CJNE A,#09H,GM10
                           MOV R0,day    ;当前月为九月
                           LCALL BCD_10  ;当前日转换为10进制,
                           MOV A,R0      ;再加243
                           CLR C
                           ADD A,#243
                           JC GGG
                           MOV R2,A       ;A没有溢出,送R2
                           AJMP TIAOZHENG1
                   GGG:  MOV R3,#0FFH   ;A溢出,A加一送R2
                           INC A          ;R3中送#0ffh
                           MOV R2,A
                           AJMP TIAOZHENG1
                   GM10: CJNE A,#10H,GM11
                           MOV R0,day    ;当前月为10月
                           LCALL BCD_10   ;当前日转换为10进制,
                           MOV A,R0       ;再加18,送R2
                           ADD A,#18      ;R3中送#0FFH
                           MOV R2,A
                           MOV R3,#0FFH
                           AJMP TIAOZHENG1
                    GM11:CJNE A,#11H,GM12
                           MOV R0,day    ;当前月为11月
                           LCALL BCD_10  ;当前日转换为10进制,
                           MOV A,R0      ;再加49,送R2
                           ADD A,#49     ;R3中送#0FFH
                           MOV R2,A
                           MOV R3,#0FFH
                           AJMP TIAOZHENG1
                   GM12: MOV R0,day     ;当前月为12月
                           LCALL BCD_10   ;当前日转换为10进制,
                           MOV A,R0       ;再加79,送R2
                           ADD A,#79      ;R3中送#0FFH
                           MOV R2,A
                           MOV R3,#0FFH
                           AJMP TIAOZHENG1
            TIAOZHENG1: MOV A,year
                           MOV B,#04
                           DIV AB
                           MOV A,B
                           JNZ GGG1
                           MOV A,65H   ;当前年为闰年
                           CJNE A,#01H,AAAA
                           AJMP GGG1        ;当前月是1
                AAAA:   CJNE A,#02H,BBBB
                           AJMP GGG1       ;当前月是2
                BBBB:   CJNE  R2,#0FFH,GGG2
                           MOV R3,#0FFH   ;当前月不是1和2,
                           MOV R2,#01H    ;R1和R2总和加一
                           AJMP GGG1
                GGG2:   INC R2
                GGG1:   MOV R0,year    ;查一年数据
                           LCALL CHECKMONTH
                           MOV A,R2
                           CLR C
                           SUBB A,R7
                           MOV P2.7,C
                           CJNE A,#01H,GGG3
                           MOV R2,#01H
                           MOV A,R3
                           CJNE A,#00H,NEW1
                           MOV  57H,#01H   ;R2和R3总和减R7
                           MOV  56H,#01H   ;为0,则为春节
                           LJMP S_PLAY
                  GGG3:  CJNE A,#00H,GGG6
                           MOV R2,A
                           AJMP OLD
                  GGG6: JNB P2.7,NEW2
                           MOV A,R7
                           CLR C
                           SUBB A,R2
                           MOV R7,A
                           CJNE R3,#0FFH,GGG5
                           MOV A,R3
                           CLR C
                           SUBB A,R7
                           MOV R2,A
                           MOV R3,#00H
                           AJMP NEW
                  GGG5:  MOV A,R7
                           MOV R2,A
                           AJMP OLD
                   NEW1: MOV R2,#0FFH
                           MOV R3,#01H
                           AJMP NEW
                   NEW2: MOV R2,A
                           MOV A,R3
                           CJNE A,#0FFH,GGG4
                           MOV A,R2
                           MOV R3,A
                           MOV R2,#0FFH
                   GGG4: AJMP NEW

  ;OLD 农历为公历的前一年

                 OLD:    MOV A,year
                           DEC A
                           MOV R0,A
                           LCALL CHECKMONTH
                           MOV A,R2
                           CLR C
                           SUBB A,#29
                           MOV P2.7,C
                           MOV R6,A
                           MOV A,R5
                           JB ACC.0,AAA ;12月为小月,转到AAA
                           MOV A,R2
                           CLR C
                           SUBB A,#30
                           MOV P2.7,C
                           MOV R6,A
                     AAA:MOV A,R6
                           CJNE A,#00H,BBB
                           MOV 56H,#29H ;为0,则为11月最后一天
                           MOV A,R5    ;小月为11月29
                           JB ACC.1,CCC
                           MOV 56H,#30H  ;大月为11月30
                     CCC:MOV 57H,#11H
                           LJMP S_PLAY
                     BBB:JNB P2.7, DDD
                           MOV A,#29  ; CY位置位,位12月
                           CLR C
                           SUBB A,R2
                           MOV R4,A
                           MOV A,R5
                           JB ACC.0,EEE
                           MOV A,#30
                           CLR C
                           SUBB A,R2
                           MOV R4,A
                    EEE: MOV A,R4
                           MOV R0,A
                           LCALL D_BCD
                           MOV 56H,A
                           MOV 57H,#12H
                           LJMP S_PLAY
                    DDD: MOV A,#29 ;CY为0,为11月
                           CLR C
                           SUBB A,R4
                           MOV R1,A
                           MOV A,R5
                           JB ACC.1, FFF
                           MOV A,#30
                           CLR C
                           SUBB A,R4
                           MOV R1,A
                   FFF:   MOV A,R1
                           MOV R0,A
                           LCALL D_BCD
                           MOV 56H,A
                           MOV 57H,#11H
                           LJMP S_PLAY
 ;NEW此时R2中的值为FFH时

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -