本文是關于獨立按鍵的介紹及使用。首先介紹了按鍵,包括什么是按鍵及使用按鍵時如何實現軟件消抖。然后使用proteus仿真實現獨立按鍵控制LED指示燈的操作。
之前的LED、蜂鳴器、數碼管中IO口都是作為輸出使用,這里通過獨立按鍵實驗介紹IO口作為輸入的使用。
文章目錄
- 一、按鍵介紹
- 二、獨立按鍵檢測原理
- 三、硬件設計
- 四、軟件設計
一、按鍵介紹
按鍵是一種電子開關,使用時按開關按鈕就可使開關接通,當松開手時,開關斷開。簡單的按鍵及內部簡易圖如下:
按鍵管腳兩端距離長的表示默認是導通狀態,距離短的默認是斷開狀態。
如果按鍵按下,初始導通狀態變為斷開,初始斷開狀態變為導通。
通常的按鍵使用的開關為機械彈性開關,當機械觸電斷開、閉合時,電壓信號如下所示:
由于機械點的彈性作用,按鍵開關在閉合時不會馬上穩定的接通,在斷開時也不會一下子斷開。因而在閉合和斷開的瞬間均伴隨著一連串的抖動。抖動時間的長短由按鍵的機械特性決定,一般為5ms到10ms。
按鍵穩定閉合時間的長短由操作人員的按鍵動作決定,一般為零點幾秒至數秒。按鍵抖動會引起按鍵被誤讀多次。為了確保CPU對按鍵的依次閉合僅作一次處理,必須及時進行消抖。
按鍵消抖有兩種方式,一種是硬件消抖,另一種是軟件消抖。為了使電路更加簡單,通常采用軟件消抖。
軟件消抖一般來說一個簡單的按鍵消抖就是先讀取按鍵的狀態,如果得到按鍵按下之后,延時10ms,再次讀取按鍵狀態,如果按鍵還是按下狀態,那么說明按鍵已經按下。其中的延時10ms就是軟件消抖處理。
常用的軟件去抖動方法:
- 先設置IO口為高電平,由于開發板IO有上拉電阻,默認IO為高電平;
- 讀取IO口電平確認是否有按鍵按下;
- 如果有IO電平為低電平后,延時幾個毫秒;
- 再讀取該IO電平,如果仍為低電平,說明按鍵按下;
- 執行相應按鍵的程序;
鍵盤分為編碼鍵盤和非編碼鍵盤。鍵盤上閉合鍵的識別由專用的硬件編碼器實現,并產生鍵編碼號或鍵值的稱為編碼鍵盤,如計算機鍵盤。靠軟件編程來識別的鍵盤稱為非編碼鍵盤。
單片機系統中,用的較多的是非編碼鍵盤。非編碼鍵盤又分為獨立鍵盤和行列式鍵盤(即常說的矩陣鍵盤)。
二、獨立按鍵檢測原理
獨立按鍵電路構成是由各個按鍵的一個管腳連接在一起接地,按鍵其它引腳分別接到單片機IO口。
單片機的IO口既可作為輸出也可作為輸入使用,當檢測按鍵時用的是它的輸入功能,獨立按鍵的一端接地,另一端與單片機的某個IO口相連,開始時先給IO口賦一高電平,然后讓單片機不斷檢測該IO口是否變為低電平,當按鍵閉合時,相當于該IO口通過按鍵與地相連,變成低電平,程序一旦檢測到IO口變為低電平則說明按鍵被按下,然后執行相應的指令。
三、硬件設計
要實現的功能是:通過開發板上的獨立按鍵控制LED指示燈亮滅。使用到的硬件資源如下:
- LED指示燈
- K1按鍵
proteus中仿真如下:
從電路中可以知道,該電路是獨立的,4個獨立按鍵的控制管腳直接連接到單片機的P3^0 ~ P3^3 IO口上。
要想單片機能夠檢測按鍵是否按下,需要通過單片機管腳來控制獨立按鍵。
四、軟件設計
實現代碼如下:
/*實現功能:使用獨立按鍵控制指示燈的亮滅[2023-12-06] zoya
*/
#include "reg52.h"typedef unsigned int u16;sbit KEY1 = P3^0; // 獨立按鍵#define GPIO_LED P2 // 指示燈// 延時函數,i=1延時10us
void delay(u16 i)
{while(i--);
}// 獨立按鍵處理函數
void keypros()
{if(0 == KEY1){ // 2. 讀取IO口是否為低電平確認按鍵是否按下delay(1000); // 3. 延時10msif(0 == KEY1) { // 4. 在讀取IO口判斷是否為低電平,如果仍然是低電平,說明按鍵按下GPIO_LED = ~GPIO_LED; // 5. 執行按鍵按下的操作}while(!KEY1); // 6. 穩定閉合期間保持按鍵操作}
}void main()
{KEY1 = 1; // 1. 先設置IO口為高電平GPIO_LED = 0xFF; // 默認指示燈為不亮狀態while(1){keypros();}
}
仿真結果: