倒计时时钟汇编代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

;使A按秒减1,数码管显示2位十六进制数,T0、T1结合硬件定时1s,delay1ms则属软件定时
;心得:从简单组合到复杂,通过仿真发现设计问题,进行不断调试,从而达到想要的目的,另外进一步认识、掌握各指令的作用
/*ORG 0000H
SJMP MAIN
ORG 0003H
SJMP INT0INT
ORG 000BH
SJMP T0INT
ORG 0013H
SJMP INT1INT
ORG 001BH
AJMP T1INT
ORG 0030H
MAIN:
MOV TMOD,#01100001B
MOV TH0,#HIGH(-10000)
MOV TL0,#LOW(-10000)
MOV TH1,#(-50)
MOV TL1,#(-50)
MOV A,#0 ;秒赋初值
MOV R3,#0;分钟赋初值
MOV R4,#0;时赋初值
SETB EA
SETB ET0
SETB TR0
SETB ET1
SETB TR1
SETB EX0
SETB IT0
SETB EX1
SETB IT1
SJMP $
INT0INT: ;手动按一次加1分钟,满60归0
SETB TR1 ;当计时完毕,重定时时,计数器处于启动状态,以便可重计数
//SETB TR0
INC R3 ;按一次按钮,R3加1
CJNE R3,#60,REE ;不满60,,中断返回,可继续按钮
MOV R3,#0 ;满60分,归0
//MOV A,#59 ;这条指令放前后位置不一样,显示效果出现不一样
REE: RETI
INT1INT: ;手动按一次加1小时,满24归0
//MOV A,#59
SETB TR1;当计时完毕,重定时时,计数器处于启动状态,以便可重计数
//SETB TR0
INC R4
CJNE R4,#24,REEE
MOV R4,#0 ;满24小时,归0
REEE:RETI
T0INT:
MOV TH0,#HIGH(-10000)
MOV TL0,#LOW(-10000)
CPL P3.5 ;取反两次,可使T1计数一次
JB TR1,K ;在倒计时完毕时,计数器T1被关闭了,所以在这里当判断T1被关闭了,各个数码管显示0,TR1如果是高电频则执行跳到K处,相反表示计时时间到,各位数码管显示“0”
MOV A,#0
MOV R3,#0
MOV R4,#0
K:
CALL BtoD ;先二进制转十进制
CALL DISPLAY ;后显示
RETI
T1INT: ;每隔一秒打开中断
SETB P1.0 ;定时未到,蜂鸣器不工作
CJNE A,#0,S ;A非0,跳转S执行
SJMP Y ;A为0,跳转Y执行
S: ;A即秒位,A非0减一
DEC A ;A按秒减1
CJNE A,#0,RE
Y: ;A为0,再判断R3(分钟位)、R4(小时位)是否为0
CJNE R3,#0,Q ;分钟位为非0,跳转Q执行
CJNE R4,#0,R ;分钟位为0,小时位为非0,跳转R执行
CLR TR1 ;R4小时位为0(判断到此,时分秒都为0),倒计时完毕,关闭T1计数,不关闭T0(计时10ms,扫描数码管一次),是因为要显示“00.00.00”
//CLR TR0 ;不能关闭
CPL P1.0 ;蜂鸣器响应,倒计时到,响应
RETI
Q: ;前面判断到A(秒)为0,R3(分)为非0,因此,R3减1分钟,增加60秒(59按秒减一直到0共计时60秒)
MOV A,#59 ;
DEC R3 ;
RETI
R: ;R4小时位为非0,分钟位由0变为59分,秒位也由0变为59秒,R4减一小时MOV R3,#59 ;
MOV A,#59
DEC R4
RETI
RE:RETI
BtoD: ;二进制数转十进制数,将每位数按顺序存放显存,便于动态输出
PUSH ACC ;秒
MOV B,#10
DIV AB ;A除以B(10);商存A,余数存B
MOV 41H,A ;将商存在地址为41H的寄存器处
MOV 40H,B ;将商存在地址为42H的寄存器处
MOV A,R3 ;分
MOV B,#10
DIV AB
MOV 43H,A
MOV 42H,B
MOV A,R4 ;时
MOV B,#10
DIV AB
MOV 45H,A
MOV 44H,B
POP ACC
RET
DISPLAY:
PUSH ACC
MOV DPTR,#TAB ;送段码表地址
MOV R1,#40H ;赋初值,将数字的显存地址赋R1
MOV R2,#01111111B ;赋初值,将位选数值赋R2
LOOP: ;循环
MOV P2,R2 ;R2数值在P2口输出,以便选通数码管的位
MOV A,@R1 ;将以R1的内容作为地址的数赋给A,“取字”
MOVC A,@A+DPTR ;以A的内容的地址+段码表地址作位总地址,查找字形“查表”,并将字形对应的数值赋给A
MOV P0,A ;通过P0口输出
CALL DELAY1MS ;延时,有一定的占空比,才能显示
INC R1 ;显存地址加1,取下一个数
MOV A,R2 ;位选数值通过A实现,右移一位,(也可左移,看情况)
RR A
MOV R2,A
CJNE A,#11101111B,GO
MOV P0,#7FH ;动态显示小数点
CALL DELAY1MS
GO:CJNE A,#11111011B,GOO
MOV P0,#7FH
CALL DELAY1MS
GOO:CJNE A,#11111011B,GOOO
MOV P0,#7FH
CALL DELAY1MS
GOOO:JB ACC.1,LOOP
MOV P0,#0FFH
MOV P2,#0EFH
POP ACC
RET
DELAY1MS: ;延时1ms
MOV R6,#2
LOP:
MOV R7,#249
DJNZ R7,$
DJNZ R6,LOP ;(249*2+2)*2=1000us
RET
TAB: ;共阳段码表
DB 0C0H ;"0"
DB 0F9H ;"1"
DB 0A4H ;"2"
DB 0B0H ;"3"
DB 99H ;"4"
DB 92H ;"5"
DB 82H ;"6"
DB 0F8H ;"7"
DB 80H ;"8"
DB 90H ;"9"
DB 88H ;"A"
DB 83H ;"B"
DB 0C6H ;"C"
DB 0A1H ;"D"
DB 86H ;"E"
DB 8EH ;"F" END
*/。

相关文档
最新文档