;*****************************************************************
;开关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变成常亮的了,不再闪烁,这时候随便怎么按也没有反应了,不知道怎么回事,希望各位帮忙指导指导,感激……
我请教过别人了,问题已经解决,程序也修改好了,不过也感谢你的帮忙。他说是按键的灵敏度太低,主要原因是程序延时时间过长。也就导致在一定时间内检测按键的次数很少,所以会出现按下按键却没有检测到的现象,只要想办法提高检测按键的频率就可以了;不过关于 “按了十几次之后发现灯L1变成常亮的了,不再闪烁”这个问题,他说是程序死机,原因是程序跑飞了,我不明白,程序为什么会跑飞,哪些情况会导致程序跑飞呢?得百度一下了,呵呵!谢谢
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |