同样的两个程序,实现的功能却不同,所以请教大家。2个程序哪里有什么区别,请指教,困扰了我3天了,没有想明白。怎样才能使key3.c也能实现key1.c正常的功能
关于4个独立按键的小程序, 实现功能如下:
* 实验名 : 独立按键实验
* 使用的IO : LED使用P2,键盘使用P3.0、P3.1、P3.2、P3.3
* 实验效果 : 按下K1键,灭掉LED,按下K2键,打开所有的LED,按下K3键,LED左移一位,按下K4键,LED右移一位。
key3.c
#include<reg51.h>
#include<intrins.h>
sbit K1=P3^0;
sbit K2=P3^1;
sbit K3=P3^2;
sbit K4=P3^3;
void Delay10ms(void) //误差 0us 延时10ms
{
unsigned char a,b;
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void main(void)
{
char i;
P2=0;
while(1)
{
if(K1==0) //检测按键K1是否按下
{
Delay10ms(); //消除抖动
if(K1==0) //再次检测按键是否按下
P2=0;
}
if(K2==0) //检测按键K2是否按下
{
Delay10ms();
if(K2==0)
P2=0xff;
}
if(K3==0) //检测按键K3是否按下
{
Delay10ms();
if(K3==0)
{
if((P2==0)||(P2==0xff)) //如果当前状态是全亮的或者全灭的,就点亮他的第一盏灯
P2=0xfe;
else
P2=_crol_(P2,1); //左移一位
}
while((i<50)&&(K3==0))
{
Delay10ms();
i++;
}
i=0;
}
if(K4==0) //检测按键K4是否按下
{
Delay10ms();
if(K4==0)
{
if((P2==0)||(P2==0xff))
{
P2=0xfe;
}
else
P2=_cror_(P2,1); //右移一位
}
while((i<50)&&(K4==0))
{
Delay10ms();
i++;
}
i=0;
}
}
}
key1.c
#include<reg51.h>
#include<intrins.h>
sbit k1=P3^0;
sbit k2=P3^1;
sbit k3=P3^2;
sbit k4=P3^3;
void delay10ms()
{
char a,b;
for(a=38;a>0;a--)
for(b=130;b>0;b--);
}
void main()
{ char i=0;
while(1)
{
if(k1==0)
{
delay10ms();
if(k1==0)
P2=0xff;
}
if(k2==0)
{
delay10ms();
if(k2==0)
P2=0;
}
if(k3==0)
{
delay10ms();
if(k3==0)
{
if((P2==0)||(P2==0xff))
P2=0xfe;
else
P2=_crol_(P2,1);
while((i<50)&&(k3==0))
{
delay10ms();
i++;
}
i=0;
}
}
if(k4==0)
{
delay10ms();
if(k4==0)
{
if((P2==0)||(P2==0xff))
P2=0xfe;
else
P2=_cror_(P2,1);
}
while((i<50)&&(k4==0))
{
delay10ms();
i++;
}
i=0;
}
}
}
key3.c 能够实现正常的功能:按下K1键,灭掉LED,按下K2键,打开所有的LED,按下K3键,LED左移一位,如果按住K3,LED每隔500ms左移一位。按下K4键,LED右移一位。如果按住K4,LED每隔500ms右移一位。
key1.c 却不能实现正常的功能:按下K1键,灭掉LED,按下K2键,打开所有的LED正常。但是当按下K3键,LED不断地连续左移,如果按住K3,LED每隔10ms快速连续地左移。按下K4键,LED不断地连续右移。如果按住K4,LED每隔10ms快速连续地右移。
同样的两个程序,实现的功能却不同,所以请教大家。2个程序哪里有什么区别,请指教,困扰了我3天了,没有想明白。怎样才能使key3.c也能实现key1.c正常的功能?