📄 定时器.asm
字号:
;伪指令
SL EQU 30H ;SL存放秒的个位数
SH EQU 31H ;SH存放秒的十位数
ML EQU 32H ;ML存放分的个位数
MH EQU 33H ;MHL存放分的十位数
HL EQU 34H ;HL存放小时的个位数
HH EQU 35H ;HH存放小时的十位数
;
L0 EQU 36H ;L0--L3:显示数据存器
L1 EQU 37H
L2 EQU 38H
L3 EQU 39H
DSPLYP EQU 3AH ;显示数据指针(DISPLAY-POINT)
PLYTS EQU 3BH ;显示次数计数器(PISPLAY-TIMES)
;
LPLMOD BIT 39H ;低两位显示方式(LOW-PLAY-MOD)
HPLMOD BIT 3AH ;高两位显示方式(HIGH-PLAY-MOD)
BRIGHT BIT 3BH ;DISPIAY子程序参数:亮/灭指示位
;
TCOUNT EQU 3CH ;时间计数器(TIME-COUNT)
;
ADDRES EQU 3DH ;加1子程序参数
MAX EQU 3EH ;加1子程序参数
IFDEC BIT 20H ;BCD加法子程序参数
;
R_MOD EQU 3FH ;响铃方式参数
;
LED4 BIT 30H ;发光管状态位
BELL BIT P1.7
SWITCH BIT P3.7 ;继电器
FKEY BIT P3.0 ;功能器(S1)
MKEY BIT P3.1 ;修改器(S2)
;
WORKIN BIT 38H
;
;中断入口
ORG 000H
STAR: LJMP MAIN ;0000H引向主程序
LJMP ERR ;0003H
NOP
NOP
LJMP ERR ;引向出错处理程序
LJMP PGT0 ;000BH引向中断处理程序PGT0
NOP
NOP
LJMP ERR ;引向出错处理程序
LJMP ERR ;0013 INT1
NOP
NOP
LJMP ERR
LJMP ERR ;001BH T1
NOP
NOP
LJMP ERR
LJMP ERR ;0023H
NOP
NOP
LJMP ERR
LJMP ERR
NOP
NOP
;
;主程序
MAIN:MOV IE,#00H ;关中断
MOV SP,#57H ;设置堆栈指针
MOV PSW,#00H ; 选用寄存器组0
MOV TMOD,#11H ; 设定中断工作方式为T1和T0
;
MOV A,56H
CJNE A,#0AAH,CSTART ; 判断上电复位标志,无标志转冷启动
MOV A,57H
CJNE A,#55H,CSTART ; 无标志转冷启动
AJMP HSTART ; 有上电复位标志转热启动
NOP
NOP
LJMP ERR ;软件陷阱,引向出错处理程序
CSTART:MOV P1,#0FFH ; 冷启动,全面初始化
MOV P3,#0FFH
MOV TCON,#00H ;计时停止
MOV TL0,#0B0H ;赋中断T0初值
MOV TH0,#3CH
MOV TCOUNT,#0AH ;赋定时器初值
MOV R5,#00H ;R5为一空单元(备用)
MOV R4,#00H ;R4为工作模式选择积存器
MOV SL,#00H ;定时单元清0
MOV SH,#00H ;秒
MOV ML,#00H ;
MOV MH,#00H ;分
MOV HL,#00H ;
MOV HH,#00H ;时
MOV PLYTS,#64H ;赋显示次数初值为100次
MOV DSPLYP,#L0 ;显示指针指向显存单元
MOV L0,#0AH ;送显示数据“----”
MOV L1,#0AH
MOV L2,#0AH
MOV L3,#04H
SETB LED4 ;LED4为数码管之间的发光2极管
SETB LPLMOD ;设定显示方式为闪烁
SETB HPLMOD
SETB BRIGHT ;
CLR WORKIN ;
AJMP SETUP ;
NOP
NOP
LJMP ERR ;
HSTART:MOV SCON,#00H
MOV IP,#00H
SETB FKEY
SETB EA
AJMP BEGIN
NOP
NOP
LJMP ERR
SETUP: SETB EA
;
MAIN1: ACALL DISPLY
JB FKEY,JUDGE
ACALL KEYDLY
JB FKEY,JUDGE
CLR ET0
CLR TR0
ACALL MENU
BEGIN:SETB WORKIN
SETB ET0
SETB TR0
MOV A,R4
RL A
MOV DPTR,#M_TAB
JMP @A+DPTR
M_TAB:AJMP WORK1
AJMP WORK2
AJMP WORK3
AJMP WORK4
NOP
NOP
LJMP ERR
WORK1: ;
WORK2:CLR SWITCH
AJMP MAIN2
NOP
NOP
LJMP ERR
WORK3: ;
WORK4:SETB SWITCH
MAIN2:CLR BELL
ACALL DL05S
SETB BELL
JUDGE:JNB WORKIN,MAIN1
MOV A,SL
JNZ MAIN1
MOV A,SH
JNZ MAIN1
MOV A,ML
JNZ MAIN1
MOV A,MH
JNZ MAIN1
MOV A,HL
JNZ MAIN1
MOV A,HH
JNZ MAIN1
CLR ET0
CLR ET0
ACALL ACTION
AJMP MAIN
NOP
NOP
LJMP ERR
;倒计时程序
PGT0:CLR EA
PUSH ACC
PUSH PSW
PUSH DPL
PUSH DPH
MOV PSW,#08H
CLR TR0
MOV A,#087H
ADD A,TL0
MOV TL0,A
MOV A,#3CH
ADD A,TH0
MOV TH0,A
SETB TR0
DEC TCOUNT
MOV A,TCOUNT
JNZ OUTT0
MOV TCOUNT,#0AH
CPL LED4
JNB LED4,OUTT0
MOV R0,#SH
SETB IFDEC
ACALL ADDBCD
CJNE R3,#99H,OUTT0
MOV SH,#05H
MOV SL,#09H
MOV R0,#MH
ACALL ADDBCD
CJNE R3,#99H,OUTT0
MOV MH,#05H
MOV ML,#09H
MOV R0,#HH
ACALL ADDBCD
OUTT0:POP DPH
POP DPL
POP PSW
POP ACC
SETB EA
RETI
NOP
NOP
LJMP ERR
;BCD子程序(加1或减1)
ADDBCD:MOV A,@R0
DEC R0
SWAP A
ORL A,@R0
MOV B,#01H
MOV C,IFDEC
MOV B.3,C
MOV B.4,C
MOV B.7,C
ADD A,B
DA A
MOV R3,A
ANL A,#0FH
MOV @R0,A
MOV A,R3
INC R0
SWAP A
ANL A,#0FH
MOV @R0,A
RET
NOP
NOP
LJMP ERR
;加2程序
ADDONE:MOV R0,ADDRES
CLR IFDEC
ACALL ADDBCD
CLR C
MOV A,R3
CJNE A,MAX,JGOVER
JGOVER:JC ENDADO
CLR A
MOV @R0,A
DEC R0
MOV @R0,A
ENDADO:RET
NOP
NOP
LJMP ERR
;调时快进程序
QUICK:CLR LPLMOD
CLR HPLMOD
ACALL ADDONE
MOV L0,R4
INC L0
ACALL KEYDLY
ACALL DL100
JNB MKEY,QUICK
SETB LPLMOD
CJNE R6,#02H,ENDQUK
SETB HPLMOD
CLR LPLMOD
ENDQUK:RET
NOP
NOP
LJMP ERR
;功能菜单程序
MENU:MOV R6,#00H
MOV ADDRES,#05H
MOV MAX,#04H
MOV DSPLYP,#L0
SETB LPLMOD
CLR HPLMOD
MOV L0,R4
INC L0
MOV L1,00H
MOV L2,#0BH
MOV L3,#00H
SETB LED4
;
WAITFK:ACALL DISPLY
JNB FKEY,WAITFK
MENU1:ACALL DISPLY
JB MKEY,JGFKEY
ACALL KEYDLY
JB MKEY,JGFKEY
CJNE R6,#00H,NEXT1
MOV SL,#00H
MOV SH,#00H
MOV ML,#00H
MOV MH,#00H
MOV HL,#00H
MOV HH,#00H
NEXT1:MOV R2,#00H
NEXT2:ACALL ADDONE
MOV L0,R4
INC L0
;
WAITMK:ACALL DISPLY
INC R2
CLR C
CJNE R2,#0C8H,JGQUIC
JGQUIC:JC WATMK1
ACALL QUICK
WATMK1:JNB MKEY,WAITMK
;
JGFKEY:JB FKEY,MENU1
ACALL KEYDLY
JB FKEY,MENU1
INC R6
MOV A,R6
RL A
MOV DPTR,#FUNTAB
JMP @A+DPTR
FUNTAB:AJMP WAITFK
AJMP SETLOW
AJMP SETHI
AJMP ENDMEN
NOP
NOP
AJMP ENDMEN
;STWKMD:
;
SETLOW:MOV MAX,#60H
MOV A,R4
RL A
MOV DPTR,#FTAB1
JMP @A+DPTR
FTAB1:AJMP SETSS
AJMP SETM60
AJMP SETSS
AJMP SETM60
NOP
NOP
AJMP WAITFK
SETSS:MOV DSPLYP,#SL
MOV ADDRES,#SH
AJMP WAITFK
SETM60:MOV DSPLYP,#ML
MOV ADDRES,#MH
AJMP WAITFK
;
SETHI:CLR LPLMOD
SETB HPLMOD
MOV MAX,#31H
MOV A,R4
RL A
MOV DPTR,#FTAB2
JMP @A+DPTR
FTAB2:AJMP SETM30
AJMP SETHH
AJMP SETM30
AJMP SETHH
NOP
NOP
AJMP WAITFK
SETM30:MOV ADDRES,#MH
AJMP WAITFK
SETHH:MOV ADDRES,#HH
AJMP WAITFK
;
ENDMEN:CLR HPLMOD
RET
NOP
NOP
LJMP ERR
;到点工作程序
ACTION:MOV L0,R4
INC L0
MOV L1,#00H
MOV L2,#0BH
MOV L3,#00H
SETB LED4
MOV DSPLYP,#L0
SETB LPLMOD
SETB HPLMOD
MOV A,R4
RL A
MOV DPTR,#A_TAB
JMP @A+DPTR
A_TAB: AJMP ACTF1
AJMP ACTF1
AJMP ACTF3
AJMP ACTF3
NOP
NOP
LJMP ERR
ACTF1: SETB SWITCH
MOV R_MOD,#82H
MOV R2,#96H
ACTF11:ACALL RING
JNB MKEY,ENDACT
JNB FKEY,ENDACT
DJNZ R2,ACTF11
MOV R_MOD,#0FFH
AJMP ACTF11
NOP
NOP
LJMP ERR
ACTF3: CLR SWITCH
CLR BELL
ACALL DL1S
SETB BELL
MOV R_MOD,#0FFH
MOV R2,#96H
ACTF31:ACALL RING
JNB MKEY,ENDACT
JNB FKEY,ENDACT
DJNZ R2,ACTF31
MOV R2,#96H
CLR BELL
ACALL DL100
SETB BELL
NOP
NOP
LJMP ERR
ENDACT:SETB SWITCH
AWAITF:ACALL DISPLY
JNB FKEY,AWAITF
AWAITM:ACALL DISPLY
JNB MKEY,AWAITM
RET
NOP
NOP
LJMP ERR
;
;*********************
;响铃程序;
;*********************
RING: MOV R5,#18H
RING1: JNB MKEY,R_EXIT
JNB FKEY,R_EXIT
MOV A,R_MOD
MOV C,ACC.7
MOV BELL,C
RL A
MOV R_MOD,A
ACALL DL100
DJNZ R5,RING1
R_EXIT:SETB BELL
RET
NOP
NOP
LJMP ERR
;
;*************
;显示程序;
;*************
DISPLY:PUSH ACC
PUSH PSW
MOV PSW,#10H
MOV R0,DSPLYP
MOV R2,#0FDH
MOV A,PLYTS
JNZ PLAY
MOV PLYTS,#64H
CPL BRIGHT
PLAY: DEC PLYTS
JNB LPLMOD,PLAYL
JB BRIGHT,PLAYL
ACALL NOPLAY
AJMP PLAY1
NOP
NOP
LJMP ERR
;用来显示低位
PLAYL: ORL P1,#7FH
ORL P3,#3CH
MOV A,R2
RL A
ANL P3,A
MOV R2,A
MOV A,@R0
MOV DPTR,#TABLE1
MOVC A,@A+DPTR
ANL P1,A
ACALL DL1MS
INC R0
JB P3.3,PLAYL
;
PLAY1: JNB HPLMOD,PLAYH
JB BRIGHT,PLAYH
ACALL NOPLAY
AJMP OUTPLY
NOP
NOP
LJMP ERR
;
;用来显示高位
PLAYH: ORL P1,#7FH
ORL P3,#3CH
ANL P3,#0EFH
MOV A,@R0
MOV DPTR,#TABLE1
MOVC A,@A+DPTR
ANL P1,A
ACALL DL1MS
INC R0
;
ORL P1,#7FH
ORL P3,#3CH
ANL P3,#0DFH
MOV A,@R0
MOV C,LED4
RLC A
MOV DPTR,#TABLE2
MOVC A,@A+DPTR
ANL P1,A
ACALL DL1MS
;
OUTPLY:POP PSW
POP ACC
RET
NOP
NOP
LJMP ERR
;
TABLE1:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0BFH,8EH,0FFH
; "0","1","2","3","4","5","6","7","8","9","-","F"," "
;
TABLE2:DB 0FFH,0DFH,0F9H,0D9H,0A4H,84H,0B0H,90H,0BFH,09FH
; " ",":","1","1","2","2","3","3","-","-:"
;
;
;
;*******************
;无显示(灭灯)程序;
;*******************
NOPLAY:ORL P1,#7FH
ORL P3,#3CH
INC R0
INC R0
ACALL DL1MS
RET
NOP
NOP
LJMP ERR
;
;*******************
; 延时程序 ;
;****************
DL1MS: MOV R3,#0F9H
DL1MS1:NOP
NOP
NOP
DJNZ R3,DL1MS1
RET
NOP
NOP
LJMP ERR
;
KEYDLY:CLR BELL
ACALL DISPLY
SETB BELL
RET
NOP
NOP
LJMP ERR
;
DL50MS:MOV R7,#0AH
DL50M1:ACALL DISPLY
DJNZ R7,DL50M1
RET
NOP
NOP
LJMP ERR
;
DL100: ACALL DL50MS
ACALL DL50MS
RET
NOP
NOP
LJMP ERR
;
DL05S: ACALL DL100
ACALL DL100
ACALL DL100
ACALL DL100
ACALL DL100
RET
NOP
NOP
LJMP ERR
;
DL1S: ACALL DL05S
ACALL DL05S
RET
NOP
NOP
LJMP ERR
;
;********************
;ERR(出错处理)程序;
;********************
ERR: CLR EA
MOV DPTR,#ERR1
PUSH DPL
PUSH DPH
RETI
ERR1: MOV 56H,#0AAH
MOV 57H,#55H
MOV A,#00H
PUSH A
PUSH A
RETI
NOP
NOP
LJMP ERR
;
ORG 07FAH
NOP
NOP
NOP
LJMP ERR
;
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -