在做单片机按键控制流水灯,我想达到按一下自己循环,再按一下就停止的那种,怎么删改程序啊?

在做单片机按键控制流水灯,但是我做出来后是一直按才能循环,松开就不运行,我想达到按一下自己循环,再按一下就停止的那种,怎么用单片机C语言删改程序啊?
#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char
sbit K1 = P3^2; //独立按键
void Delayms(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=100;j>0;j--);
}
void main()
{
uchar x;
uint i;
uchar temp;
while(K1==0)
{
temp=0x01;
for(i=0;i<8;i++)
{
P0=~temp;
Delayms(100);
temp<<=1;
}
}
}

#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char
sbit  K1    = P3^2;          //独立按键
void Delayms(uint x)
{                        
        uint i,j;
        for(i=x;i>0;i--)
        for(j=100;j>0;j--);
}
void main()
{  
        uchar x;
        uint i;

        uchar temp;

        uint s=1;                  //新增一个值来记录按键值 ,初始化为1 

        while(1)                    //大的死循环一直扫描按键变化
        {

                if(K1==0) 

                {

                        Delayms(10);             //按键去抖动

                        if(K1==0)     s=0;        //按键按下此时是键值s=0

                }


                while(s==0)                        //当按键第一次按下时进入循环点亮灯的循环

                {
                         temp=0x01;    
                         for(i=0;i<8;i++)
                          {
                                      P0=~temp;
                                      Delayms(100);
                                      temp<<=1;

                                      // if(K1==0)   break;           //增强反应速度,有按键按下立马跳出         

                         }             

                        if(K1==0)                                     //当再次按下使键值s=1,将不符合点亮的死                                      {                                                  //循环,进入判断按键的死循环

                                      Delayms(10);

                                      if(K1==0)     s=1;

                        }

                }
        }
}


追问

一直循环,停不下来……

追答

// if(K1==0) break; //增强反应速度,有按键按下立马跳出
把上面这句前面的注释删掉,可怎强反应速度。
出现在循环里跳不出来,是因为在你按按键的时候,程序还在流水灯的延迟中,单片识别反应慢,不信你一直按着很久不动他肯定能跳出来的。不加上面这句是每8xDelayms(100)时间检测一次按键,加上上面这句是每Delayms(100)检测一次。
这种按键检测缺点就是反应慢,用中断的话就爽多了!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-07-09
你的流水灯写在了循环之中了,即当K1==0成立时,才进入while循环,然后才执行。你可以这样写:

void main()
{

uchar x;
uint i,flag;/////加一个flag变量
uchar temp;

temp=0x01;
while(1)

{
if(K1==0)////////判断K1是否按下
{
Delayms(5); //////// 延时去抖
if(K1==0) /////如果K1确实按下
{
while(K1==0);//////////等待K1弹起
flag++;/////////将flag加一计数
}

}

if(flag/2==0)////////按下偶数次则执行流水灯
{

for(i=0;i<8;i++)
{
P0=~temp;
Delayms(100);
temp<<=1;
}

}
}

}
好久不玩儿单片机了,也没法下载演示,你看看这个主函数行不行追问

不行,只能在电源接通后再按复位键走一次,然后就全息,什么按键也不好使,怎么都不亮

追答

我的错把flag除以2改成对2取余,flag%2==0

本回答被网友采纳
第2个回答  2014-07-09
大概思路是这样的,流水灯跟按键程序分离
加个位变量k做标志位
按下按键位变量k取反一次
流水灯程序只有在这个变量k等于1时才运行。
相似回答