ORG 0000H
AJMP START
ORG 0013H
AJMP INTERRUPT1 ;外部中断1中断服务跳转
ORG 000BH
AJMP TIME0INTER ;定时器0中断服务跳转
ORG 001BH
AJMP TIME1INTER ;定时器1中断服务跳转
ORG 0100H
START:
STCP BIT P0.3 ;高电平将8位数据从移位寄存器发到存储寄存器
SHCP BIT P0.4 ;高电平时移位寄存器里的数据整体后移,并将一位数据送入移位寄存器
SER BIT P0.5 ;串行数据输入
MOV R1,#00H ;计数595的8位计数
MOV R2,#0 ;数码管的N位数循环
MOV R3,#00H ;计数停止标志
CLR A
MOV A,#0AH
MOV 48H,A ;48位置存了9
MOV A,R1
MOV TMOD,#11H ;设置T0的模式为方式1,16位定时器,仅由TRO触发
MOV TH0,#0FCH ;初值装载
MOV TL0,#018H
MOV TH1,#0FCH ;初值装载
MOV TL1,#018H
SETB IT1 ;设置外部中断1下降沿触发
SETB PX1 ;设置外部中断1为最高优先
SETB EX1 ;开外部中断1允许位
SETB ET0 ;时钟0溢出中断允许
SETB ET1 ;时钟1溢出中断允许
SETB EA ;开总中断
SETB TR1 ;打开时钟1定时器
MAIN:
SJMP MAIN
TIME1INTER: ;每一毫秒进入一次完成数码管显示
PUSH ACC ;保护现场
PUSH PSW
MOV TH0,#0FCH ;初值装载
MOV TL0,#018H
;两个循环输出秒和毫秒,在最下面有示例
MOV R1,#00H ;计数595的8位计数
MOV R2,#0 ;TAB的N位数循环
; MOV P0,#07H
MOV A,#0
MOV R0,#40H;存储秒数地址
SEG3: ;用于显示8位数码管
MOV A,@ R0
INC R0
MOV DPTR,#TAB
MOVC A,@ A+DPTR ;获得TAB表数据
CJNE R2,#3,LOOP ;第四位加上小数点
ANL A,#7FH
LOOP:
SEG3_1: ;SEG3_1
RLC A
MOV SER,C
SETB SHCP;存一位
NOP
NOP
CLR SHCP
INC R1
CJNE R1,#08H,SEG3_1;八位存储的循环 ;SEG3_1
MOV R1,#00H
SETB STCP ;存够8位输出
NOP
NOP
CLR STCP
INC R2
MOV A,R2
CALL DELAY1MS
DEC P0
CJNE A,#8,SEG3 ;SEG3
MOV P0,#07H
SEG5: ;输出最后的关灯
MOV A,@ R0 ;R0=48,A=10
INC R0
MOV DPTR,#TAB
MOVC A,@ A+DPTR ;获得TAB表第九位数据,关灯
SEG5_1: ;LOOP1
RLC A
MOV SER,C
SETB SHCP;存一位
NOP
NOP
CLR SHCP
INC R1
CJNE R1,#08H,SEG5_1;八位存储的循环 ;LOOP1
MOV R1,#00H
SETB STCP ;存够8位输出
NOP
NOP
CLR STCP
CALL DELAY1MS
POP PSW
POP ACC
RETI
INTERRUPT1: ;外部中断1服务函数
PUSH ACC ;保护现场
PUSH PSW
MOV A,R3 ;R3=0为开启定时器0
JNZ COUNTSTOP ;A不为0跳转计数停止子程序(COUNTSTOP),说明上一次触发中断是启动定时器,
SETB TR0 ;打开时钟0定时器
INC R3 ;R3为0则为未计时,将R3 INC为1,
POP PSW ;现场恢复
POP ACC
RETI ;退出
COUNTSTOP:
DEC R3 ;计数停止位归零
CLR TR0 ;关闭定时器
POP PSW
POP ACC
RETI
TIME0INTER: ;每一毫秒进入一次,处理毫秒和秒
PUSH ACC ;保护现场
PUSH PSW
MOV TH0,#0FCH ;初值装载
MOV TL0,#018H
; MOV R0,40H
MOV A,40H ;毫秒1位
INC A
MOV 40H,A
CJNE A,#10,RETURN
MOV 40H,#0
; INC R0
MOV A,41H ;毫秒2位
INC A ;加一
MOV 41H,A
CJNE A,#10,RETURN
MOV 41H,#0 ;上一位清零
; INC R0
MOV A,42H ;毫秒3位
INC A
MOV 42H,A
CJNE A,#10,RETURN
MOV 42H,#0
; INC R0
MOV A,43H ;秒1位
INC A
MOV 43H,A
CJNE A,#10,RETURN
MOV 43H,#0
; INC R0
MOV A,44H ;秒2位
INC A
MOV 44H,A
CJNE A,#10,RETURN
MOV 44H,#0
; INC R0
MOV A,45H ;秒3位
INC A
MOV 45H,A
CJNE A,#10,RETURN
MOV 45H,#0
MOV A,46H ;秒4位
INC A
MOV 46H,A
CJNE A,#10,RETURN
MOV 46H,#0
MOV A,47H ;秒5位
INC A
MOV 47H,A
CJNE A,#10,RETURN
MOV 47H,#0
RETURN:
POP PSW
POP ACC
RETI
DELAY1MS: ;@12.000MHz
NOP
PUSH 30H
PUSH 31H
MOV 30H,#10
MOV 31H,#81
NEXT1:
DJNZ 31H,NEXT1
DJNZ 30H,NEXT1
POP 31H
POP 30H
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H,0FFH ;段码表
END
仿真如下:按下按键开始计时,再次按下停止计时,四个灯没用测试用的。