小白求助!请看程序,按下k1后能运行,但不能停止,请问要如果改,谢谢高手!
#include <REG51.h> //通用89C51头文件
sbit LED1 = P1^0; //定义闪烁LED
sbit LED2 = P1^1; //定义闪烁LED
sbit LED3 = P1^2; //定义闪烁LED
sbit LED4 = P1^3; //定义闪烁LED
sbit K1 = P3^2;
/*********************************************************************************************
函数名:毫秒级CPU延时函数
调 用:DELAY_MS (?);
参 数:1~65535(参数不可为0)
返回值:无
结 果:占用CPU方式延时与参数数值相同的毫秒时间
备 注:应用于1T单片机时i<600,应用于12T单片机时i<125
/*********************************************************************************************/
void DELAY_MS (unsigned int a){
unsigned int i;
while( --a != 0){
for(i = 0; i < 600; i++);
}
}
/*********************************************************************************************/
/*********************************************************************************************/
void main (void){ //主程序
if(K1==0)//假设按键低电平有效
{DELAY_MS(5);
if(K1==0);
while(1)
{
LED1=1;
LED3=1;
DELAY_MS(10);
LED1=0;
LED3=0;
DELAY_MS(20);
LED1=1;
LED3=1;
DELAY_MS(10);
LED1=0;
LED3=0;
DELAY_MS(20);
LED1=1;
LED3=1;
DELAY_MS(10);
LED1=0;
LED3=0;
DELAY_MS(20);
LED1=1;
LED3=1;
DELAY_MS(10);
LED1=0;
LED3=0;
DELAY_MS(100);
}
}
1、创建项目文件。
2、按键:S1=P3^2,点亮: led=P1^5。
3、创建C语言主函数。
4、创建循环效果,检测效果。while(1) {}。
5、选择输出的效果。
6、当按下一个按键时,关闭灯,整个程序运行,再按一次,程序停止。
这句if(K1==0) key=lignt; 报LED.C(53): 错误 C202: 'lignt': undefined identifier。谢谢!
追答哦,抱歉,拼写错误,是 light 把 “n” 改成 “h” 就可以了
追问程序只运行一遍,运行到 LED1=0;
LED3=0;
停止,按键也没反应了。求解,谢谢!
你是说,上电开始,按按键,灯闪烁,然后松开按键,灯灭;然后再按按键就没有任何反应了吗?
追问你·写的程序是上电开始,按键,灯闪,运行程序一遍,停止不再运行,按键没反应。我要的是上电开始,按键一次循环运行程序,松开按键继续运行,直到再按键一次暂停程序。再按键一次循环运行程序,松开按键继续运行,直到再按键一次暂停程序。谢谢!
追答会出现按键没反应情况,可能是按键读取出现错误。
我的程序中,按键部份处理确实比较简单,如果有硬件干扰可能会造成按键出错。
而单看程序,逻辑应该是没问题的。 而且我用Keil Debug了一次,没发现逻辑问题。
PS:若按你的要求:按一次按键,灯闪;再按一次按键,灯灭。 上述程序只需修改以下地方:
1、#define black 2 修改为 #define black 0
2、unsigned char key; 修改为 bit key;
3、if(K1==0) key=light; 修改为 if(K1==0) key=~key;
这样程序只运行一遍,不循环的。谢谢!
追答恩,是的,按一下运行一边。然后停止。
追问我需要的是按k二次,一次运行一次暂停·,如此循环!
请问应该如何实现?谢谢!
追答你说的是 暂停后继续接着运行的话 那我的方法不行
我的只能是 重新运行 你说的还没想到
能否将k作为大循环,运行程序作为大循环内的小循环?这样能否实现?
追答我已经说了 那样的话除非 程序单循环周期比较短至少在0.5s以内 才可以那么做 否则 按键会很迟钝 实时性很差。。就你这段程序延时来说 还勉强可以 。。。
我程序只有一段,开关也只有一个,这个应该怎样写?谢谢!
追答if(key==0)
{
LED1=1;
LED3=1;
DELAY_MS(10);
LED1=0;
LED3=0;
DELAY_MS(20);
LED1=1;
LED3=1;
DELAY_MS(10);
LED1=0;
LED3=0;
DELAY_MS(20);
LED1=1;
LED3=1;
DELAY_MS(10);
LED1=0;
LED3=0;
DELAY_MS(20);
LED1=1;
LED3=1;
DELAY_MS(10);
LED1=0;
LED3=0;
DELAY_MS(100);}
这样是k按下程序就运行。我要的是k按下运行放开继续运行,k再按下程序停止,如此循环。
追答k再按下程序停止,是说永远停止吗?
追问暂停也可以!按k2次,按一次循环运行程序直到再按一次暂停程序。再按一次循环运行程序直到再按一次暂停程序。