版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
;寄存器配置:(时间和II期)
;第3组(18〜1FH)(RSkRSO=11)RO〜R3,公历年月日;
;R4〜R7,时间的时、分、秒、百分之•秒(0.01秒)
;第2组(10〜17H)(RSI、RS0-10)计算农历日期存储中间临时数据
;第1组(08〜OFH)(RSKRS0=01)键盘处理程序存储
;闹钟设置状态:R4、R5设置时间时、分,R6、R7计算分钟数
;万年历状态:R0〜R3查看的公历年月日,R6、R7农历月日,R4、R5总天数
;时间设置时:直接在第3组寄存器操作
;第0组(00-07H)(RSI、RSO=OO)计算中间值临时存储器
;总天数、星期、当天分钟计数器、农历日期寄存器
;30H、31H一一距1925.1.1日总天数
;32H一一高四位星期几,低四位与33H当天的分钟数
;34〜37H一—农历年月日
;寄存器配置:(闹钟),两个字节为一个单位
;低地址最高位表示是否设置闹钟,低四位与27H为闹钟时间(当天的分钟数)
;闹钟1:28H、29H,星期一到五闹钟
;闹钟2:2AH、2BH,配置与闹钟1相同
;闹钟3:2CH、2DH,为每日闹钟
;闹钟4:2EH、2FH,为一次性闹钟
;运行状态寄存器:27H单元,00H,正常的时间显示模式
;IxH,闹铃设置模式,0〜1位第几个闹钟(0〜3号),第3位设置时(0)和分(1)
;2xH,万年历查看模式,0〜3分别加减10年、1年、1月、1日,1有效
;4xH,忖间日期设置,低四位都是0设置年,第0〜3位分别为1时设置月、日、时、分
(加减1)
;方波信号:位地址的07H、06H分别为1秒和0.5秒等脉宽信号,用于控制设置时闪烁显示
;显示缓冲区:6F〜7F单元,分别为星期、年月日、时分、农历月日,星期1个单元、年4
个单元、其余2个单元
;在计算过程中所示用的位寄存器:
;在计算农历时用00H位(位地址)表示是否闰月
;y年m月的天数用25H单元存储临时数据,01H位(位地址)表示当月是29天或30天
;05H计时满一天后或者调整日期后请求进行农历日期计算标志为
;04H调整小时或分钟后重新计算当天分钟数请求标识
;06H、07H周期1秒和0.5秒的方波信号,前者用于秒闪烁,后者调整项闪烁
ORG0000H
;开机及复位后从第一行起运行
LJMP0080H;INITTHECLOCK
ORG0003H
;INTO中断服务程序,若有键按下则产转入键处理
LJMPTIIEKEYDOWNSERVER;90011
ORG000BH
;定时/计数器0中断服务程序,预计每10毫秒产生一次中断
LJMPSETTIMEVALUE;0300H
ORG001BH
;定时/计数器1中断服务程序,用于延时5秒后将状态寄存器复位为00H
PUSHA
DEC03H
MOVA,03H
JNZTIMER1RET
;按键后16秒中如果没有其他按键操作,自动转换为时间显示状态
MOVA,27H
JZTIMER1SERVERRET;如果是状态0,直接返回
TIMER1STATE1:
JNB3CH,TIMER1STATE2
PUSHPSW;如果是在闹钟设置状态下调用闹钟设置程序
MOVPSW,#000010006
LCALLSETALARMTIME
POPPSW
AJMPTIMER1SERVERRET
TIMER1STATE2:
JNB3DH,TIMER1STATE3
AJMPTIMER1SERVERRET;如果在万年历查看方式下直接换到时间显示状态
TIMER1STATE3:
JNB3EH,T1MER1SERVERRET
;如果在时间设置状态下,更改当前分钟数
SETB05H;设置农历日期计算请求标识
JNB04H,TIMER1SERVERRET
PUSHPSW
PUSHB
MOVPSW,#00011000B;
MOVA,R4;如果调整了时间,重新计算当天分钟数
MOVB,#60
MULAB
ADDA,R5
MOV33H,A
MOVA,B
ADDCA,#0
MOV32H,A
MOVR6,#0;秒清零
CLR04H
POPB
POPPSW
;AJMPTIMER1SERVERRET
TIMER1SERVERRET:
MOV27H,#0011
CLRTRI
TIMER1RET:
POPA
RETI
ORG0080H
INITTHECLOCK:
MOVSP,#3811
JNB08H,INITRESET
MOVPSW,#000110006;使用3组寄存器(0、1、2、3四组寄存器)
MOVR7,#00;初始时间:00:00:00,00
MOVR6,#00
MOVR5,#00
MOVR4,#00
MOVR3,#15;初始日期:2000.1.1
MOVR2,#12
MOVRI,#0D4H
MOVRO,#7
MOV33H,#0;初始当天分钟计数器,32H高4位为星期
MOV32H,#0
MOV27H,#0
SETB08H;标识上电启动,在复位启动时不初始化时间日期
SETB05H;
INITRESET:
MOVPSW,#00H
MOVR0,#28H
LOOPINIT:
MOV@R0,#00
INCR0
CJNER0,#30H,LOOPINIT
CLRPl.7
CLRP2.2
MOVIE,#10001011B;开定时/计数器0、1中断,开外部中断0,关其余中断
SETB1T0;设置INTO为负边沿触发
MOVIP,#00000010B;设置定时/计数器0的中断优先级为高
MOVTMOI),#000100108;定义定时/计数器0计数模式,与INTO无关,计数模式为8位自动
重装模式
;定义定时/计数器1计数模式,与INT1无关,计数模式为16位计数
模式
MOVTHO,#6;拟计数脉冲频率为25K,计数满250时间为10毫秒
MOVTLO,#6
SETBTRO;启动定时/计数器0
MOVPSW,#000000008
MOVP2,#11111111B
;显示字符、闹铃检测比较循环程序
DISPLAYPREPARATIVE:
JNB05H,LUNARDATETODISPLAY
CLR05H
PUSHPSW;计算农历日期
MOVPSW,#000100008
ACALLSETLUNARDATE
POPPSW
LUNARDATETODISPLAY:
LCALLALARMCLOCK;闹铃检测及服务程序
MOVDPTR,#0F90H;数字1〜9的共阴极显示码首地址
MOVA,27H;取运行状态寄存器,以选择显示方式
JNZDISABNORMAL
DISPLAYNORMAL:
MOVA,32H;正常时间显示模式下,取星期显示码
SWAPA
ANLA,#OFH
JNZDISWEEKDAY
MOVA,#8
DISWEEKDAY:
MOVCA,©A+DPTR
MOV6FH,A
MOVRO,#19H;取年分显示码,共4位
MOVRI,#70H
ACALLDISYEARCODE
MOVRO,#1AII;取日期(月日)显示码,共4位
ACALLDISCODE
INCRO;取时间(时分)显示码,共4位
ACALLDISCODE
MOVRO,#36H;取农历日期(月日)显示码,共4位
ACALLDISCODE
AJMPDISPLAYRUN
DISABNORMAL:;设置及万年历模式下,显示方式
JB3CH,DISSTATE1XH
JB3DH,DISSTATE2XH
JB3EH,DISSTATE3XH
JB3FH,DISSTATE4XH
AJMPDISPLAYPREPARATIVE
DISSTATE3XH:
AJMPJMPDISSTATE3XH
DISSTATE4XH:
AJMPJMPDISSTATE4XH
DISSTATE1XH:;状态1(设置闹钟),星期栏显示闹钟号(广4),闹铃标志亮,时间栏显示,
其余不显示
MOVA,27H;取状态字
ANLA,#000001118
INCA
MOVCA,©A+DPTR
MOV6FH,A;在星期一栏显示闹钟号(1-4)
MOVRI,#70H;阳历的年月日日期都不显示,送显示码00H到显示缓冲区
L00PDISSTATE1XH:
MOV©R1,#0
INCRI
CJNERI,#78H,L00PDISSTATE1XH
DECRI
MOVR0,#OCH;时间时,分显示码,第1组寄存器R4、R5
ACALLDISCODE
INCR1
L00PDISSTATE1XH1:;农历日期兰不显示,送显示码00H到显示缓冲区
MOV@R1,#0
INCRI
CJNERI,#80H,L00PDISSTATE1XH1
JB07H,DISSTATE1XHFLICKER
AJMPDISPLAYRUN
DISSTATE1XHFLICKER:;设置时的闪烁显示
JB3BH,DISSTATE1XHFLICKERMINUTE
MOV78H,#0;时消隐
MOV79H,#0
AJMPDISPLAYRUN
DISSTATE1XHFLICKERMINUTE:
MOV7AH,#0;分消隐
MOV7BH,no
AJMPDISPLAYRUN
DISSTATE2XH:;状态2(万年历),时间栏不显示,只显示阴阳历日期及星期
MOVA,26H;取星期显示码,高4位
ANLA,#OFOH
SWAPA
JNZDISSTATE2XHWEEKDAY
MOVA,#8
DISSTATE2XHWEEKDAY:
MOVCA,©A+DPTR
MOV6FH,A
MOVRO,#09H;取年显示码,共4位
MOVRI,#70H
ACALLDISYEARCODE
MOVRO,#0AH;取日期(月日)显示码,共4位
ACALLDISCODE
L00PDISSTATE2XH:;时间不显示,送0为显示码
INCR1
MOV@R1,#0
CJNERI,#7BH,L00PDISSTATE2XH
MOVRO,#OEH;取阴历(月日)显示码,共4位
;M0VRI,#7BH
ACALLDISCODE
JB07H,DISSTATE2XHFLICKER
AJMPDISPLAYRUN
DISSTATE2XHFLICKER:
JB38H,DISSTATE2XHFLICKERYEAR10
JB39H,DISSTATE2XHFL1CKERYEAR1
JB3AH,DISSTATE2XHFLICKERM0NTH
JB3BH,DISSTATE2XHFL1CKERDATE
AJMPDISPLAYRUN
DISSTATE2XHFL1CKERYEAR10:
MOV72H,#0
AJMPDISPLAYRUN
DISSTATE2XHFLICKERYEAR1:
MOV73H,#0
AJMPDISPLAYRUN
DISSTATE2XHFLICKERM0NTH:
MOV74H,#0
MOV75H,#0
AJMPDISPLAYRUN
DISSTATE2XHFLICKERDATE:
MOV76H,#0
MOV77H,#0
AJMPDISPLAYRUN
JMPDISSTATE3XH:;状态3(设置时间日期),不显示农历的日期和星期
MOV6FH,#0;星期,不显示
MOVRO,#19H;取年分显示码,共4位
MOVRI,#70H
ACALLDISYEARCODE
MOVRO,#1AH;取日期(月日)显示码,共4位
ACALLDISCODE
INCRO;取时间(时分)显示码,共4位
ACALLDISCODE
L00PDISSTATE3XH:;时间不显示,送0为显示码
INCR1
MOV@R1,#0
CJNERI,#7FH,L00PDISSTATE3XH
JB07H,DISSTATE3XIIFLICKER
AJMPDISPLAYRUN
DISSTATE3XHFLICKER:
JB38H,DISSTATE3XHFLICKERYEAR
JB3911,DISSTATE3XIIFLICKERM0NTII
JB3AH,DISSTATE3XHFLICKERDATE
JB3BH,DISSTATE3XHFLICKERI10UR
;DISSTATE3XHFLICKERINUTE:
MOV7AH,#0
MOV7BH,#0
AJMPDISPLAYRUN
DISSTATE3XHFLICKERYEAR:
MOV70H,#0
MOV71H,#0
MOV72H,#0
MOV73H,#0
AJMPDISPLAYRUN
DISSTATE3XHFL1CKERM0NTH:
MOV74H,#0
MOV75H,#0
AJMPDISPLAYRUN
D1SSTATE3XHFL1CKERDATE:
MOV76H,#0
MOV77H,#0
AJMPDISPLAYRUN
DISSTATE3XHFLICKERH0UR:
MOV78H,#0
MOV79H,#0
AJMPDISPLAYRUN
JMPDISSTATE4XH:
AJMPDISPLAYNORMAL
;AJMPDISPLAYRUN
DISPLAYRUN:;显示码送显示驱动器
MOVC,06H
MOVP2.0,C;
MOVC,07H
MOVP2.1,C;
MOVPO,6FH
SETBP2.2
ACALLDELAY
CLRP2.2
MOVRO,#70H
MOVR2,#0
LOOPDISPLAY:
MOVPO,©RO
MOVA,R2
SWAPA
ANLP2,#OFH
ORLP2,A
CLRP2.3
ACALLDELAY
SETBP2.3
INCRO
INCR2
CJNER2,#16,LOOPDISPLAY
LJMPDISPLAYPREPARATIVE
DELAY:
;显示延迟
;((2*R6+1)*R7+1)机器周期
MOVR7,#5
LOOPDALAY:
MOVR6,#100
L00PDALAY1:
DJNZR6,L00PDALAY1
DJNZR7,LOOPDALAY
RET
DISYEARCODE:
MOVA,@R0;计算年的显示码
CLRC
SUBBA,#ODOH;(2000->7D0H)
MOVB,A
DECRO
MOVA,@R0
SUBBA,#07H
JNCDISYEAR2000
INCRO
MOVA,©RO
CLRC
SUBBA,#06CH;(1900->76CH)
MOVB,A
;MOVA,18H
;SUBBA,#07H
MOVA,#1
MOVCA,@A+DPTR
MOV@R1,A
MOVA,#9
MOVCA,©A+DPTR
INCRI
MOV@R1,A
AJMPDISYEAR1O
DISYEAR2000:
MOVA,#2
MOVCA,©A+DPTR
MOV@R1,A
MOVA,#0
MOVCA,@A+DPTR
INCRI
MOV@R1,A
DISYEAR10:
MOVA,B
MOVB,#10
DIVAB
MOVCA,@A+DPTR
INCRI
MOV@R1,A
MOVA,B
MOVCA,@A+DPTR
INCRI
MOV@R1,A
RET
D1SC0DE:
MOVA,@R0
MOVB,#10
DIVAB
MOVCA,©A+DPTR
INCRI
MOV@R1,A
MOVA,B
MOVCA,©A+DPTR
INCRI
MOV@R1,A
INCRO
MOVA,@R0
MOVB,#10
DIVAB
MOVCA,©A+DPTR
INCRI
MOV@R1,A
MOVA,B
MOVCA,©A+DPTR
INCRI
MOV@R1,A
RET
SETLUNARDATE:
MOVA,19H;设置计算总天数程序的入口参数,(年T925)送R2
SUBBA,#85H;1925D=785H
MOVR2,A
MOVR3,1AH;月送R3
MOVR4,1BH;日送R4
LCALLCALCULATETOTALDAYS;计算距离1925年1月1日的总天数
MOV30H,R6;计算结果送30H、31H单元保存
MOV31H,R7
LCALLSETWEEKDAYS;计算星期几
MOVA,R5
SWAPA
ANL32H,#0FH
ORL32H,A;计算结果送32H单元高四位保存
MOVR4,30H;计算农历日期程序入口参数,总天数送R4、R5
MOVR5,31H
LCALLLUNARDATECALULATE
MOV37H,R7;
MOV36H,R4;
MOVA,R2
ADDA,#85H;1925D=785H
MOV35H,A
MOVA,#0
ADDCA,#07H
MOV34H,A
RET
ORG0300H
;时间计数器累加,设置当前时间,年月日、时分秒、0.01秒
;设置时间
SETTIMEVALUE:
PUSHPSW;压栈保护现场PS%A、B
PUSHA
PUSHB
MOVPSW,#OOO11OOOB;使用第三组寄存器
INC24H;250微秒计数器
MOVA,24H
CJNEA,#40,RETTIME
MOV24H,#0011
INCR7;百分之一秒(0.01秒)时间计数器
;产生周期为1秒及0・5秒的方波脉冲信号
MS250:
CJNER7,#25,MS500
CPL07H
MS500:
CJNER7,#50,MS750
CPL07H
CPL06H
MS750:
CJNER7,#75,MS1000
CPL07H
MS1000:
CJNER7,#100,RETTIME
CPL07H
CPL06H
MOVR7,#0;满一秒钟,百分秒计数器清零
INCR6;秒计数器
CJNER6,#60,RETTIME
MOVR6,#0;满一分钟,分计数器清零
INCR5;分钟计数器
MOVA,33H;当天分钟数计数器(32H低四位、33H)
ADDA,#1
MOV33H,A
MOVA,#0
ADDCA,32H
MOV32H,A
CJNER5,#60,RETTIME
MOVR5,#0;满一小时,分钟计数器清零
INCR4;时计数器
CJNER4,#24,RETTIME
MOVR4,#0;满一天,时计数器清零
MOV33H,#0;当天分钟计数器清零
MOV32H,#0
ACALLSETDATEVALUE;设置日期计数器
;计算日期入口条件设置
SETB05H;设置请求计算农历日期指示
RETTIME:
POPB;出栈恢复现场B、A、PSW
POPA
POPPSW
RETI
;设置II期
SETDATEVALUE:
INCR3;天计数器
MOVA,R2;判断月份以确定当月的天数
DECA
JZDAY31;1月
DECA
JZDAY28;2月
DECA
JZDAY3L3月
DECA
JZDAY30;4月
DECA
JZDAY31;5月
DECA
JZDAY30;6月
DECA
JZDAY31;7月
DECA
JZDAY31;8月
DECA
JZDAY30;9月
DECA
JZDAY31;10月
DECA
JZDAY30;ll月
DECA
JZDAY31;12月
DAY31:
CJNER3,#32,RETDATE;大月,31天
AJMPSETMONTH
DAY30:
CJNER3,#31,RETDATE;小月,30天
AJMPSETMONTH
DAY28:;2月,平年28天,闰年29天
MOVA,R1;计算当年一1925年
SUBBA,#84H;
MOVB,#4
DIVAB
MOVA,B
JZDAY29
CJNER3,#29,RETDATE;平年2月28天
AJMPSETMONTH
DAY29:
CJNER3,#30,RETDATE;闰年2月29天
;AJMPSETMONTH
SETMONTH:
MOVR3,#1;满一个月,日计数器设置为1
INCR2;月计数器
CJNER2,#13,RETDATE
MOVR2,#1;满一年,月计数器设置为1
MOVA,#1;年计数器(RO、R1)
ADDA,RI
MOVRI,A
MOVA,#0
ADDCA,RO
MOVRO,A
RETDATE:
RET
ORG0400H
ORG0500H
;计算当天距离1925年1月1日的总天数,使用第2组寄存器
;入口:R2二年一1925,R3=月,R4=E
;出口:R6、R7=总天数
CALCULATETOTALDAYS:
MOVA,R2;假设1年有365天,计算(年-1925)年的总天数
MOVB,#6DH;16DH(365)的低位字节
MULAB
MOVR7,A
MOVA,R2
ADDA,B
MOVR6,A
MOVA,R2;补加(年-1925)中闰年补偿(一年366天)的天数
MOVB,#4
DIVAB
ADDA,R7
MOVR7,A
MOVA,#0
ADDCA,R6
MOVR6,A
MOVA,R3;假设每月有28天,计算(月一1)个月的总天数
DECA
MOVB,#28;设每月有28天
MULAB
ADDA,R7
MOVR7,A
MOVA,B
ADDCA,R6
MOVR6,A
MOVDPTR,#0F70H;平年月天数补偿表起始地址(大月31天、小月30天、闰年2月29
天)
MOVA,R2
INCA
MOVB,#4
DIVAB
MOVA,B
JNZSETDPTREND
MOVDPTR,#0F80H;闰年月天数补偿表起始地址
SETDPTREND:
MOVA,R3;补加月补偿天数
DECA
MOVCA,©A+DPTR
ADDA,R7
MOVR7,A
MOVA,#0
ADDCA,R6
MOVR6,A
MOVA,R4;日
DECA
ADDA,R7
MOVR7,A
MOVA,#0
ADDCA,R6
MOVR6,A
RET
ORG0580H
;计算当前是星期几,使用第0组寄存器
;入口:R6、R7,为当天距离1925年1月1日的总天数
;出口:R5,计算结果0表示星期天,1〜6分别为星期一至星期六
SETWEEKDAYS:
MOVA,R7;取出总天数,加4(1925年1月1日为星期四)
ADDA,#4
MOVR7,A
MOVA,#0
ADDCA,R6
MOVR6,A;计算总天数除以7的余数
MOVB,#7
DIVAB
MOVR6,B
MOVA,R7
MOVB,#7
DIVAB
MOVA,B
RLA
RLA
RLA
MOVR7,A
MOVA,R6
RLA
RLA
RLA
MOVB,#7
DIVAB
MOVR6,B
MOVRO,#3
WEEKDAYSLOOP:
MOVA,R6
CLRCY
RRCA
MOVR6,A
MOVA,R7
RRCA
MOVR7,A
DECRO
CJNERO,#0,WEEKDAYSLOOP
;MOVA,R7
MOVB,#7
DIVAB
MOVR5,B
RET
ORG0700H
;计算农历日期(年月日),第0组、第1组(00H〜0FH)寄存器存储计算中间值
;子程序段
LUNARYEARDAYS:
;计算农历Y年的总天数
;入口,R2,Y年一1925
;出口,R4、R5,Y年的总天数
MOVR5,#5CH;设一年29x12=348(15CH)天
MOVR4,#1
MOVDPTR,#OEOOH;资料起始地址
MOVA,R2;设置DPTR,原因:资料单位为字(双字节)
ADDA,DPL
MOVDPL,A
MOVA,#0
ADDCA,DPH;在程序设计时确定该计算不会溢出
MOVDPH,A
MOVA,R2;取丫年月份资料高字节(1〜8月份)
MOVCA,@A+DPTR
MOVRO,#0;累加农历Y年应补加的天数
MOVR1,#8;移位计数器
L00PLUNARYEARDAYS1:
RLCA
JNCLUNARYEARDAY291
INCRO
LUNARYEARDAY291:
DJNZRI,LOOPLUNARYEARDAYS1
MOVA,R2;取低字节资料的高四位
INCA
MOVCA,©A+DPTR
MOVRI,#4
L00PLUNARYEARDAYS2:
RLCA
JNCLUNARYEARDAY292
INCRO
LUNARYEARDAY292:
DJNZRI,L00PLUNARYEARDAYS2
MOVA,RO
ADDA,R5
MOVR5,A
MOVA,#0
ADDCA,R4
MOVR4,A
LCALLLUNARLEAPDAYS;补加Y年闰月的天数(R3)
MOVA,R3
ADDA,R5
MOVR5,A
MOVA,#0
ADDCA,R4
MOVR4,A
RET
LUNARLEAPDAYS:
;计算农历Y年的闰月的天数
;入口:R2Y年一1925
;出口:R3,Y年闰月的天数
LCALLLUNARLEAPMONTH;Y年有无闰月,润几月。结果存在R3
CJNER3,#0,LUNARLEAPDAYS29
MOVR3,#0
LJMPLUNARLEAPDAYSRET
LUNARLEAPDAYS29:
MOVA,R2;取月份资料低字节低四位(闰月天数资料)
INCA
ADDA,#2;取(Y年—1924),低四位表示前一年闰月天数
MOVCA,©A+DPTR
ANLA,#0FH;取低四位
XRLA,#OFH;如果低四位为F,则前一年闰月30天
JZLUNARLEAPDAYS30
MOVR3,#29
LJMPLUNARLEAPDAYSRET
LUNARLEAPDAYS30:
MOVR3,#30
LUNARLEAPDAYSRET:
RET
LUNARLEAPMONTH:
;计算农历Y年的闺月的月份
;入口:R2Y年一1925
;出口:R3,Y年闰月的月份,0表示Y年无闺月
MOVA,R2
INCA
MOVCA,©A+DPTR
ANLA,#OFH;取低四位
MOVR3,A
XRLA,#OFH;如果是F,返回0,Y年无闰月
JNZLUNARLEAPMONTHRET
MOVR3,#0
LUNARLEAPMONTHRET:
RET
LUNARMONTHDAYS:
;计算农历Y年的M月的天数
;入口:R2Y年一1925,R4M月
;出口:RX,Y年M月的天数
;MOVA,R2
;MOVDPTR,#2000H;资料起始地址
;MOVA,R2;设置DPTR,原因:资料单位为字(双字节)
;ADDA,DPL
;MOVDPL,A
;MOVA,#0
;ADDCA,DPH;在程序设计时确定该计算不会溢出
;MOVDPH,A
MOVA,R2;取丫年月份资料高字节(1〜8月份)
MOVCA,©A+DPTR
MOV25H,A
MOVA,R4;循环计数器
MOVRO,A
MOVRI,#8
MOVA,25H
LOOPMONTHDAYS1:
RLCA
MOV01H,C
DECRO
DECRI
MOV25H,A;保存A寄存器的内容
MOVA,RO
JZEX1TL00PM0NTHDAYS2
MOVA,RI
JZEXITL00PM0NTHDAYS1
MOVA,25H;恢复A寄存器的内容
LJMPLOOPMONTHDAYS1
EXITL00PM0NTHDAYS1:
MOVA,R2;取低字节资料
INCA
MOVCA,©A+DPTR
L00PM0NTHDAYS2:
RLCA
MOV01H,C
DJNZRO,L00PM0NTHDAYS2
EXITL00PM0NTHDAYS2:
JB01H,LUNARM0NTHDAYS30
MOVR3,#29
LJMPLUNARMONTHDAYSRET
LUNARM0NTHDAYS30:
MOVR3,#30
LUNARMONTHDAYSRET:
RET
;计算农历日期的主程序
LUNARDATECALULATE:
;计算农历日期,使用第0组或第1组寄存器
;入口:R4、R5总天数
;出口:1^2=年-1925;R4=月;1^7=日
;分三段计算1925.1.24〜1968.1.30、〜2011.2.3、~2045.2.8、2099.12.31
MOVA,R5
CLRC
SUBBA,#033H
MOVR7,A
MOVA,R4
SUBBA,#0B8H
MOVR6,A
MOVR2,#129
JNCEXITFENDUAN
MOVA,R5
CLRC
SUBBA,#0D4H
MOVR7,A
MOVA,R4
SUBBA,#07AH
MOVR6,A
MOVR2,#86
JNCEXITFENDUAN
MOVA,R5
CLRC
SUBBA,#076H
MOVR7,A
MOVA,R4
SUBBA,#03DH
MOVR6,A
MOVR2,#43
JNCEXITFENDUAN
MOVA,R5
CLRC
SUBBA,#017H
MOVR7,A
MOVA,R4
SUBBA,#0
MOVR6,A
MOVR2,#0
JNCEXITFENDUAN
LJMPERRCALCULATE;计算出错,超出日期范围
EXITFENDUAN:;分段计算有效总天数R6、R7,年份R2,R4、R5失效后面的程序可以
使用
LOOPCALCULATEYEAR:
LCALLLUNARYEARDAYS
MOVA,R7
CLRC
SUBBA,R5
MOVR7,A
MOVA,R6
SUBBA,R4
MOVR6,A
JCEX1TL00PCALCULATEYEAR
INCR2
MOVA,R2
XRLA,#176;大于175(2100年)退出循环
JNZPASSERRCALCULATE2
LJMPERRCALCULATE
PASSERRCALCULATE2:
LJMPLOOPCALCULATEYEAR
EXITLOOPCALCULATEYEAR:
MOVA,R7;加上最后一年减掉的天数,当年已经过去的天数,用于计算月份和日期
ADDA,R5
MOVR7,A
MOVA,R6
ADDCA,R4
MOVR6,A
;DECR2;如果是零,为1926年
LCALLLUNARLEAPMONTH;判断是否有闰月,月份存在R3
MOVA,R3
MOVR5,A
CLROOH;是否闰月标识
MOVR4,#1;计算月数
LOOPCALCULATEMONTH:
MOVA,R5
JZCALCULATEM0NTH1;转无闰月处理
MoV#1
AA,5
DDA,R
X
RLA,R4
JNZCALCULATEM0NTH1;转非闰月处理
JBOOH,CALCULATEMONTH1
DECR4
SETBOOH;设置闰年标识
LCALLLUNARLEAPDAYS;读取当年闰月的天数R3
LJMPCALCULATEMONTH2;
CALCULATEMONTH1:
LCALLLUNARMONTHDAYS;结果存放在R3中
CALCULATEMONTH2:
JNBOOH,CALCULATEMONTH3
MOVA,#1
ADDA,R5
XRLA,R4
JNZCALCULATEMONTH3
CLROOH;解除闰月标识
CALCULATEMONTH3:
MOVA,R7
CLRC
SUBBA,R3
MOVR7,A
MOVA,R6
SUBBA,#0
MOVR6,A
JCEX1TL00PCALCULATEM0NTH
INCR4
MOVA,R4;如果大于十二退出,提示错误
XRLA,#13
JZERRCALCULATE
LJMPLOOPCALCULATEMONTH
EXITLOOPCALCULATEMONTH:
MOVA,R5;判断是否闰月
JZCALCULATEM0NTH5
MOVA,#1
ADDA,R5
XRLA,R4
JNZCALCULATEM0NTH5
JNBOOH,CALCULATEM0NTH4
CLROOH
LJMPCALCULATEM0NTH5
CALCULATEM0NTH4:
SETBOOH
DECR4
CALCULATEM0NTH5:
MOVA,R7;加最后一次减的天数,当月已经过完的天数
ADDA,R3
MOVR7,A
MOVA,#0
ADDCA,R6
MOVR6,A
;DECR4
INCR7;计算日期
LJMPCALCULATERET
;计算结果:1?2=年-1925;R4=月;R7=H
ERRCALCULATE:;错误显示
;错误处理程序
NOP
CALCULATERET:
RET
ORG0900H
THEKEYDOWNSERVER:
;27H单元的位地址高位到低位:37、36、35、34、33、32、31、30(H)
;有键按下的位为0,本程序为按键处理分派
CLRTR1;关闭延时计数器
CLREXO;关闭INTO中断
PUSHP0
MOVP0,#0
MOV04H,#10;延时单元
KEYDELAY:
MOV05H,#200
DJNZ05H,$
DJNZ04H,KEYDELAY
PUSHPSW;保护现场
PUSHA
PUSHB
MOVPSV#000010008
MOVA,Pl
ORLA,#OFH
MOVPl,A;读键盘口,结果存储26H第四位
MOVA,Pl
CPLA
ANLA,#OFH
JZKEYALL0T5;如果无键按下,推出
ANL26H,#OFOH
ORL26H,A
KEYALL0T1:
MOVA,27H
JNZKEYALLOT2
ACALLKEYSTATEO
AJMPKEYALLOT5
KEYALLOT2:
JNB3CH,KEYALLOT3
ACALLKEYSTATE1
AJMPKEYALLOT5
KEYALLOT3:
JNB3DH,KEYALL0T4
ACALLKEYSTATE2
AJMPKEYALLOT5
KEYALL0T4:
JNB3EH,KEYALL0T8
ACALLKEYSTATE3
AJMPKEYALLOT5
KEYALL0T8:
JNB3FH,KEYALL0T5
ACALLKEYSTATE4
;AJMPKEYALL0T5
KEYALLOT5:
POPB;恢复现场
POPA
POPPSW
POPPO
;设置延时计数器,如果在5秒钟内没有按键动作自动转到时间显示状态
MOVTH1,#0
MOVTFO,#0
MOV03H,#255
CLRIE0
SETBEXO
SETBTRI;计时开始
RETI
KEYSTATEO:
;状态0按键处理,时间显示状态
STATEOKEYO:
JNB30H,STATE0KEY1
MOV27H,#10H
ACALLPRESETALARMTIME
AJMPKEYSTATEORET
STATE0KEY1:
JNB31H,STATE0KEY2
AJMPSTATE0KEY12
STATE0KEY2:
JNB32H,STATE0KEY3
STATE0KEY12:
MOV27H,#24H
MOVRO,18H
MOVRl,19H
MOVR2,1AH
MOVR3,1BH
MOVR6,36H
MOVR7,37H
MOVA,32H
ANLA,#OFOH
ANL26H,#OFH
ORL26H,A
AJMPKEYSTATEORET
STATEOKEY3:
JNB33H,KEYSTATEORET
MOV27H,#48H
;AJMPKEYSTATEORET
KEYSTATEORET:
RET
KEYSTATE1:
;状态1按键处理,闹钟设置状态
STATE1KEYO:
JNB30H,STATE1KEY1
ACALLSETALARMTIME;SET
MOV27H,#21H;初始化万年历状态
MOVRO,18H
MOVRI,19H
MOVR2,1AH
MOVR3,1BH
MOVR6,36H
MOVR7,37H
MOVA,32H
ANLA,#OFOH
ANL26H,#OFH
ORL26H,A
AJMPKEYSTATE1RET
STATE1KEY1:
JNB31H,STATE1KEY2
JB3BH,STATE1KEY1MIN;UP
INCR4
CJNER4,#25,STATE1KEY1HOUR
MOVR4,#0
STATE1KEY1H0UR:
AJMPKEYSTATE1RET
STATE1KEY1MIN:
ACALLMINUTEADJUST
AJMPKEYSTATE1RET
STATE1KEY2:
JNB32H,STATE1KEY3
JB3BII,STATE1KEY2MIN;DOWN
DECR4
CJNER4,#0FFH,STATE1KEY2H0UR
MOVR4,#24
STATE1KEY2H0UR:
AJMPKEYSTATE1RET
STATE1KEY2MIN:
ACALLMINUTEADJUST
AJMPKEYSTATE1RET
STATE1KEY3:
JNB33H,KEYSTATE1RET
JNB3BH,STATE1KEY3CHANGE;RIGHT
ACALLSETALARMTIME
MOVA,27H
ANLA,#03H
INCA
MOVB,#4
DIVAB
MOVA,B
ANL27H,#OFOH
ORL27H,A
ACALLPRESETALARMTIME
AJMPKEYSTATE1RET
STATE1KEY3CHANGE:
SETB3BH;切换到分钟调整
;AJMPKEYSTATE1RET
KEYSTATE1RET:
RET
KEYSTATE2:
;状态2按键处理,万年历查看状态
STATE2KEY0:
JNB30H,STATE2KEY1
MOV27H,#41H;按键0,SET
AJMPKEYSTATE2RET
STATE2KEY1:
JNB31H,STATE2KEY2
JNB38H,STATE2KEY1YEAR;按键1,UP
MOVB,#10
ACALLYEARADJUST
AJMPKEYSTATE2RET
STATE2KEY1YEAR:
JNB39H,STATE2KEY1M0NTH
MOVB,#1
ACALLYEARADJUST
AJMPKEYSTATE2RET
STATE2KEY1M0NTH:
JNB3AH,STATE2KEY1DATE
ACALLMONTIIADJUST
AJMPKEYSTATE2RET
STATE2KEY1DATE:
JNB3BH,KEYSTATE2RET
ACALLDATEADJUST
AJMPKEYSTATE2RET
STATE2KEY2:
JNB32H,STATE2KEY3
JNB38H,STATE2KEY2YEAR;按键2,DOWN
MOVB,#10
ACALLYEARADJUST
AJMPKEYSTATE2RET
STATE2KEY2YEAR:
JNB39H,STATE2KEY2M0NTH
MOVB,#1
ACALLYEARADJUST
AJMPKEYSTATE2RET
STATE2KEY2M0NTH:
JNB3AH,STATE2KEY2DATE
ACALLMONTHADJUST
AJMPKEYSTATE2RET
STATE2KEY2DATE:
JNB3BH,KEYSTATE2RET
ACALLDATEADJUST
AJMPKEYSTATE2RET
STATE2KEY3:
JNB33H,KEYSTATE2RET
JNB38H,STATE2KEY3YEAR;按键3,RIGHT
MOV27H,#0010001OB
AJMPKEYSTATE2RET
STATE2KEY3YEAR:
JNB3911,STATE2KEY3M0NTH
MOV27H,#001001008
AJMPKEYSTATE2RET
STATE2KEY3MONTH:
JNB3AH,STATE2KEY3DATE
MOV27H,#001010006
AJMPKEYSTATE2RET
STATE2KEY3DATE:
JNB3BH,KEYSTATE2RET
MOV27H,#001000016
;AJMPKEYSTATE2RET
KEYSTATE2RET:
MOVPSW,#OOO1OOOOB;使用第二组寄存器
MOVA,0911;设置计算总天数程序的入口参数,(年-1925)送R2
SUBBA,#85H;1925D=785H
MOVR2,A
MOVR3,OAH;月送R3
MOVR4,OBH;日送R4
LCALLCALCULATETOTALDAYS;计算距离1925年1月1日的总天数
MOVOCH,R6;计算结果送OCH、ODH单元保存
MOVODH,R7
LCALLSETWEEKDAYS;计算星期几
MOVA,R5
SWAPA
ANL26H,#OOFH
ORL26H,A;计算结果送26H单元高四位保存
MOVR4,OCH;计算农历日期程序入口参数,总天数送R4、R5
MOVR5,ODH
LCALLLUNARDATECALULATE
MOVOFH,R7;
MOVOEH,R4;
RET
KEYSTATE3:
;状态3按键处理,时间调整设置状态
MOVPSW,#00011000B
STATE3KEY0:
JNB30H,STATE3KEY1
MOV27H,#00H;按键0,SET
JNB04H,STATE3KEY01
MOVA,R4;重新计算当天分钟数
MOVB,#60
MULAB
ADDA,R5
MOV33H,A
MOVA,B
ADDCA,#0
MOV32H,A
MOVR6,#0;秒清零
CLR04H
STATE3KEY01:
SETB05H;设置农历H期计算请求标识
AJMPKEYSTATE3RET
STATE3KEY1:
JNB31H,STATE3KEY2
JNB38H,STATE3KEY1M0NTH;按键1,UP
MOVB,#1
ACALLYEARADJUST
AJMPKEYSTATE3RET
STATE3KEY1M0NTH:
JNB39H,STATE3KEY1DATE
ACALLMONTHADJUST
AJMPKEYSTATE3RET
STATE3KEY1DATE:
JNB3AH,STATE3KEY1H0UR
ACALLDATEADJUST
AJMPKEYSTATE3RET
STATE3KEY1H0UR:
JNB3BH,STATE3KEY1MINUTE
ACALLHOURADJUST
AJMPKEYSTATE3RET
STATE3KEY1MINUTE:
ACALLMINUTEADJUST
AJMPKEYSTATE3RET
STATE3KEY2:
JNB32H,STATE3KEY3
JNB38H,STATE3KEY2M0NTH;按键2,DOWN
MOVB,#1
ACALLYEARADJUST
AJMPKEYSTATE3RET
STATE3KEY2M0NTH:
JNB39H,STATE3KEY2DATE
ACALLMONTHADJUST
AJMPKEYSTATE3RET
STATE3KEY2DATE:
JNB3AH,STATE3KEY2H0UR
ACALLDATEADJUST
AJMPKEYSTATE3RET
STATE3KEY2H0UR:
JNB3BH,STATE3KEY2MINUTE
ACALLHOURADJUST
AJMPKEYSTATE3RET
STATE3KEY2MINUTE:
ACALLMINUTEADJUST
AJMPKEYSTATE3RET
STATE3KEY3:
JNB33H,KEYSTATE3RET
JNB38H,STATE3KEY3MONTH;按键3,RIGHT
MOV27H,#0100001OB
AJMPKEYSTATE3RET
STATE3KEY3M0NTH:
JNB3911,STATE3KEY3DATE
MOV27H,#01000100B
AJMPKEYSTATE3RET
STATE3KEY3DATE:
JNB3AH,STATE3KEY3H0UR
MOV27H,#010010008
AJMPKEYSTATE3RET
STATE3KEY3H0UR:
JNB3BH,STATE3KEY3MINUTE
MOV27H,#01000000B
AJMPKEYSTATE3RET
STATE3KEY3MINUTE:
MOV27H,#01000001B
;AJMPKEYSTATE3RET
KEYSTATE3RET:
RET
KEYSTATE4:
;状态4按键处理,闹钟响铃状态
MOVA,27H
ANLA,#03H
MOVRO,A
MOVA,#28H
ADDA,RO
ADDA,RO
MOVRO,A
MOVA,©RO
CLRACC.6
SETBACC.5
MOV@R0,A
CLRPl.7
MOV27H,#0011
RET
YEARADJUST:
;调整年份,1年增量、10年增量,增量值存在B寄存器中,大于2099及小于1925循环调整
JB31H,YEARADD
JB32H,YEARSUBB
AJMPYEARADJUSTRET
YEARADD:
MOVA,RI
ADDA,B
MOVRI,A
MOVA,#0
ADDCA,RO
MOVRO,A
MOVA,#03311;(2099<—>833H)
CLRC
SUBBA,RI
MOVA,#08H
SUBBA,RO
JNCYEARADJUSTRET
MOVRO,#07H;(1925<—>785H)
MOVRI,#85H
AJMPYEARADJUSTRET
YEARSUBB:
MOVA,RI
CLRC
SUBBA,B
MOVRI,A
MOVA,RO
SUBBA,#0
MOVRO,A
MOVA,RI
CLRC
SUBBA,#85H
MOVA,RO
SUBBA,#07H
JNCYEARADJUSTRET
MOVRO,#08H
MOVRI,#33H
;AJMPYEARADJUSTRET
YEARADJUSTRET:
MOVA,#28
CLRC
SUBBA,R3
JNCYEARADJUSTRET2
MOVR3,#28
YEARADJUSTRET2:
RET
MONTHADJUST:
;月份调整,增量1,超12及小于1循环
JB31H,MONTHADD
JB32H,MONTHSUBB
AJMPMONTHADJUSTRET
MONTHADD:
INCR2
CJNER2,#13,MONTHADJUSTRET
MOVR2,#1
AJMPMONTHADJUSTRET
MONTHSUBB:
DECR2
CJNER2,#0,MONTHADJUSTRET
MOVR2,#12
;AJMPMONTHADJUSTRET
MONTHADJUSTRET:
MOVA,#28
CLRC
SUBBA,R3
JNCMONTHADJUSTRET2
MOVR3,#28
MONTHADJUSTRET2:
RET
DATEADJUST:
;计算当月的天数
CJNER2,#1,DATE02
MOV06H,#31
AJMPDATE13
DATE02:
CJNER2,#2,DATE03
MOVA,RI;计算当年一1925年
CLRC
SUBBA,#84H;
MOVB,#4
DIVAB
MOVA,B
JZDATE029
MOV06H,#28
AJMPDATE13
DATE029:
MOV0611,#29
AJMPDATE13
DATE03:
CJNER2,#3,DATE04
MOV0611,#31
AJMPDATE13
DATE04:
CJNER2,#4,DATE05
MOV06H,#30
AJMPDATE13
DATE05:
CJNER2,#5,DATE06
MOV06H,#31
AJMPDATE13
DATE06:
CJNER2,#6,DATE07
MOV06H,#30
AJMPDATE13
DATE07:
CJNER2,#7,DATE08
MOV06H,#31
AJMPDATE13
DATE08:
CJNER2,#8,DATE09
MOV06H,#31
AJMPDATE13
DATE09:
CJNER2,#9,DATE10
MOV06H,#30
AJMPDATE13
DATE10:
CJNER2,#10,DATE11
MOV06H,#31
AJMPDATE13
DATE11:
CJNER2,#11,DATE12
MOV06H,#30
AJMPDATE13
DATE12:
CJNER2,#12,DATE13
MOV06H,#31
;AJMPDATE13
DATE13:
JB31H,DATEADD
JB32H,DATESUBB
AJMPDATEADJUSTRET
DATEADD:
INCR3
MOVA,06H
CLRC
SUBBA,R3
JNCDATEADJUSTRET
MOVR3,#1
AJMPDATEADJUSTRET
DATESUBB:
DECR3
CJNER3,#0,DATEADJUSTRET
MOVR3,06H
;AJMPDATEADJUSTRET
DATEADJUSTRET:
RET
HOURADJUST:
;小时调整,增量1,00〜23有效
JB31H,HOURADD
JB32H,HOURSUBB
AJMPHOURADJUSTRET
HOURADD:
INCR4
CJNER4,#24,HOURADJUSTRET
MOVR4,#0
AJMPHOURADJUSTRET
HOURSUBB:
MOVA,R4
CLRC
SUBBA,#1
MOVR4,A
JNCHOURADJUSTRET
MOVR4,#23
;AJMPHOURADJUSTRET
HOURADJUSTRET:
SETB04H
RET
MINUTEADJUST:
;分钟调整,增量1,00〜59有效
JB31H,MINUTEADD
JB32H,MINUTESUBB
AJMPMINUTEADJUSTRET
MINUTEADD:
INCR5
CJNER5,#60,MINUTEADJUSTRET
MOVR5,#0
AJMPMINUTEADJUSTRET
MINUTESUBB:
DECR5
CJNER5,#0FFH,MINUTEADJUSTRET
MOVR5,#59
;AJMPMINUTEADJUSTRET
MINUTEADJUSTRET:
SETB04H
RET
SETALARMTIME:
;判断小时R4是否24,是取消闹钟,否则计算分钟数并设置闹钟
MOVA,27H;取得当前设置闹钟时间地址
ANLA,#03H
MOVRO,A
MOVA,#28H
ADDA,RO
ADDA,RO
MOVRO,A
CJNER4,#24,SETALARMTIME1
MOV@R0,#0;取消闹钟
INCRO
MOV@R0,#0
AJMPSETALARMTIMERET
SETALARMT1ME1:
INCRO;设置闹铃时间
MOVA,R4
MOVB,#60
MULAB
ADDA,R5
MOV©RO,A
MOVA,#0
ADDCA,B
SETBACC.7
DECRO
MOV@R0,A
SETALARMTIMERET:
RET
PRESETALARMTIME:
;读取当前闹钟时间,并判断是否已经设置,如果已经设置,显示已设置时间,否则显示24:00
MOVA,27H
ANLA,#03H
MOVRO,A
MOVA,#28H
ADDA,RO
ADDA,RO
MOVRO,A
MOVA,@R0
JNBACC.7,PRESETALARMTIMENON
;MOVA,@R0
ANLA,#0FH
MOVR2,A
INCRO
MOVA,@R0
MOVR3,A
MOVR4,#0
LOOPPRESETALARMTIME:
MOVA,R3
CLRC
SUBBA,#60
MOVR3,A
MOVA,R2
SUBBA,#0
MOVR2,A
INCR4
JNCLOOPPRESETALARMTIME
DECR4
MOVA,R3
ADDA,#60
MOVR5,A
AJMPPRESETALARMTIMERET
PRESETALARMTIMENO
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026山东出版集团有限公司山东出版传媒股份有限公司招聘193人备考题库附参考答案详解【巩固】
- 2026山东青岛海上综合试验场有限公司招聘38人备考题库及完整答案详解(夺冠系列)
- 2026重庆财经学院财务处工作人员招聘1人备考题库带答案详解(综合卷)
- 建筑质量检验标准方案
- 混凝土混合料运输方案
- 2026山东省新动能基金管理有限公司校园招聘8人备考题库含答案详解(综合题)
- 2026江苏苏州太仓农商行招聘2人备考题库附答案详解(满分必刷)
- 2026山东青岛海上综合试验场有限公司招聘38人备考题库含完整答案详解(易错题)
- 2026汉江水利水电(集团)有限责任公司及所属单位招聘91人备考题库(管理与专业技术岗位)及参考答案详解【轻巧夺冠】
- 2026春季建信基金管理有限责任公司校园招聘2人备考题库附完整答案详解【各地真题】
- 关天培血战虎门课件
- 《超高性能混凝土加固既有混凝土结构技术规程》
- 仲裁员考试题库及答案
- 庆祝30周年准备工作
- 2025运政业务考试题库及答案
- 2025年高中创新能力大赛笔试题资格审查试题(附答案)
- 升降车安全操作培训课件
- 药品经营法规培训
- 如何教学幼儿跑酷课件
- 术后恶心呕吐防治专家共识课件
- 侦察情报专业解读课件
评论
0/150
提交评论