程序原设计要求是: 2数码管显示00-99秒的,要求用P1.0做按键输入,而且要实现一键式控制:第一次按下又放开为启动,第二次按下又放开为暂停,暂时还需保持数据,第三次按下又放开为返回主程序重新开始并清除数据.然后就是再按就按上述依次循环。下面是有错误的没完善的程序:
RG 00H;
START:
MOV P0,#00H; 显示00
JB P1.0,$; 当按钮按下则继续
CALL FIR; 消除开关的抖动
JNB P1.0,$; 判断有没有放开按钮
MOV R0,#00H; 计时初始值00
PR1:
MOV A,R0; 将初始值载入ACC
MOV P0,A; 输出至P0
MOV R5, #10; 延时1秒。
AD1:
MOV R6,#200; 延时用寄存器
CALL DEY; 调用延时子程序。
DJNZ R5,PR1;
MOV A,R0;
ADD A,#01H; 计时值加1,
DA A; 十进制调整
MOV R0,A; 返回计时用寄存器
JMP PR1; 重复计时动作
PR2: ; 第二次按按钮
CALL FIR; 消除开关的抖动
JB P1.0, PR3; 如果放开按钮,则跳至PR3。
JMP PR2;
PR3:
JB P1.0,$; 第三次按按钮
CALL FIR; 消除开关的抖动
PR4:
JB P1.0,START; 放开按钮则跳至START清零。
JMP PR4;
DEY: ; 延时子程序。
MOV R7,#248;
JNB P1.0,PR2;
DJNZ R7,$;
DJNZ R6,DEY;
FIR:
MOV R6,#60; 消除抖动30ms。
D1:
MOV R7,#248;
DJNZ R7,$;
DJNZ R6,D1;
RET;
END;
求指出错误原因和提供更正可以正常运行的程序,谢谢各位高手了! |