;P0.0为键盘,P2.0为LED指示,按下LED亮,再按0.5秒,LED灭
;00h为识别LED状态的标志位,当00H为1时LED亮,当00H为0时,LED灭。初始化00H为0
LED_OFF BIT P2.0
K0 BIT P0.0
LED_STATE EQU 00H
ORG 0000H
SJMP MAIN
ORG 0030H
MAIN: CLR LED_STA TE ;清标志位
START:
JNB K0,LOOP
SJMP START ;判断K0状态,若KO不为0,则继续检测K0状态,若k0为0,则跳到loop
LOOP:
CLR LED_OFF
SETB LED_STATE ;点亮LED以及置标志位,CHECK1:
LCALL DELAY
JNB K0,CHECK1 ;若开关未弹起,则一直循环,直至开关弹起。
CHECK_LED_ON:
LCALL DELAY
JB K0,CHECK_LED_ON ;检查开关是否被按下,若未被按下则一直循环,若被按下,则判断标志位
MOV C,LED_STATE
JC CHECK_LED_OFF ;若标志位为1,则跳转到CHECK_LED_OFF
CLR LED_OFF
SETB LED_STATE ;若标志位为0,则点亮LED,同时置标志位为1
CHECK2:
LCALL DELAY
JNB K0,CHECK2 ;检查开关是否被弹起,一直循环
JMP CHECK_LED_ON ;开关弹起后,跳到CHECK_LED_ON,检查开关是否被按下
CHECK_LED_OFF:
JB K0,CHECK_LED_ON
LCALL DELAY
JB K0,CHECK_LED_ON
LCALL DELAY
JB K0,CHECK_LED_ON
LCALL DELAY
JB K0,CHECK_LED_ON
LCALL DELAY
JB K0,CHECK_LED_ON
LCALL DELAY
JB K0,CHECK_LED_ON
LCALL DELAY
JB K0,CHECK_LED_ON ;检查开关是否被按下0.5s,若中途弹起则跳转到CHECK_LED_ON。
SETB LED_OFF
CLR LED_STA TE ;若开关未弹起,则关闭LED,清标志位
CHECK_LED:
LCALL DELAY
JNB K0,CHECK_LED
JMP CHECK_LED_ON ;检查开关是否弹起,弹起后进入CHECK_LED_ON,继续判断开关是否按下
DELAY:
MOV R4,#0FFH
F2: MOV R5,#0FFH
F1: DJNZ R5,F1
DJNZ R4,F2
RET ;延时子程序
END