獨立按鍵
常用的按鍵電路有兩種形式,獨立式按鍵和矩陣式按鍵,獨立式按鍵比較簡單,它們各自與獨立的輸入線相連接,如圖 8-6 所示。
圖 8-6 獨立式按鍵原理圖
4 條輸入線接到單片機的 IO 口上,當按鍵 K1 按下時,+5V 通過電阻 R1 然后再通過按鍵 K1 最終進入 GND 形成一條通路,那么這條線路的全部電壓都加到了 R1 這個電阻上,KeyIn1 這個引腳就是個低電平。當松開按鍵后,線路斷開,就不會有電流通過,那么 KeyIn1和+5V 就應該是等電位,是一個高電平。我們就可以通過 KeyIn1 這個 IO 口的高低電平來判斷是否有按鍵按下。
這個電路中按鍵的原理我們清楚了,但是實際上在我們的單片機 IO 口內部,也有一個上拉電阻的存在。我們的按鍵是接到了 P2 口上,P2 口上電默認是準雙向 IO 口,我們來簡單了解一下這個準雙向 IO 口的電路,如圖 8-7 所示。
圖 8-7 準雙向 IO 口結構圖
首先說明一點,就是我們現在絕大多數單片機的 IO 口都是使用 MOS 管而非三極管,但用在這里的 MOS 管其原理和三極管是一樣的,因此在這里我用三極管替代它來進行原理講解,把前面講過的三極管的知識搬過來,一切都是適用的,有助于理解。
圖 8-7 方框內的電路都是指單片機內部部分,方框外的就是我們外接的上拉電阻和按鍵。這個地方大家要注意一下,就是當我們要讀取外部按鍵信號的時候,單片機必須先給該引腳寫“1”,也就是高電平,這樣我們才能正確讀取到外部按鍵信號,我們來分析一下緣由。
當內部輸出是高電平,經過一個反向器變成低電平,NPN 三極管不會導通,那么單片機IO 口從內部來看,由于上拉電阻 R 的存在,所以是一個高電平。當外部沒有按鍵按下將電平拉低的話,VCC 也是+5V,它們之間雖然有 2 個電阻,但是沒有壓差,就不會有電流,線上所有的位置都是高電平,這個時候我們就可以正常讀取到按鍵的狀態了。
當內部輸出是個低電平,經過一個反相器變成高電平,NPN 三極管導通,那么單片機的內部 IO 口就是個低電平,這個時候,外部雖然也有上拉電阻的存在,但是兩個電阻是并聯關系,不管按鍵是否按下,單片機的 IO 口上輸入到單片機內部的狀態都是低電平,我們就無法正常讀取到按鍵的狀態了。
這個和水流其實很類似的,內部和外部,只要有一邊是低電位,那么電流就會順流而下,由于只有上拉電阻,下邊沒有電阻分壓,直接到 GND 上了,所以不管另外一邊是高還是低,那電平肯定就是低電平了。
從上面的分析就可以得出一個結論,這種具有上拉的準雙向 IO 口,如果要正常讀取外部信號的狀態,必須首先得保證自己內部輸出的是 1,如果內部輸出 0,則無論外部信號是 1還是 0,這個引腳讀進來的都是 0。
矩陣按鍵
在某一個系統設計中,如果需要使用很多的按鍵時,做成獨立按鍵會大量占用 IO 口,因此我們引入了矩陣按鍵的設計。如圖 8-8 所示,是我們的 KST-51 開發板上的矩陣按鍵電路原理圖,使用 8 個 IO 口來實現了 16 個按鍵。
圖 8-8 矩陣按鍵原理圖
如果獨立按鍵理解了,矩陣按鍵也不難理解,那么我們一起來分析一下。圖 8-8 中,一共有 4 組按鍵,我們只看其中一組,如圖 8-9 所示。大家認真看一下,如果 KeyOut1 輸出一個低電平,KeyOut1 就相當于是 GND,是否相當于 4 個獨立按鍵呢。當然這時候 KeyOut2、KeyOut3、KeyOut4 都必須輸出高電平,它們都輸出高電平才能保證與它們相連的三路按鍵不會對這一路產生干擾,大家可以對照兩張原理圖分析一下。
圖 8-9 矩陣按鍵變獨立按鍵示意圖