一个带农历显示的电子万年历_第1页
一个带农历显示的电子万年历_第2页
一个带农历显示的电子万年历_第3页
一个带农历显示的电子万年历_第4页
一个带农历显示的电子万年历_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

;寄存器配置:(时间和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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论