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

📄 clock.txt

📁 (转载)在C51单片机上的万年历带农历,不需要时钟芯片、感觉不错、很准。
💻 TXT
📖 第 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

;****************************************************************************************
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 + -