[51單片機(jī)學(xué)習(xí)筆記FIVE]----獨立按鍵
一、8個按鍵控制8個LED燈
1 /*******************************************************************************
2 實驗名稱: 8個獨立按鍵控制8盞LED燈(按下哪個鍵,那個鍵對應(yīng)的LED亮)
3 實驗時間: 2015/1/20
4 *******************************************************************************/
5 #include
6
7 #define LED_KEY P0 //LED燈用P0口
8 #define IO_KEY P1 //獨立按鍵用P1口
9
10 void Delay(); //延時函數(shù)
11 unsigned char Key_Scan(); //獲取按鍵值
12
13 void main()
14 {
15 unsigned char Key_Value, LED_Value;
16
17 while(1)
18 {
19 Key_Value = Key_Scan();
20 switch(Key_Value)
21 {
22 case(0xFE): //K1按下
23 LED_Value = 0x01;
24 break;
25 case(0xFD): //K2按下
26 LED_Value = 0x02;
27 break;
28 case(0xFB): //K3按下
29 LED_Value = 0x04;
30 break;
31 case(0xF7): //K4按下
32 LED_Value = 0x08;
33 break;
34 case(0xEF): //K5按下
35 LED_Value = 0x10;
36 break;
37 case(0xDF): //K6按下
38 LED_Value = 0x20;
39 break;
40 case(0xBF): //K7按下
41 LED_Value = 0x40;
42 break;
43 case(0x7F): //K8按下
44 LED_Value = 0x80;
45 break;
46 default:
47 break;
48 }
49
50 LED_KEY = LED_Value; //點亮相應(yīng)LED
51 }
52 }
53
54 unsigned char Key_Scan()
55 {
56 unsigned char Key_Value,i;
57
58 if(IO_KEY != 0)
59 {
60 Delay(); //消除抖動
61
62 if(IO_KEY != 0xFF)
63 {
64 Key_Value = IO_KEY;
65 i = 0;
66 if((i<50)&&(IO_KEY != 0xFF)) //判斷按鍵是否松開
67 {
68 Delay();
69 i++;
70 }
71 }
72 }
73 return Key_Value;
74 }
75
76 void Delay() //延遲10ms
77 {
78 unsigned char a,b,c;
79
80 for(c=1;c>0;c--)
81 {
82 for(b=38;b>0;b--)
83 {
84 for(a=130;a>0;a--)
85 {};
86 }
87 }
88 }
獨立按鍵原理是這樣的:按鍵沒按下的時候,相應(yīng)端口是高電平狀態(tài),而當(dāng)按鍵按下的時候,相應(yīng)的端口則是低電平。所以可以根據(jù)這個現(xiàn)象,實現(xiàn)相應(yīng)的功能。
還有一點應(yīng)該注意的是:按鍵在閉合和斷開時,觸點會存在抖動現(xiàn)象。
在實際情況下,我們需要的是穩(wěn)定閉合的那部分狀態(tài)。所以可以采用延時的方法來解決這個問題,具體的過程就是先看看有沒有鍵按下,有鍵按下了,再延遲一段時間,再看看有沒有鍵按下,
這時候如果還是有鍵按下的話那就真的是有鍵按下了。
而這個抖動的時間大概是10ms,所以只要用一個延時10ms的子函數(shù)就行。
上面代碼的第66行那個判斷按鍵是否松開也是必要的,雖然在這個程序中有和沒有區(qū)別不大,但是在有的程序中加入要求按鍵松開之后才出現(xiàn)什么現(xiàn)象之類的東西的話,那這部分就顯得必要了。
二、LED顯示鍵值
1 1 /***************************************************
2 2 實驗名稱: LED顯示鍵值(按下哪個鍵,那個鍵對應(yīng)的LED不亮)
3 3 實驗時間: 2015/1/22
4 4 ****************************************************/
5 5 #include
6 6
7 7 #define LED_KEY P0 //LED燈用P0口
8 8 #define IO_KEY P1 //獨立按鍵用P1口
9 9
10 10 void Delay(); //延時函數(shù)
11 11 unsigned char Key_Scan(); //獲取按鍵值
12 12
13 13 void main()
14 14 {
15 15 unsigned char Key_Value, LED_Value;
16 16
17 17 while(1)
18 18 {
19 19 Key_Value = Key_Scan();
20 20 if (Key_Value != 0) //有按鍵按下
21 21 {
22 22 LED_Value = Key_Value;
23 23 }
24 24
25 25 LED_KEY = LED_Value; //點亮相應(yīng)LED
26 26 }
27 27 }
28 28
29 29 unsigned char Key_Scan()
30 30 {
31 31 unsigned char Key_Value,i;
32 32
33 33 if(IO_KEY != 0)
34 34 {
35 35 Delay(); //消除抖動
36 36
37 37 if(IO_KEY != 0xFF)
38 38 {
39 39 Key_Value = IO_KEY;
40 40 i = 0;
41 41 if((i<50)&&(IO_KEY != 0xFF)) //判斷按鍵是否松開
42 42 {
43 43 Delay();
44 44 i++;
45 45 }
46 46 }
47 47 }
48 48 return Key_Value;
49 49 }
50 50
51 51 void Delay() //延遲10ms
52 52 {
53 53 unsigned char a,b,c;
54 54
55 55 for(c=1;c>0;c--)
56 56 {
57 57 for(b=38;b>0;b--)
58 58 {
59 59 for(a=130;a>0;a--)
60 60 {};
61 61 }
62 62 }
63 63 }
三、按鍵選擇花樣顯示
1 /***********************************************
2 實驗名稱: 按鍵選擇花樣顯示
3 實驗時間: 2015/1/22
4 ***********************************************/
5 #include
6 #include
7
8 #define IO_KEY P1
9 #define LED_KEY P0
10
11 void Delay(unsigned char c); //延時函數(shù)
12 unsigned char Key_Scan(); //按鍵掃描函數(shù)
13 void Key1(); //按下按鍵1的操作
14 void Key2(); //按下按鍵2的操作
15 void Key3(); //按下按鍵3的操作
16 void Key4(); //按下按鍵4的操作
17 void Key5(); //按下按鍵5的操作
18 void Key6(); //按下按鍵6的操作
19 void Key7(); //按下按鍵7的操作
20 void Key8(); //按下按鍵8的操作
21
22 void main()
23