📄 timeasm.asm
字号:
;---------------------
;实时时钟:
; 两个按键:
; 第一个按键是控制时钟暂停或修改时间 ,在修改状态下,按一次表示修改下一位,第一次修改第一位
; 第2个按键是在暂停状态下,改变当前位的值,按一下加一
;---------------------
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INT0P
ORG 000BH
LJMP TIME0P
ORG 0013H
LJMP INT1P
ORG 0100H
MAIN:MOV SP,#60H
MOV TMOD,#01H ;定时器T0工作在方式1
MOV 20H,#14H ;中断次数 20
CLR A
MOV 40H,A
MOV 41H,A
MOV 42H,A
MOV R7,A ;定时器控制标志 ;正常/暂停/修改地址
CLR 00H ;00H位作为修改时钟标志位;为0表示不修改,为1表示修改
SETB ET0 ;允许计数器T0中断
SETB IT0 ;外部中断0设置边沿触发
SETB EX0 ;允许 外部中断0
SETB IT1 ;外部中断1设置边沿触发
SETB EX1 ;允许 外部中断1
SETB EA ;允许CPU中断
MOV TH0,#3CH ;装入初值
MOV TL0,#0B0H
SETB TR0 ;启动T0
;------------
;数码管显示
;----------------
SHOW:MOV R2,#03H ;显示三个部分:时、分、秒
MOV R3,#0FEH ;数码管选择字段
MOV R1,#40H ;数据区地址
MOV DPTR,#LED ;断码表地址
SH1:MOV A,@R1
MOV B,#10H
DIV AB
;MOV 44H,A
;MOV 45H,B
MOV P1,R3
;CALL DELAY
MOVC A,@A+DPTR
MOV P2,A
CALL DELAY
MOV A,R3
RL A
MOV R3,A
MOV P1,R3
;CALL DELAY
MOV A,B
MOVC A,@A+DPTR
MOV P2,A
CALL DELAY
MOV A,R3
RL A
MOV R3,A
INC R1
DJNZ R2,SH1
SJMP SHOW
;----------
;延时
;----------
DELAY:PUSH PSW
MOV R4,#05FH
DJNZ R4,$
POP PSW
RET
;---------
;控制定时器的启动与停止
;---------
INT0P:PUSH PSW
CJNE R7,#00H,MODIFY ;R7为0进暂停
PAUSE:CLR TR0 ;关计数器
INC R7
SJMP DOWN
MODIFY:
CJNE R7,#01H,BYTE ;R7W为1暂停或修改第一位
JB 00H,BYTE ;00H为1 现处于修改第一位 ,否则是暂停
SETB TR0 ;开计数器
MOV R7,#00H
SJMP DOWN
BYTE:CJNE R7,#06H,NEXTR7 ;修改第几位,如到最后一位,就恢复定时
LAST:SETB TR0
MOV R7,#00H
CLR 00H
SJMP DOWN
NEXTR7:INC R7
DOWN:POP PSW
RETI
;-------------------
;在暂停状态下,第二按键可改变当前时间
;-------------------
INT1P:PUSH PSW
MOV R0,#41H
CJNE R7,#00H,MODIFY1 ;R7不为0,进入修改时间
SJMP DOWN1
MODIFY1:SETB 00H ;置修改状态
CJNE R7,#01H,BYTE2 ;R7为1修改第一位
MOV A,40H
ANL A,#0F0H
CJNE A,#20H,ADD1
ANL 40H,#0FH
SJMP DOWN1
ADD1:MOV A,#10H
ADD A,40H
MOV 40H,A
SJMP DOWN1
BYTE2:CJNE R7,#02H,BYTE3 ;R7为2修改第二位
MOV A,40H
ANL A,#0F0H
CJNE A,#20H,ADD24
MOV A,#0FH
ANL A,40H
CJNE A,#04H,AAA24
ANL 40H,#0F0H ;24小时,清0为20
SJMP DOWN1
AAA24:INC 40H
SJMP DOWN1
ADD24:MOV A,#0FH ;到9清0
ANL A,40H
CJNE A,#09H,AAA24
ANL 40H,#0F0H ;24小时,清0为20
SJMP DOWN1
BYTE3:CJNE R7,#03H,BYTE4 ;R7为3修改第3位
BYTE35:MOV A,@R0
ANL A,#0F0H
CJNE A,#50H,ADD35
MOV A,@R0
ANL A,#0FH
MOV @R0,A
SJMP DOWN1
ADD35:MOV A,#10H
ADD A,@R0
MOV @R0,A
SJMP DOWN1
BYTE4:CJNE R7,#04H,BYTE5 ;R7为4修改第4位
BYTE46:MOV A,@R0
ANL A,#0FH
CJNE A,#09H,ADD49
MOV A,@R0
ANL A,#0F0H
MOV @R0,A
SJMP DOWN1
ADD49:INC @R0
SJMP DOWN1
BYTE5:CJNE R7,#05H,BYTE6
MOV R0,#42H
SJMP BYTE35
BYTE6:MOV R0,#42H
SJMP BYTE46
DOWN1:POP PSW
RETI
TIME0P:PUSH PSW
PUSH ACC
MOV A,TL0
ADD A,#0B0H ;初值,机器主频为12MHz
MOV TL0,A
MOV A,TH0
ADDC A,#3CH
MOV TH0,A
DJNZ 20H,RETURN
MOV 20H,#14H
MOV A,#01H
ADD A,42H
DA A
MOV 42H,A
CJNE A,#60H,RETURN
MOV 42H,#00H
MOV A,#01H
ADD A,41H
DA A
MOV 41H,A
CJNE A,#60H,RETURN
MOV 41H,#00H
MOV A,01H
ADD A,40H
DA A
MOV 40H,A
CJNE A,#24H,RETURN
MOV 40H,#00H
RETURN:POP ACC
POP PSW
RETI
LED:DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -