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

在做单片机按键控制流水灯,但是我做出来后是一直按才能循环,松开就不运行,我想达到按一下自己循环,再按一下就停止的那种,怎么用单片机C语言删改程序啊?#include"re... 在做单片机按键控制流水灯,但是我做出来后是一直按才能循环,松开就不运行,我想达到按一下自己循环,再按一下就停止的那种,怎么用单片机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;
}
}
}
展开
 我来答
狐幻限家而1a
推荐于2017-10-11 · 超过10用户采纳过TA的回答
知道答主
回答量:25
采纳率:0%
帮助的人:24.5万
展开全部

#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)检测一次。
这种按键检测缺点就是反应慢,用中断的话就爽多了!
宿兴电子
2024-11-28 广告
联系我们一、有无震荡源 无源这里的“源”不是指电源,而是指震荡源。也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫。而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。 二、价格不同 有源蜂鸣器往比无源蜂鸣器贵,就是因为里面多个震荡... 点击进入详情页
本回答由宿兴电子提供
飞龙04413
2014-07-09 · 超过12用户采纳过TA的回答
知道答主
回答量:25
采纳率:0%
帮助的人:20.6万
展开全部
你的流水灯写在了循环之中了,即当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
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jmhyys
2014-07-09 · TA获得超过524个赞
知道小有建树答主
回答量:1052
采纳率:62%
帮助的人:289万
展开全部
大概思路是这样的,流水灯跟按键程序分离
加个位变量k做标志位
按下按键位变量k取反一次
流水灯程序只有在这个变量k等于1时才运行。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式