求大神帮忙说一下这个电子钟的程序详细说明解释(汇编语言的)

求大神帮忙说一下这个电子钟的程序详细说明解释(汇编语言的),第1张

ms50 DATA 31H50ms计数内存地址sec DATA 32H秒计数内存地址min DATA 33H 分计数内存地址hour DATA 34H 时计数内存地址buffer DATA 35H 显示十进制内存起始地址EXTRN CODE(Display8)外部显示子程序(跟硬件设计有关,原文未列出) ORG 0000H LJMP STAR转主程序 ORG 000BH LJMP INT_Timer0转50ms定时器中断处理程序ORG 0100HSTAR: MOV SP,#60H 主程序 MOV ms50,A50ms计数器初始化到0 MOV hour,#12小时初始化为12 MOV min,#59分钟初始化为59 MOV sec,#50秒初始化为50 MOV TH0,#60初始化定时器T0为50ms的数据(跟时钟频率和定时器模式有关) MOV TL0,#176 MOV TMOD,#1初始化定时器模式 MOV IE,#82H设定中断 SETB TR0 开定时器0STAR1: LCALL Display 调用显示转换程序(先将16进制转为BCD码再显示) JNB F0,$等待中断处理握兆完成标弯逗志 CLR F0复位中断处理完成标志

SJMP STAR1循环显示中断服务程序INT_Timer0:

MOV TL0,#176-550ms定时器计数器初始值再装入(埋皮卖-5为微调,含响应中断用时) MOV TH0,#60 PUSH 01H压入堆栈 MOV R1,#ms50装入50ms计数内存地址数31H INC @R150ms计数内存加1

CJNE @R1,#20,ExitInt不够1秒,退出 MOV @R1,#050ms计数内存复位为0(31H)

INC R1转为秒内存地址(32H)

INC @R1秒计数内存加1 CJNE @R1,#60,ExitInt1不够60秒,退出 MOV @R1,#0够60秒,秒计数复位为0 INC R1转为分计数内存地址(33H)

INC @R1 分计数内存加1 CJNE @R1,#60,ExitInt1不够60分,退出 MOV @R1,#0够60分,分复位为0 INC R1转为时内存地址(34H) INC @R1 时计数内存加1 CJNE @R1,#24,ExitInt1不够24时,退出 MOV @R1,#0时计数内存复位为0ExitInt1:

SETB F0置位中断处理完成标志ExitInt:

POP 01H恢复现场 RETI 退出中断

HexToBCD:16进制转BCD码

MOV B,#10 DIV AB MOV @R0,B存余数(10进制个位) INC R0转伤地址 MOV @R0,A存伤(10进制十位) INC R0转下一次余数地址 RET

Display:显示转换与调用显示程序

MOV R0,#buffer10进制BCD秒显示缓存地址(35H) MOV A,sec ACALL HexToBCD十进制秒转换后存在(35H)、(36H) MOV @R0,#10H(37H)=#10H,秒与分之间的间隔,无实际意义,或与dispaly8有关

INC R010进制BCD分显示缓存地址(38H)

MOV A,min ACALL HexToBCD十进制分转换后存在(38H)、(39H)

MOV @R0,#10H(3AH)=#10H,分与时之间的间隔,无实际意义,或与dispaly8有关

INC R010进制BCD时显示缓存地址(3BH)

MOV A,hour ACALL HexToBCD十进制时转换后存在(3CH)、(3DH)

MOV R0,#buffer恢复显示缓存地址(35H),为dispaly8置初始显示地址 LCALL Display8调用实际显示程序 RET END

ORG 0000H程序起始于地址0000H,(一般不这样用)

LJMP MAIN;跳到主程序MAIN

ORG 000BH;外部中断INT0程序的地址,此为规定的

LJMP INTT0;跳到外部中断INTT0程序

ORG 001BH;外部中断INT1程序的地址,此也为规定的

LJMP INTT1;跳到外部中断INTT1程序

ORG 0100H;主程序MAIN地址

MAIN: MOV SP,#60H;给堆栈指针SP附内部数据存储器地址60H

MOV 31H,#0;给31H地址内清零即(31H)=0

MOV 20H,#0FEH(20H)=11111110B

MOV 21H,#0FFH;(21H)=11111111B

MOV P1,20H;P1=11111110B

LCALL SHEZHI1;调用程序段SHEZHI1

MOV 20H,#0FDH;(20H)=11111101B

MOV P1,20H;P1=11111101B

MOV 40H,#10;(40H)=0AH

SETB EA;开总中断

SETB ET0;开定时中断T0

MOV TMOD,#11H;设置T0工作于轮悔定时方式1

MOV TH0,#3CH;定时初值设置高位

MOV TL0,#0B0H;定时初值设置低位

SETB TR0;允许T0中断

LL: LCALL KEY;调用KEY

LCALL KEYC;调用KEYC

SJMP LL;循环调派行用回LL

INTT0: PUSH ACC;将ACC值压栈

PUSH PSW;将PSW值继续压栈

SETB RS1;RS1位置1

SETB RS0;RS0位置1,即选中内部数据存储器组的3组

DJNZ 40H,DOWN;判断十次结束否?且计数值自减一,若没有够十次,则转入程序DOWN , 否则顺序执行

MOV 40H,#10;继续在(40H)存入计数值十

MOV R0,#41H;(R0)=41H

MOV A,@R0判秒是否到60

ADD A,#1;A中值加一

DA A;十进制调整

MOV @R0,A;再送腊羡正回原单元

CLR C;清进位位

SUBB A,#60H;与60相减

JC DOWN;通过判断进位位看是否到60了,没到就去DOWN,到了就顺序执行

MOV @R0,#0;41H单元清零

INC R0;地址自加一

MOV A,@R0判分是否到60

ADD A,#1

DA A

MOV @R0,A

CLR C

SUBB A,#60H

JC DOWN

MOV @R0,#0

INC R0

MOV A,@R0判时是否到24

ADD A,#1

DA A

MOV @R0,A

CLR C

SUBB A,#24H

JC DOWN

MOV @R0,#0

INC R0

MOV A,@R0判日是否到指定天数

ADD A,#1

DA A

MOV @R0,A

INC R0

MOV A,@R0

MOV R4,A 月份送R4,本月天数送R5

JNB ACC.4,NEXT2

CLR C

SUBB A,#06H

NEXT2: MOV DPTR,#DAYTAB

DEC A

MOVC A,@A+DPTR

MOV R5,A

CJNE R4,#2,NEXT

JNB 08H,NEXT1

NEXT: INC R5

NEXT1: DEC R0

MOV A,R5

CLR C

SUBB A,@R0

JNC DOWN

MOV @R0,#1

INC R0

MOV A,@R0判月是否到13

ADD A,#1

DA A

MOV @R0,A

CLR C

SUBB A,#13H

JC DOWN

MOV @R0,#1

INC R0

MOV A,@R0 判年低位是否到00

ADD A,#1

DA A

MOV @R0,A

INC R0

MOV A,@R0

ADDC A,#0

DA A

MOV @R0,A

DOWN: MOV A,#42H

CJNE A,4EH,DOWN2

MOV A,#43H

CJNE A,4FH,DOWN2

CLR 07H

DOWN2: JB 06H,DOWN4

DOWN4: CLR TR0

MOV A,#0B7H

ADD A,TL0

MOV TL0,A

MOV A,#3CH

ADDC A,TH0

MOV TH0,A

SETB TR0

POP PSW

POP ACC

RETI

DAYTAB: DB 31H,28H,31H,30H,31H,30H,31H,31H,30H,31H,30H,31H


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8225402.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存