ORG 0000H ;下一条指令的代码的偏移地址为0000H
LJMP MAIN
ORG 0003H
LJMP RINT0 ;外部中断0
ORG 0013H
LJMP RINT1 ;外部中断1
ORG 0030H
MAIN: MOV SP,#30H ;栈顶地址为30H
MOV IE,#85H ;中断允许标志位
MOV IP,#04H ;中断优先级标志位
MOV TCON,#01H ;定时器控制寄存器,外部中断0为下降沿触发,外部中断1为低电平触发
MOV A,#00H
LP1: MOV P1,A
LCALL DELAY ;延迟
CPL A ;取反(全灭)
SJMP LP1
ORG 0100H
RINT0:PUSH ACC ;外部中断0中断服务程序
PUSH PSW
SETB RS0 ;工作寄存器为08H~0FH
MOV A,#0FEH ;1、3、5、7
MOV P1,A ;点亮灯1
LCALL DELAY
MOV A,#0FAH
MOV P1,A ;点亮灯1、3
LCALL DELAY
MOV A,#0EAH
MOV P1,A ;点亮灯1、3、5
LCALL DELAY
MOV A,#0AAH
MOV P1,A ;点亮灯1、3、5、7
LCALL DELAY
POP PSW
POP ACC
RETI
ORG 0200H ;
RINT1:PUSH ACC ;外部中断1中断服务程序
PUSH PSW
MOV A,#0FDH
MOV P1,A ;点亮灯2
LCALL DELAY
MOV A,#0F5H
MOV P1,A ;点亮灯2、4
LCALL DELAY
MOV A,#0D5H
MOV P1,A ;点亮灯2、4、6
LCALL DELAY
MOV A,#55H
MOV P1,A ;点亮灯2、4、6、8
LCALL DELAY
POP PSW
POP ACC
RETI
ORG 0300H
DELAY:MOV R4,#10 ;2延时子程序
DEL3: MOV R2,#50 ;10*2
DEL2: MOV R3,#248 ;10*50*2
NOP ;10*50*248*1
DEL1: DJNZ R3,DEL1 ;10*50*248*2
DJNZ R2,DEL2 ;10*50*2
DJNZ R4,DEL3 ;10*2
RET ;2
;总延时时间是注释数据之和(单位为微秒,以12M晶振为例)
END
4 ORG 0000H
LJMP MAIN
ORG 0030H
LP1: MOV R1,#10H
MOV TMOD,#00H ;定时器0为工作方式0
MOV TH1,#0E0H ;定时初值,1000溢出
MOV TL1,#18H
SETB TR1 ;定时器1开始工作
LP2: JBC TF1,LP3 ;查询计数输出
SJMP LP2
LP3: MOV TH1,#0E0H ;计数满1000重新赋初值
MOV TL1,#18H
DJNZ R1,LP2 ;判断是否计数满10*1000
RET
MAIN: MOV p2,#90H ;P2=90H(数码管显示9)
LCALL LP1 ;延时16ms(12M晶振)
MOV A,#00H
MOV P2,A ;P2=00H(数码管显示8加小数点)
LCALL LP1
MOV A,#0F8H
MOV P2,A ;P2=F8H(数码管显示7)
LCALL LP1
MOV A,#082H
MOV P2,A ;P2=82H(数码管显示6)
LCALL LP1
MOV A,#092H
MOV P2,A ;P2=92H(数码管显示5)
LCALL LP1
MOV A,#099H
MOV P2,A ;P2=99H(数码管显示4)
LCALL LP1
MOV A,#0B0H
MOV P2,A ;P2=B0H(数码管显示3)
LCALL LP1
MOV A,#0A4H
MOV P2,A ;P2=A0H(数码管显示2)
LCALL LP1
MOV A,#0F9H
MOV P2,A ;P2=F9H(数码管显示1)
LCALL LP1
MOV A,#0C0H
MOV P2,A ;P2=C0H(数码管显示0)
LCALL LP1
SJMP MAIN
END