|
|
前面發(fā)的程序,有點(diǎn)小瑕疵,是因?yàn)橄嗤绦蚪Y(jié)構(gòu)復(fù)制粘貼的原因,修改后重發(fā),并回答你的問(wèn)題。
第一:修改小瑕疵后的程序:
#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--);
}
第二:關(guān)于你的問(wèn)題:
(1)為什么if (k1==0)延時(shí)后,還要有if (k1==0)
這是為了按鍵消抖,按下一個(gè)鍵,可不是你眼睛看到的一開(kāi)一關(guān),會(huì)有很多次的開(kāi)關(guān),叫抖動(dòng),所以要延時(shí)一會(huì),讓開(kāi)關(guān)接觸穩(wěn)定后,再判斷,這里消抖,叫按下消抖。
(2)while也是為了消除抖動(dòng),這次上松鍵抖動(dòng)。至于50,這個(gè)值可以大點(diǎn),也可以小點(diǎn),只是為了讓按鍵松開(kāi)后穩(wěn)定,另一個(gè)原因是不讓這種情況出現(xiàn)——你按著鍵就是不松開(kāi),那樣程序就死在這里了,有了50次的限制,程序可以跳出來(lái),不會(huì)“死”。
(3)我的單片機(jī)開(kāi)發(fā)板上,LED都是負(fù)極接在單片機(jī)IO口上的,即高電平燈滅,低電平燈亮(我看到的絕大多數(shù)板子都是這樣接的,原因可能是——單片機(jī)低電平時(shí)能通過(guò)的電流大一些吧)。所以,0xfe,就是11111110,最低位燈亮,以后的移動(dòng),就向高位移動(dòng)。后面設(shè)置0x7f,就是01111111,最高位燈亮,以后就向低位移動(dòng)。你只說(shuō)燈的循環(huán)亮,沒(méi)有說(shuō)同時(shí)有幾個(gè)燈亮,我就設(shè)置的一個(gè)燈亮循環(huán)。
從你提的問(wèn)題上看,你需要學(xué)習(xí)的東西還有很多,不僅僅是這個(gè)程序問(wèn)題。呵呵,這次有我給你做作業(yè),下次呢?我現(xiàn)在知道了,為什么那些高手不給你寫(xiě)程序,因?yàn)槟菢邮窃诤δ悖屇悴粚W(xué)習(xí)——考個(gè)大學(xué),特別是搞自動(dòng)化專(zhuān)業(yè)的,好好珍惜吧!我害你一次了,呵呵,下次不再害你了。 |
|