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

📄 1.asm

📁 万年历电路 里面有程序和图纸
💻 ASM
📖 第 1 页 / 共 3 页
字号:
 STATE2KEY2MONTH:
 JNB 3AH, STATE2KEY2DATE
 ACALL MONTHADJUST
 AJMP KEYSTATE2RET
 STATE2KEY2DATE:
 JNB 3BH, KEYSTATE2RET
 ACALL DATEADJUST
 AJMP KEYSTATE2RET
 STATE2KEY3:
 JNB 33H, KEYSTATE2RET
 JNB 38H, STATE2KEY3YEAR ;按键3,RIGHT
 MOV 27H, #00100010B
 AJMP KEYSTATE2RET
 STATE2KEY3YEAR:
 JNB 39H, STATE2KEY3MONTH
 MOV 27H, #00100100B
 AJMP KEYSTATE2RET
 STATE2KEY3MONTH:
 JNB 3AH, STATE2KEY3DATE
 MOV 27H, #00101000B
 AJMP KEYSTATE2RET
 STATE2KEY3DATE:
 JNB 3BH, KEYSTATE2RET
 MOV 27H, #00100001B
 ;AJMP KEYSTATE2RET
 KEYSTATE2RET:
 MOV PSW, #00010000B ;使用第二组寄存器
 MOV A, 09H         ;设置计算总天数程序的入口参数,(年-1925)送R2
 SUBB A, #85H       ;1925D=785H
 MOV R2, A
 MOV R3, 0AH        ;月送R3
 MOV R4, 0BH        ;日送R4
 LCALL CALCULATETOTALDAYS ;计算距离1925年1月1日的总天数
 MOV 0CH, R6        ;计算结果送0CH、0DH单元保存
 MOV 0DH, R7
 LCALL SETWEEKDAYS  ;计算星期几
 MOV A, R5
 SWAP A
 ANL 26H, #00FH
 ORL 26H, A         ;计算结果送26H单元高四位保存
 MOV R4, 0CH        ;计算农历日期程序入口参数,总天数送R4、R5
 MOV R5, 0DH
 LCALL LUNARDATECALULATE
 MOV 0FH, R7        ;
 MOV 0EH, R4        ;
 RET
 KEYSTATE3:
 ;状态3按键处理,时间调整设置状态
 MOV PSW, #00011000B
 STATE3KEY0:
 JNB 30H, STATE3KEY1
 MOV 27H, #00H ;按键0,SET
 JNB 04H, STATE3KEY01
 MOV A, R4 ;重新计算当天分钟数
 MOV B, #60
 MUL AB
 ADD A, R5
 MOV 33H, A
 MOV A, B
 ADDC A, #0
 MOV 32H, A
 MOV R6, #0 ;秒清零
 CLR 04H
 STATE3KEY01:
 SETB 05H ;设置农历日期计算请求标识
 AJMP KEYSTATE3RET
 STATE3KEY1:
 JNB 31H, STATE3KEY2
 JNB 38H, STATE3KEY1MONTH ;按键1,UP
 MOV B, #1
 ACALL YEARADJUST
 AJMP KEYSTATE3RET
 STATE3KEY1MONTH:
 JNB 39H, STATE3KEY1DATE
 ACALL MONTHADJUST
 AJMP KEYSTATE3RET
 STATE3KEY1DATE:
 JNB 3AH, STATE3KEY1HOUR
 ACALL DATEADJUST
 AJMP KEYSTATE3RET
 STATE3KEY1HOUR:
 JNB 3BH, STATE3KEY1MINUTE
 ACALL HOURADJUST
 AJMP KEYSTATE3RET
 STATE3KEY1MINUTE:
 ACALL MINUTEADJUST
 AJMP KEYSTATE3RET
 STATE3KEY2:
 JNB 32H, STATE3KEY3
 JNB 38H, STATE3KEY2MONTH ;按键2,DOWN
 MOV B, #1
 ACALL YEARADJUST
 AJMP KEYSTATE3RET
 STATE3KEY2MONTH:
 JNB 39H, STATE3KEY2DATE
 ACALL MONTHADJUST
 AJMP KEYSTATE3RET
 STATE3KEY2DATE:
 JNB 3AH, STATE3KEY2HOUR
 ACALL DATEADJUST
 AJMP KEYSTATE3RET
 STATE3KEY2HOUR:
 JNB 3BH, STATE3KEY2MINUTE
 ACALL HOURADJUST
 AJMP KEYSTATE3RET
 STATE3KEY2MINUTE:
 ACALL MINUTEADJUST
 AJMP KEYSTATE3RET
 STATE3KEY3:
 JNB 33H, KEYSTATE3RET
 JNB 38H, STATE3KEY3MONTH ;按键3,RIGHT
 MOV 27H, #01000010B
 AJMP KEYSTATE3RET
 STATE3KEY3MONTH:
 JNB 39H, STATE3KEY3DATE
 MOV 27H, #01000100B
 AJMP KEYSTATE3RET
 STATE3KEY3DATE:
 JNB 3AH, STATE3KEY3HOUR
 MOV 27H, #01001000B
 AJMP KEYSTATE3RET
 STATE3KEY3HOUR:
 JNB 3BH, STATE3KEY3MINUTE
 MOV 27H, #01000000B
 AJMP KEYSTATE3RET
 STATE3KEY3MINUTE:
 MOV 27H, #01000001B
 ;AJMP KEYSTATE3RET
 KEYSTATE3RET:
 RET
 KEYSTATE4:
 ;状态4按键处理,闹钟响铃状态
 MOV A, 27H
 ANL A, #03H
 MOV R0, A
 MOV A, #28H
 ADD A, R0
 ADD A, R0
 MOV R0, A
 MOV A, @R0
 CLR ACC.6
 SETB ACC.5
 MOV @R0, A
 CLR P1.7
 MOV 27H, #00H
 RET
 YEARADJUST:
 ;调整年份,1年增量、10年增量,增量值存在B寄存器中,大于2099及小于1925循环调整
 JB 31H, YEARADD
 JB 32H, YEARSUBB
 AJMP YEARADJUSTRET
 YEARADD:
 MOV A, R1
 ADD A, B
 MOV R1, A
 MOV A, #0
 ADDC A, R0
 MOV R0, A
 MOV A, #033H ;(2099<-->833H)
 CLR C
 SUBB A, R1
 MOV A, #08H
 SUBB A, R0
 JNC YEARADJUSTRET
 MOV R0, #07H ;(1925<-->785H)
 MOV R1, #85H
 AJMP YEARADJUSTRET
 YEARSUBB:
 MOV A, R1
 CLR C
 SUBB A, B
 MOV R1, A
 MOV A, R0
 SUBB A, #0
 MOV R0, A
 MOV A, R1
 CLR C
 SUBB A, #85H
 MOV A, R0
 SUBB A, #07H
 JNC YEARADJUSTRET
 MOV R0, #08H
 MOV R1, #33H
 ;AJMP YEARADJUSTRET
 YEARADJUSTRET:
 MOV A, #28
 CLR C
 SUBB A, R3
 JNC YEARADJUSTRET2
 MOV R3, #28
 YEARADJUSTRET2:
 RET
 MONTHADJUST:
 ;月份调整,增量1,超12及小于1循环
 JB 31H, MONTHADD
 JB 32H, MONTHSUBB
 AJMP MONTHADJUSTRET
 MONTHADD:
 INC R2
 CJNE R2, #13, MONTHADJUSTRET
 MOV R2, #1
 AJMP MONTHADJUSTRET
 MONTHSUBB:
 DEC R2
 CJNE R2, #0, MONTHADJUSTRET
 MOV R2, #12
 ;AJMP MONTHADJUSTRET
 MONTHADJUSTRET:
 MOV A, #28
 CLR C
 SUBB A, R3
 JNC MONTHADJUSTRET2
 MOV R3, #28
 MONTHADJUSTRET2:
 RET
 DATEADJUST:
 ;计算当月的天数
 CJNE R2, #1, DATE02
 MOV 06H, #31
 AJMP DATE13
 DATE02:
 CJNE R2, #2, DATE03
 MOV A, R1 ;计算当年-1925年
 CLR C
 SUBB A, #84H ;
 MOV B, #4
 DIV AB
 MOV A, B
 JZ DATE029
 MOV 06H, #28
 AJMP DATE13
 DATE029:
 MOV 06H, #29
 AJMP DATE13
 DATE03:
 CJNE R2, #3, DATE04
 MOV 06H, #31
 AJMP DATE13
 DATE04:
 CJNE R2, #4, DATE05
 MOV 06H, #30
 AJMP DATE13
 DATE05:
 CJNE R2, #5, DATE06
 MOV 06H, #31
 AJMP DATE13
 DATE06:
 CJNE R2, #6, DATE07
 MOV 06H, #30
 AJMP DATE13
 DATE07:
 CJNE R2, #7, DATE08
 MOV 06H, #31
 AJMP DATE13
 DATE08:
 CJNE R2, #8, DATE09
 MOV 06H, #31
 AJMP DATE13
 DATE09:
 CJNE R2, #9, DATE10
 MOV 06H, #30
 AJMP DATE13
 DATE10:
 CJNE R2, #10, DATE11
 MOV 06H, #31
 AJMP DATE13
 DATE11:
 CJNE R2, #11, DATE12
 MOV 06H, #30
 AJMP DATE13
 DATE12:
 CJNE R2, #12, DATE13
 MOV 06H, #31
 ;AJMP DATE13
 DATE13:
 JB 31H, DATEADD
 JB 32H, DATESUBB
 AJMP DATEADJUSTRET
 DATEADD:
 INC R3
 MOV A, 06H
 CLR C
 SUBB A, R3
 JNC DATEADJUSTRET
 MOV R3, #1
 AJMP DATEADJUSTRET
 DATESUBB:
 DEC R3
 CJNE R3, #0, DATEADJUSTRET
 MOV R3, 06H
 ;AJMP DATEADJUSTRET
 DATEADJUSTRET:
 RET
 HOURADJUST:
 ;小时调整,增量1,00~23有效
 JB 31H, HOURADD
 JB 32H, HOURSUBB
 AJMP HOURADJUSTRET
 HOURADD:
 INC R4
 CJNE R4, #24, HOURADJUSTRET
 MOV R4, #0
 AJMP HOURADJUSTRET
 HOURSUBB:
 MOV A, R4
 CLR C
 SUBB A, #1
 MOV R4, A
 JNC HOURADJUSTRET
 MOV R4, #23
 ;AJMP HOURADJUSTRET
 HOURADJUSTRET:
 SETB 04H
 RET
 MINUTEADJUST:
 ;分钟调整,增量1,00~59有效
 JB 31H, MINUTEADD
 JB 32H, MINUTESUBB
 AJMP MINUTEADJUSTRET
 MINUTEADD:
 INC R5
 CJNE R5, #60, MINUTEADJUSTRET
 MOV R5, #0
 AJMP MINUTEADJUSTRET
 MINUTESUBB:
 DEC R5
 CJNE R5, #0FFH, MINUTEADJUSTRET
 MOV R5, #59
 ;AJMP MINUTEADJUSTRET
 MINUTEADJUSTRET:
 SETB 04H
 RET
 SETALARMTIME:
 ;判断小时R4是否24,是取消闹钟,否则计算分钟数并设置闹钟
 MOV A, 27H ;取得当前设置闹钟时间地址
 ANL A, #03H
 MOV R0, A
 MOV A, #28H
 ADD A, R0
 ADD A, R0
 MOV R0, A
 CJNE R4, #24, SETALARMTIME1
 MOV @R0, #0  ;取消闹钟
 INC R0
 MOV @R0, #0
 AJMP SETALARMTIMERET
 SETALARMTIME1:
 INC R0   ;设置闹铃时间
 MOV A, R4
 MOV B, #60
 MUL AB
 ADD A, R5
 MOV @R0, A
 MOV A, #0
 ADDC A, B
 SETB ACC.7
 DEC R0
 MOV @R0, A
 SETALARMTIMERET:
 RET
 PRESETALARMTIME:
 ;读取当前闹钟时间,并判断是否已经设置,如果已经设置,显示已设置时间,否则显示24:00
 MOV A, 27H
 ANL A, #03H
 MOV R0, A
 MOV A, #28H
 ADD A, R0
 ADD A, R0
 MOV R0, A
 MOV A, @R0
 JNB ACC.7, PRESETALARMTIMENON
 ;MOV A, @R0
 ANL A, #0FH
 MOV R2, A
 INC R0
 MOV A, @R0
 MOV R3, A
 MOV R4, #0
 LOOPPRESETALARMTIME:
 MOV A, R3
 CLR C
 SUBB A, #60
 MOV R3, A
 MOV A, R2
 SUBB A, #0
 MOV R2, A
 INC R4
 JNC LOOPPRESETALARMTIME
 DEC R4
 MOV A, R3
 ADD A, #60
 MOV R5, A
 AJMP PRESETALARMTIMERET
 PRESETALARMTIMENON:
 MOV R4, #24
 MOV R5, #00H
 ;AJMP PRESETALARMTIMERET
 PRESETALARMTIMERET:
 RET
 ;****************************************************************************************


;--  作者:hh_dream623
;--  时间:2006-02-28 20:09:13
;--
ORG 0D00H
 ;闹钟判断及响铃驱动程序,使用第零组寄存器
 ALARMCLOCK:
 MOV C, 46H
 ORL C, 56H
 ORL C, 66H
 ORL C, 76H
 ORL C, 45H
 ORL C, 55H
 ORL C, 65H
 ORL C, 75H
 JC BEINGALARMCLOCK
 MOV A, 27H
 JNZ ALARMCLOCKRET
 MOV R0, #28H ;闹钟0的时间首地址
 MOV R5, #0
 LCALL ALARMCLOCK0
 JB 03H, ALARMCLOCKRET
 MOV R0, #2AH ;闹钟1的时间首地址
 MOV R5, #1
 LCALL ALARMCLOCK0
 JB 03H, ALARMCLOCKRET
 MOV R0, #2CH ;闹钟2的时间首地址
 MOV R5, #2
 LCALL ALARMCLOCK0
 JB 03H, ALARMCLOCKRET
 MOV R0, #2EH ;闹钟3的时间首地址
 MOV R5, #3
 LCALL ALARMCLOCK0
 ;AJMP ALARMCLOCKRET
 ALARMCLOCKRET:
 RET
 BEINGALARMCLOCK:
 JB 45H, BEINGALARMCLOCK0
 JB 46H, BEINGALARMCLOCK0
 JB 55H, BEINGALARMCLOCK1
 JB 56H, BEINGALARMCLOCK1
 JB 65H, BEINGALARMCLOCK2
 JB 66H, BEINGALARMCLOCK2
 JB 75H, BEINGALARMCLOCK3
 JB 76H, BEINGALARMCLOCK3
 AJMP BEINGALARMCLOCKRET
 BEINGALARMCLOCK0:
 MOV R0, #29H
 ACALL ALARMCLOCK1
 AJMP BEINGALARMCLOCKRET
 BEINGALARMCLOCK1:
 MOV R0, #2BH
 ACALL ALARMCLOCK1
 AJMP BEINGALARMCLOCKRET
 BEINGALARMCLOCK2:
 MOV R0, #2DH
 ACALL ALARMCLOCK1
 AJMP BEINGALARMCLOCKRET
 BEINGALARMCLOCK3:
 MOV R0, #2FH
 ACALL ALARMCLOCK1
 ;JB 03H, BEINGALARMCLOCKRET
 BEINGALARMCLOCKRET:
 RET
 ALARMCLOCK1:
 CLR 03H
 MOV A, @R0     ;提取闹铃时间
 XRL A, 33H    ;提取当天时间低8位,比较时间(分钟数)
 JZ ACLOCK1RET
 MOV 27H, #00H
 CLR P1.7
 DEC R0
 MOV A, @R0
 ANL A, #8FH
 MOV @R0, A
 MOV A, R0
 SUBB A, #28H
 XRL A, #5
 JNZ ACLOCK1ONLYONE
 CLR 77H
 ACLOCK1ONLYONE:
 SETB 03H
 ACLOCK1RET:
 RET
 ALARMCLOCK0:
 CLR 03H
 MOV A, @R0
 ANL A, #80H   ;判断闹铃是否被设置
 JZ ACLOCK0RET
 MOV A, @R0     ;提取闹铃时间
 ANL A, #0FH
 MOV R4, A
 MOV A, 32H    ;提取时间高四位,并比较
 ANL A, #0FH
 XRL A, R4
 JNZ ACLOCK0RET
 INC R0
 MOV A, @R0
 XRL A, 33H    ;提取当天时间低8位,比较时间(分钟数)
 JNZ ACLOCK0RET
 DEC R0
 MOV A, @R0
 SETB ACC.6
 MOV @R0, A
 MOV A, R5
 SETB ACC.7
 MOV 27H, A
 SETB 03H
 ;响铃驱动
 SETB P1.7
 ACLOCK0RET:
 RET
 ;****************************************************************************************
 ORG 0E00H
 ;农历月份资料,16位一组,高12位表示1~12月每月天数,1为30天,0为25天。
 ;低4位表示润月月份,0为当年无闰月,f为当年无闰月且前一年闰月天数为
 DW 0ab54h,02b6fh,09570h,052f2h,04970h,06566h,0d4a0h,0ea50h,06a95h,05adfh ;1925
 DW 02b60h,086e3h,092efh,0c8d7h,0c95fh,0d4a0h,0d8a6h,0b55fh,056a0h,0a5b4h ;1935
 DW 025dfh,092d0h,0d2b2h,0a950h,0b557h,06ca0h,0b550h,05355h,04dafh,0a5b0h ;1945
 DW 04573h,052bfh,0a9a8h,0e950h,06aa0h,0aea6h,0ab50h,04b60h,0aae4h,0a570h ;1955
 DW 05260h,0f263h,0d950h,05b57h,056a0h,096d0h,04dd5h,04ad0h,0a4d0h,0d4d4h ;1965
 DW 0d250h,0d558h,0b540h,0b6a0h,095a6h,095bfh,049b0h,0a974h,0a4b0h,0b27ah ;1975
 DW 06a50h,06d40h,0af46h,0ab60h,09570h,04af5h,04970h,064b0h,074a3h,0ea50h ;1985
 DW 06b58h,05ac0h,0ab60h,096d5h,092e0h,0c960h,0d954h,0d4a0h,0da50h,07552h ;1995
 DW 056a0h,0abb7h,025d0h,092d0h,0cab5h,0a950h,0b4a0h,0baa4h,0ad50h,055d9h ;2005
 DW 04ba0h,0a5b0h,05176h,052bfh,0a930h,07954h,06aa0h,0ad50h,05b52h,04b60h ;2015
 DW 0a6e6h,0a4e0h,0d260h,0ea65h,0d530h,05aa0h,076a3h,096d0h,04afbh,04ad0h ;2025
 DW 0a4d0h,0d0b6h,0d25fh,0d520h,0dd45h,0b5a0h,056d0h,055b2h,049b0h,0a577h ;2035
 DW 0a4b0h,0aa50h,0b255h,06d2fh,0ada0h,04b63h,0937fh,049f8h,04970h,064b0h ;2045
 DW 068a6h,0ea5fh,06b20h,0a6c4h,0aaefh,092e0h,0d2e3h,0c960h,0d557h,0d4a0h ;2055
 DW 0da50h,05d55h,056a0h,0a6d0h,055d4h,052d0h,0a9b8h,0a950h,0b4a0h,0b6a6h ;2065
 DW 0ad50h,055a0h,0aba4h,0a5b0h,052b0h,0b273h,06930h,07337h,06aa0h,0ad50h ;2075
 DW 04b55h,04b6fh,0a570h,054e4h,0d260h,0e968h,0d520h,0daa0h,06aa6h,056dfh ;2085
 DW 04ae0h,0a9d4h,0a4d0h,0d150h,0f252h,0d520h                             ;2095
 ORG 0F70H
 ;公历月份日期资料,计算总天数时当月应补加的天数(平年)
 DB 00H,03H,03H,06H,08H,0BH,0DH,10H,13H,15H,18H,1AH
 ORG 0F80H
 ;公历月份日期资料,计算总天数时当月应补加的天数(闰年)
 DB 00H,03H,04H,07H,09H,0CH,0EH,11H,14H,16H,19H,1BH
 ORG 0F90H
 ;(0~9)显示码(共阴极)
 DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
 END


⌨️ 快捷键说明

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