#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;
}
}
}
}
你的流水灯写在了循环之中了,即当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;
}
}
}
}
好久不玩儿单片机了,也没法下载演示,你看看这个主函数行不行
大概思路是这样的,流水灯跟按键程序分离
加个位变量k做标志位
按下按键位变量k取反一次
流水灯程序只有在这个变量k等于1时才运行。