;***************************************************************** ;开关SP1接在P1.0管脚上,在AT89C51单片机的P0端口接有四个发光二极管,上电的时候, ;L1接在P0.0管脚上的发光二极管在闪烁,当每一次按下开关SP1的时候,L2接在P0.1管脚上的发光二极管在闪烁, ;再按下开关SP1的时候,L3接在P0.2管脚上的发光二极管在闪烁,再按下开关SP1的时候, ;L4接在P0.3管脚上的发光二极管在闪烁,再按下开关SP1的时候,又轮到L1在闪烁了,如此轮流下去 ;*************************************************************************************** ORG 0000H AJMP MAIN MAIN: MOV R0,#0
ST1: MOV P0,#0FEH; 灯L1闪烁 LCALL DE1; 调用延时子程序 MOV P0,#0FFH; LCALL DE1; 调用延时子程序 LCALL CHECK; 调用按键扫描程序
ST2:MOV P0,#0FDH; 灯L2闪烁 LCALL DE1; MOV P0,#0FFH; LCALL DE1; LCALL CHECK
ST3:MOV P0,#0FBH; 灯L3闪烁 LCALL DE1; MOV P0,#0FFH; LCALL DE1; LCALL CHECK
ST4:MOV P0,#0F7H; 灯L4闪烁 LCALL DE1; MOV P0,#0FFH; LCALL DE1; LCALL CHECK CHECK: ;******************************* ;判断按键有没有按下及按了几次,即按键的识别 ;******************************** CHECK1:JB P1.0,L1; 按下键了吗? LCALL DE2; JB P1.0,CHECK1; 真的按下了吗? CHECK2:JNB P1.0,CHECK2; 等待释放,释放了吗? LCALL DE2; JNB P1.0,CHECK2; 真的释放了吗? ;********************************* INC R0; R0的值加1 L1:CJNE R0,#1,L2; R0的值为1吗?不为1,继续判断 AJMP ST2; 为1,灯L2开始闪烁 L2:CJNE R0,#2,L3; R0的值为2吗?不为2,继续判断 AJMP ST3; 为2,灯L3开始闪烁 L3:CJNE R0,#3,L4; R0的值为1吗?不为1,继续判段 AJMP ST4; 为3,灯L4开始闪烁 L4:CJNE R0,#4,ST1; R0的值为1吗?不为1,继续判断 LJMP MAIN ; 为4,返回主程序, DE1: MOV R5,#20 LOOP2: LCALL DE2; 调用延时10ms子程序 DJNZ R5,LOOP2 RET
DE2: MOV R6,#20 ;延时10ms子程序 L5: MOV R7,#248 DJNZ R7,$ DJNZ R6,L5 RET END
程序在板子上调试的时候,发现按键按快了似乎来不及识别啊,要按下去一会会儿再松开才行,不过按了十几次之后发现灯L1变成常亮的了,不再闪烁,这时候随便怎么按也没有反应了,不知道怎么回事,希望各位帮忙指导指导,感激…… |