LJMP MAIN ;设置主程序入口
ORG 0003H
LJMP INTSEV ;设置外部中断入口
ORG 0030H ;设置主程序的实际开始地址
MAIN: SETB IT0 ;设置外部中断0为边沿触发方式
SETB EX0 ;允许外部中断0中断
SETB EA ;开中断总开关,中断开放
MOV A,#0FEH ;设LED初值,最低位亮,“0”亮
LOOP: MOV P1,A ;输出,点亮LED
MOV 30H,#10 ;设置延时时间,0.5秒
LCALL DELAY ;延时
RL A ;左移一位,为下一位点亮做准备
SJMP LOOP ;循环
;--------中断服务子程序----------------------------
INTSEV: CLR EA ;关中断
PUSH ACC ;保护现场
MOV 30H,#1 ;设置消抖动时间
LCALL DELAY ;延时50ms
JB P3.2,INTRET ;若主持人键没按下,认为是一次干扰,中断返回
JNB P3.2,$ ;按下,等待释放
MOV P2,#0BFH ;主持人键已按下,显示“-”
AAA: MOV A,P0 ;读P0口的内容
JNB ACC.0,LP1 ;若S1开关按下,转LP1
JNB ACC.1,LP2 ;若S2开关按下,转LP2
JNB ACC.2,LP3 ;若S3开关按下,转LP3
JNB ACC.3,LP4 ;若S4开关按下,转LP4
SJMP AAA ;返回,继续等待抢答
LP1: MOV P2,#0F9H ;显示“1”
SJMP LP_COM
LP2: MOV P2,#0A4H ;显示“2”
SJMP LP_COM
LP3: MOV P2,#0B0H ;显示“3”
SJMP LP_COM
LP4: MOV P2,#99H ;显示“4”
LP_COM: CLR P3.4 ;开蜂鸣器
MOV 30H,#20 ;设置蜂鸣器鸣响时间
LCALL DELAY ;延时1秒
SETB P3.4 ;关蜂鸣器
MOV 30H,#60H ;设置结果显示时间
LCALL DELAY ;延时
MOV P2,#0FFH ;数码管全黑
INTRET: SETB EA ;开中断
POP ACC ;恢复现场
RETI ;中断返回
;-----------延时子程序---------------------
DELAY: MOV R4,30H
DEL0: MOV R5,#50
DEL1: MOV R6,#250
DEL2: NOP
NOP
DJNZ R6,DEL2
DJNZ R5,DEL1
DJNZ R4,DEL0
RET
END下载本文