通過四個基礎(chǔ)練習(xí)學(xué)習(xí)按鍵開關(guān)
1.第一個按鍵:按下一次,LED1亮,再次按下LED1滅
2.第二個按鍵:按下一次,LED1亮,按下第二次LED2亮..... 按下第四次LED4亮,按下第五次,LED1亮,依次往復(fù)。
3.第三個按鍵:按下所有LED滅
4.第四個按鍵:按下所有LED都亮了
四個基礎(chǔ)練習(xí)的效果動圖
按鍵抖動的原因和危害,軟件消抖
按鍵開關(guān)通常為機(jī)械式開關(guān),因為機(jī)械觸點有彈性。 在閉合和斷開的瞬間都會伴隨彈性抖動。 抖動時間: 一般為5ms~10ms
按鍵的抖動對于人類來說是感覺不到的,但對單片機(jī)來說,是一個很“漫長”的過程,因為單片機(jī)處理的速度在“微秒”級,而按鍵抖動的時間至少在“毫秒”級
軟件消抖的方法是不斷檢測按鍵值,直到按鍵值穩(wěn)定。
實現(xiàn)方法:假設(shè)未按鍵時輸入為1,按鍵后輸入為0,抖動時不確定。 可以做以下檢測:檢測到按鍵輸入為0之后,延時5ms~10ms,再次檢測,如果按鍵還為0,那么就認(rèn)為有按鍵輸入。 延時的5ms~10ms恰好避開了抖動期。
if(0==BUTTON1)//判斷是否有按鍵按下
{
delay(10); //延時一段時間(10ms)去除前沿抖動
if(0==BUTTON1)//再次確認(rèn)是否有按鍵按下
{
while(0==BUTTON1);//按鍵抬起繼續(xù)往下執(zhí)行,沒有則繼續(xù)等待
LED1 = ~LED1; //按下一次,LED1亮,再次按下LED1滅
}
一個按鍵控制多個LED燈
按下一次,LED1亮,按下第二次LED2亮..... 按下第四次LED4亮,按下第五次,LED1亮,依次往復(fù)。 利用C語言的取模運算符,1%4 = 1 , 2%4=2 , 3%4=3 , 4%4=0 , 5%4=1 , 6%4=2...
//定義全局變量count,a
if(0==BUTTON2)
{
delay(10);//延遲10ms
if(0==BUTTON2)
{
while(!BUTTON2);//按鍵抬起繼續(xù)往下執(zhí)行,沒有則繼續(xù)等待
count++;//每按下BUTTON2按鍵抬起時,變量count加1
a = count%4;
switch(a)
{
case 1:
P0= 0xfe; //11111110 LED1亮
break;
case 2:
P0= 0xfd;//11111101 LED2亮
break;
case 3:
P0= 0xfb; //11111011 LED3亮
break;
case 0:
P0=0xf7;//11110111 LED4亮
break;
default :
P0=0xff;
break;
}
}
}
按下4個LED燈全熄滅
P0口為高電平時LED熄滅,低電平全亮
if(0==BUTTON3)
{
delay(10);
if(0==BUTTON3)
{
while(0==BUTTON3);
P0 = 0xff; //P0 = 0x00 全亮
}
}
把四個練習(xí)封裝成函數(shù)
void main()
{
while(1)
{
task1();
task2();
task3();
task4();
}
}
補充
#define u16 unsigned int 等效于typedef unsigned int u16;
#define u8 unsigned char 等效于typedef unsigned char u8;
為什么要這樣定義,這樣寫非常直觀,不用擔(dān)心平臺的不同可移植性好,它的字節(jié)數(shù)一看就知道,u16是16位2個字節(jié),
-
led
+關(guān)注
關(guān)注
242文章
23296瀏覽量
661294 -
單片機(jī)
+關(guān)注
關(guān)注
6037文章
44562瀏覽量
635911 -
抖動
+關(guān)注
關(guān)注
1文章
69瀏覽量
18878 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4333瀏覽量
62696 -
按鍵開關(guān)
+關(guān)注
關(guān)注
2文章
36瀏覽量
10405
發(fā)布評論請先 登錄
相關(guān)推薦
評論