前面发的程序,有点小瑕疵,是因为相同程序结构复制粘贴的原因,修改后重发,并回答你的问题。
第一:修改小瑕疵后的程序:
#include<reg51.h>
#include<intrins.h>
#define GPIO_LED P2
sbit k1=P3^2;
sbit k2=P3^3;
sbit k3=P3^4;
sbit k4=P3^5;
void Delay10ms(unsigned int c);
void main(void)
{
unsigned int i,n;
while(1)
{
if(k1==0)
{
Delay10ms(1);
if(k1==0)
{
n=1;
GPIO_LED=0xfe;
while((i<50)&&(k1==0))
{
Delay10ms(1);
i++;
}
i=0;
}
}
if(k2==0)
{
Delay10ms(1);
if(k2==0)
{
n=2;
GPIO_LED=0xff;
while((i<50)&&(k2==0))
{
Delay10ms(1);
i++;
}
i=0;
}
}
if(k3==0)
{
Delay10ms(1);
if(k3==0)
{
n=3;
GPIO_LED=0x7f;
while((i<50)&&(k3==0))
{
Delay10ms(1);
i++;
}
i=0;
}
}
if(k4==0)
{
Delay10ms(1);
if(k4==0)
{
n=4;
GPIO_LED=0xff;
while((i<50)&&(k4==0))
{
Delay10ms(1);
i++;
}
i=0;
}
}
if (n==1)
{
GPIO_LED=_crol_(GPIO_LED,1);
Delay10ms(50);
}
if (n==3)
{
GPIO_LED=_cror_(GPIO_LED,1);
Delay10ms(50);
}
}
}
void Delay10ms(unsigned int c)
{
unsigned char a,b;
for(c;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
第二:关于你的问题:
(1)为什么if (k1==0)延时后,还要有if (k1==0)
这是为了按键消抖,按下一个键,可不是你眼睛看到的一开一关,会有很多次的开关,叫抖动,所以要延时一会,让开关接触稳定后,再判断,这里消抖,叫按下消抖。
(2)while也是为了消除抖动,这次上松键抖动。至于50,这个值可以大点,也可以小点,只是为了让按键松开后稳定,另一个原因是不让这种情况出现——你按着键就是不松开,那样程序就死在这里了,有了50次的限制,程序可以跳出来,不会“死”。
(3)我的单片机开发板上,LED都是负极接在单片机IO口上的,即高电平灯灭,低电平灯亮(我看到的绝大多数板子都是这样接的,原因可能是——单片机低电平时能通过的电流大一些吧)。所以,0xfe,就是11111110,最低位灯亮,以后的移动,就向高位移动。后面设置0x7f,就是01111111,最高位灯亮,以后就向低位移动。你只说灯的循环亮,没有说同时有几个灯亮,我就设置的一个灯亮循环。
从你提的问题上看,你需要学习的东西还有很多,不仅仅是这个程序问题。呵呵,这次有我给你做作业,下次呢?我现在知道了,为什么那些高手不给你写程序,因为那样是在害你,让你不学习——考个大学,特别是搞自动化专业的,好好珍惜吧!我害你一次了,呵呵,下次不再害你了。 |