前面發的程序,有點小瑕疵,是因為相同程序結構復制粘貼的原因,修改后重發,并回答你的問題。
第一:修改小瑕疵后的程序:
#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,最高位燈亮,以后就向低位移動。你只說燈的循環亮,沒有說同時有幾個燈亮,我就設置的一個燈亮循環。
從你提的問題上看,你需要學習的東西還有很多,不僅僅是這個程序問題。呵呵,這次有我給你做作業,下次呢?我現在知道了,為什么那些高手不給你寫程序,因為那樣是在害你,讓你不學習——考個大學,特別是搞自動化專業的,好好珍惜吧!我害你一次了,呵呵,下次不再害你了。 |