3 位数码管,1秒内亮灭各一次。这个例子可以作为时钟设定,调整位闪烁用。

;11.03.28 12M晶振,共阴数数码管。P0段选,P2.0~P2.2位选
;按开始键,共阴数码管显示 123 ,1S内亮、灭一次.按停止键,数码管灭。再按开始键,又开始123秒闪。周而复始。
;E:\DPJ\123交替1S \123.ASM
STRT BIT P2.6
STP BIT P2.7
ORG 00H
AJMP MAIN
ORG 0BH
AJMP T0INT
ORG 30H
MAIN:
MOV SP,#60H
MOV TMOD,#01H
MOV TH0,#3CH ;50MS定时器T0中断一次
MOV TL0,#0B0H
SETB EA
SETB ET0
MOV R0,#10 ;10次为0.5S
MOV R1,#2
MAIN1:
ACALL KEY
AJMP MAIN1
DISP:
JNB F0,DISP01
MOV P0,#06H ;"1"的段码
AJMP DISP02
DISP01:
MOV P0,#00H
DISP02:
CLR P2.0
ACALL D1MS
SETB P2.0
JNB F0,DISP11
MOV P0,#5BH
AJMP DISP12
DISP11:
MOV P0,#00H
DISP12:
CLR P2.1
ACALL D1MS
SETB P2.1
JNB F0,DISP21
MOV P0,#4FH
AJMP DISP22
DISP21:
MOV P0,#00H
DISP22:
CLR P2.2
ACALL D1MS
SETB P2.2
DJNZ R2,DISP
MOV R2,#2 ;显示2次,加长DISP时间 ,用来防抖
RET
KEY:
ACALL DISP
JB STRT,KT
ACALL DISP
JNB STRT,$-2
AJMP START
KT:
ACALL DISP
JB STP,KEY
ACALL DISP
JNB STP,$-2
AJMP STOP
START:
SETB TR0
SETB F0
RET
STOP:
MOV R0,#10 ;如果这里R0不重新送#10,因为按停按钮时,R0为当时值(可能小于10),这就可能造成重新按开始键 时,
;R0很快就减到0 ,而使数码管亮j的时间小于0.5S再灭 。
CLR TR0
CLR F0
RET
D1MS:
MOV R7,#50
MOV R6,#10
DJNZ R6,$
DJNZ R7,$-4
RET
T0INT:
MOV TH0,#3CH
MOV TL0,#0B0H
DJNZ R0,RTI
MOV R0,#10
CPL F0 ;F0作0.5S的标志,每0.5秒求反一次, 数码管"123"秒闪。
DJNZ R0,RTI ;1S
MOV R0,#10
RTI:
RETI
END