/**** 在你的代码基础上更改 ****/
#include <reg51.h>
#include <intrins.h>
void delay(unsigned int z)
{
unsigned int a,b;
for (a=0;a<z;a++)
for (b=0;b<120;b++);
}
sbit key1=P1^0;
sbit key2=P1^1;
unsigned int i,n,k,c;
void main()
{
while ()
{
k=0xfe;
c=0xf7;
/*赋初值放前面,你的代码逻辑中并没有将其包含在if后面;
如果你想表达按键1后给k赋值请加上{};因为有两句代码
*/
if (key1==0)
i=1;
if (key2==0)
n=1;
/*i和n应该是想用标志位;一个标志位有01两种状态
两种情况用一个标志位就够了,两位可以表示四种状态*/
/*****你仔细的品******/
/*比如你的代码中就可以用while(n)和while(!n)*/
if (key==0&&i==1)
delay(10);
if (key==0&&i==1)
/*
你可以用
if(i==1)
{
P0=k;
k= _crol_(k,1)
delay(500);
n=0;
}
*/
{
P0=k;
k= _crol_(k,1)
delay(500);
n=0;
/*标志位用来保存按键状态,这样就不用一直按着
而n=0;用来清除按键二的状态后面的i=0;同理
*/
//while (!n);
//while (1)后面直接接分号,表示单片机什么也不做,原地等待
//此处你的代码中多余,你的状况是流水灯闪一遍后灯全部灭了
//你的代码本来就处于外面的while(1)的大循环中
/*你仔细品*/
if (key==0&&n==1)
delay(10);
if (key==0&&n==1)
{
P0=c;
c= _cror_(c,1)
delay(500);
i=0;
}
}
}
/*******精简版标志位法**********/
#include <reg51.h>
#include <intrins.h>
void delay(unsigned int z)
{
unsigned int a,b;
for (a=0;a<z;a++)
for (b=0;b<120;b++);
}
unsigned int i,k,c;
void main()
{
while ()
{
k=0xfe;
c=0xf7;
if (key1==0)
delay(10);
if (key1==0)
i=1;
//i 储存按键的状态 1 0 表示按键1和按键2
if (key2==0)
delay(10);
if (key2==0)
i=0;
//判断i的值等同于判断按键
if(i==0)
{
P0=k;
k= _crol_(k,1)
delay(500);
}
else
{
P0=c;
c= _cror_(c,1)
delay(500);
}
}
}
|