做了个电子时钟,不知为何中断程序不能计时,只显示开机时间。请各位高手赐教。。。
程序代码如下:
DISSEC EQU 20H ;定义秒显示单元
DISMIN EQU 21H ;定义分钟显示单元
DISHOR EQU 22H ;定义小时显示单元
CLKSEC EQU 23H ;定义秒走时单元
CLKMIN EQU 24H ;定义分钟走时单元
CLKHOR EQU 25H ;定义小时走时单元
SECSIG EQU 29H ;定义一秒钟到标志位
ORG 000H
LJMP START
ORG 000BH
LJMP INT_B
ORG 0030H
START: MOV SP ,#70H ;堆栈指针赋初值
MOV SECSIG,#2 ;2*500ms=1s
MOV TMOD,#01H ;使用定时器1定时500ms
MOV TH0,#3CH ;对定时器赋初值
MOV TL0,#0B0H
SETB EA ;开总中断
SETB ET0 ;开定时器0中断
SETB TR0 ;启动定时器0
CLR A ;将开机时钟显示设置为12:00:00
MOV CLKSEC,A
MOV CLKMIN,A
MOV CLKHOR,#12
DISPLY: ;显示程序
MOV DISSEC,CLKSEC ;将走时单元数据传送到显示单元
MOV DISMIN,CLKMIN
MOV DISHOR,CLKHOR
MOV A,DISSEC ;转换显示程序
MOV B,#10
DIV AB
MOV 42H,B ;秒位转换
MOV 43H,A
MOV A,DISMIN
MOV B,#10
DIV AB
MOV 44H,B ;分钟转换
MOV 45H,A
MOV A,DISHOR
MOV B,#10
DIV AB
MOV 46H,B ;小时转换
MOV 47H,A
MOV DPTR,#TABLE
MOV A,42H ;秒位显示
MOV P2,#0FEH ;将位选码送P2
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY2ms
MOV A,43H
MOVC A,@A+DPTR
MOV P2,#0FDH ;将位选码送P2
MOV P0,A
LCALL DELAY2ms
MOV A,44H ;分钟显示
MOVC A,@A+DPTR
MOV P2,#0FBH ;将位选码送P2
MOV P0,A
LCALL DELAY2ms
MOV A,45H
MOVC A,@A+DPTR
MOV P2,#0F7H ;将位选码送P2
MOV P0,A
LCALL DELAY2ms
MOV A,46H ;小时显示
MOVC A,@A+DPTR
MOV P2,#0EFH ;将位选码送P2
MOV P0,A
LCALL DELAY2ms
MOV A,47H
MOVC A,@A+DPTR
MOV P2,#0DFH ;将位选码送P2
MOV P0,A
LCALL DELAY2ms
LJMP DISPLY
INT_B:PUSH PSW ;中断程序
PUSH ACC ;入栈保护现场
MOV TH0,#3CH ;对计数器重新赋值
MOV TL0,#0B0H
DJNZ SECSIG,TT ;判断 1秒时间到否,不到转向TT
MOV SECSIG,#2 ;一秒到时对标志位重新赋值
MOV A,CLKSEC ;对秒数据进行加一处理
ADD A,#1
CJNE A,#60,TT
MOV A,#0
MOV CLKSEC,A
MOV A,CLKMIN ;对分钟数据进行加一处理
ADD A,#1
CJNE A,#60,TT
MOV A,#0
MOV CLKMIN,A
MOV A,CLKHOR ;对小时数据进行加以处理
ADD A,#1
CJNE A,#24,TT
MOV A,#0
MOV CLKHOR,A
TT:POP ACC ;TT为恢复现场中断返回
POP PSW
RETI
DELAY2ms:MOV 40H,#4 ;2MS延时程序
D1:MOV 41H,#248
DJNZ 41H,$
DJNZ 40H,D1
RET
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;显示数码表0~9
END
|