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

2024-11-02 12:29:42
推荐回答(3个)
回答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;

                        }

                }
        }
}


回答2:

你的流水灯写在了循环之中了,即当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;
}

}
}

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

回答3:

大概思路是这样的,流水灯跟按键程序分离
加个位变量k做标志位
按下按键位变量k取反一次
流水灯程序只有在这个变量k等于1时才运行。