ORG 00H ; 起始标号
START:
MOV P0,#00H ; 显示00
JB P1.0, $ ; 检测P1.0开关是否按下,当按钮按下则继续(低电平是按下)
CALL FILTER ; 消除开关的抖动
JNB P1.0, $ ; 判断, 有没有放开按钮(高电平是放开)
MOV R0,#00H ; 设置计时初始值
PRESS_1:
MOV A,R0 ; 将初始值载入ACC
MOV P0,A ; 输出至P0口
MOV R5,#10 ; 延时1秒
ADD_1: ; 加法程序
MOV R6,#200 ; 延时用寄存器
CALL DELAY ; 调用延时子程序
DJNZ R5,PRESS_1 ; 将R5的值减1,不小于零就回PRESS继续执行
MOV A,R0 ; 将初始值载入ACC
ADD A,#01H ; 计时值加1
DA A ; 十进制调整
MOV R0, A ; 返回计时用寄存器
JMP PRESS_1 ; 重复计时动作
PRESS_2: ; 第二次按按钮
CALL FILTER ; 消除开关的抖动
JB P1.0, PRESS_3 ; 如果放开按钮,则跳至PRESS_3
JMP PRESS_2 ; 不是放开按钮,则重复PRESS_2
PRESS_3: ; 第三次按按钮
JB P1.0,$ ; 当按下则继续,低电平有效
CALL FILTER ; 消除开关的抖动
PRESS_4:
JB P1.0, START ; 放开按钮则跳至START清零,由低电平变高电平有效
JMP PRESS_4 ; 否则重复PRESS_4
DELAY: ; 延时子程序
MOV R7,#248 ; 将立即数248载入R7寄存器,则R7的值为248
JNB P1.0, PRESS_2 ; 判断, 有没有放开按钮(高电平是放开)放开则跳至PRESS_2执行
DJNZ R7, $ ; 将R7的值减1,不小于0就重复执行该程序,否则执行下一程序
DJNZ R6, DELAY ; 将R6的值减1,不小于0就跳至DELAY处执行,否则执行下一程序
RET ; 子程序执行完毕后返回主程序
FILTER:
MOV R6,#60 ; 消除抖动,30ms延时子程序
D1:
MOV R7,#248 ; 使R7等于248
DJNZ R7,$ ; 将R7的值减1,不小于0就重复执行该程序,否则执行下一程序
DJNZ R6,D1 ; 将R6的值减1,不小于0就跳至D1处执行,否则执行下一程序
RET ; 子程序执行完毕后返回主程序
END ; 程序结束