微處理機實習補充教材_按鍵輸入介紹 講義製作:吳進誠
日期:2005/10/19 第 1 頁
PIC16F877 課程內容:微處理器輸入介紹
基本輸入介紹:
單晶片的輸入的有很多形式,任何外部的信號源皆可成為單晶片輸入的依據。最普遍就 屬於按鍵(BUTTON)輸入。在單晶片的應用中,像光感測元件 Cds、溫度感測元件等類比元件,
則需進行 A/D 轉換後,才可給微處理機當做輸入信號使用。所以,若要成為單晶使用的輸入 信號一定要為數位信號,包含邏輯 0(又稱 0 伏)或邏輯 1(2.5 伏以上)才可。至於輸出電路方面,
最常見的為 LED 或七段顯示器。
按鍵輸入電路與提昇電阻介紹:
一般而言,按鍵的兩端常接於輸入端與接地間(如圖所示)。平時按鍵是處於開路狀態,
微處理會偵測到高電位(例如 RESET 按鍵,平時為 VDD,5V),當使用者按下,就成為短路 狀態,則微處理器的輸入端就偵測到低電位信號(0V)。由此可知,按鍵在按下與沒有按下之 間剛好為高低電位的改變,也就是 1 與 0 的狀態變化。如何去偵測這個改變,就需使用者寫 程式去偵測。
PIC 16F877 PORTD,0
SW
<程式範例>有二個按鍵分別接 PORTD,0 及 PORTD,1 5V 以下程式即利用輪詢的方法,偵測按鍵情況。
R=10KΩ
EX:
BTFSS PORTD,0
GOTO ADD ;;執行加法副程式 BTFSS PORTD,1
GOTO SUB ;;執行減法副程式
GOTO EX ;;繼續偵測按鍵狀況
何謂提昇電阻(Pull up resistor):
為避免雜訊的干擾,一般在按鍵輸入時,會接一個電阻來將輸入端的電壓提高到高電位 (VDD),這個電阻就稱為提昇電阻。如圖中的 R(10KΩ)。常用的提昇電阻大約為 1K~100K Ω之間。在 PIC16F877 中 PORTB 就內建提昇電阻。
以上的方法適用於較少的輸入端,若有較多的輸入時,這種每個按鍵就佔一個 I/O 接點
的方式,可能就不適合(由於單晶的 I/O 接點是有限的)。如何改善需要大量輸入,而又可節省
輸入 I/O 接點呢?那就需將按鍵採陣列排列的方式,利用掃描方法依序去檢查每個開關。例
如電腦的鍵盤即採用這樣的方式。
微處理機實習補充教材_按鍵輸入介紹 講義製作:吳進誠
日期:2005/10/19 第 2 頁
陣列鍵盤介紹:
常見的陣列鍵盤有 4X4 如下圖所示的鍵盤。
0 1 2 3
4 5 6 7
0 4 8 C
1 5 9 D
2 6 A E
3 7 B F
0 1 2 3 4 5 6 7
0 4 8 C
1 5 9 D
2 6 A E
3 7 B F
2 .2 K
2 .2 K
2 .2 K
2 .2 K V c c
如何來控制陣列鍵盤呢?在微電腦控制系統中,鍵盤信號的處理,可分為軟體編碼及鍵盤 解碼IC。軟體編碼是採用寫程式去偵測鍵盤那一列,那一行信號變化。再轉換成該行該列 所對應的按鍵值。而利用解碼IC則採用74922/74923,來進行按鍵解碼。
使用方法:4x4矩陣鍵盤有4行4列,因此共需8條I/O線。比採用線性編碼減少I/O線數。電路中 0~3為行,接至微處理器的輸出埠,接受掃瞄信號。4~7為列,接至微處理機輸入埠。2.2K 電阻為提昇電阻,使4~7平時即保持在Hi電位。若所採用的微電腦輸入埠內部己具有提昇電 腦,則可省略。
以下即利用2x2的陣列鍵盤方式(如下圖所示),寫一程式來控制2X2鍵盤。
VDD
R1
R2
SW1 SW2
SW3 SW4
RD,0 RD,1 RD,2 RD,3
PIC16F877
;;程式說明:將四個按鍵開關排成陣列方式,當按SW0時,程式執行ADD加法副程式,
;;按SW1時程式執行減法SUB副程式,按SW2時執行乘法MUL副程式
;;按SW3則執行除法DIV副程式
;;鍵盤I/O規劃為RD,0及RD,1為輸出端,而RD,2及RD,3為輸入端
;;所以TRISD規劃要先完成以下設定 BSF STATUS,RP0 ;;選擇BANK1 BCF TRISD,0 ;;設RD,0為輸出 BCF TRISD,1 ;;設RD,1為輸出 BSF TRISD,2 ;;設RD,2為輸入
微處理機實習補充教材_按鍵輸入介紹 講義製作:吳進誠
日期:2005/10/19 第 3 頁
BSF TRISD,3 ;;設RD,3為輸入 BCF STATUS,RP0 ;;選擇回到BANK0
;;利用掃描方式,進行鍵盤掃描,利用輪詢的方式,去偵測所有開關
;;;先掃描縱的第一行 KEY_CHECK:
BCF PORTD,0 ;;將RD,0設為低電位輸出
BSF PORTD,1 ;;將RD,1設為高電位輸出,以免干擾造成錯誤 BTFSS PORTD,2 ;;檢查SW2有沒有被按下
GOTO SUB ;;如被按,會得到一個低電位,則執行減法SUB BTFSS PORTD,3 ;;由於SW2沒有被按,故可繼續檢查SW3有沒有被按下 GOTO MUL ;;如SW3被按,會得到一個低電位,則執行乘法MUL
;;;若縱的第一行,沒有偵測任何開關被按下,則繼續檢查縱的第二行 BSF PORTD,0 ;;將RD,0設為高電位輸出,不要忘記
BCF PORTD,1 ;;;將RD,1設為0(低電位),以便檢查縱第二行的開關 BTFSS PORTD,2 ;;;檢查SW1有沒有被按下
GOTO ADD ;;;如SW1被按,會得到一個低電位,則執行加法ADD BTFSS PORTD,3 ;;;檢查SW4有沒有被按下
GOTO DIV ;;;如SW4被按,會得到一個低電位,則執行除法DIV GOTO KEY_CHECK ;;;若所有開關都沒有被按,則回到KEY_CHECK繼續偵測
;;
以上的方法,即可解決 2x2 陣列鍵盤輸入的問題。由於一般按鍵都屬於机械式的按鍵開 關,所以當使用按下按鍵時,免不了會因為機械的簧片來回振盪,而產生所謂彈跳的問題。
以下即針對彈跳問題有做個說明及改善方法。
彈跳的問題:
~ ~
H i H i
L o
按 鍵 彈 跳 約
5 ~ 1 0 m s 按 鍵 彈 跳
一般而言,機械按鍵彈跳的產生是無法避免的,只是長短的問題而己。無論如何,彈跳 都會在 20mS 內結束而趨於穩定。要不要消除彈跳現象,就必須與應用的對象來做判斷。通 常,若按鍵是和〞計數〞有關的應用時,為怕彈跳造成計數的錯誤,就必須對消除彈跳對電 路的影響。
改善彈跳的方法:
消除彈跳的方法有很多種,但可分為硬體及軟體消除彈跳二大類。硬體方面可採用正反
微處理機實習補充教材_按鍵輸入介紹 講義製作:吳進誠
日期:2005/10/19 第 4 頁
器、鎖相迴路等數位邏輯電路來消除。而軟體消除的方式,則需利用程式設計來想方法。由 於按鍵時所產生的彈跳時間不超過 20mS,因此,當單晶片偵測到按鍵電路邏輯改變時(1->0) 時,立刻延遲 20mS 後再執行按鍵所要執行的工作即可。當然,不是每按鍵彈跳時間都要 20mS 時間,可根據自己使用的情形來做判斷。
;;程式範例:加入消除彈跳的程式方法
;;方法(一),一段式檢查法
5V PORTD,0
EX1:
PIC 16F877 R=10KΩ
BTFSC PORTD,0 ;;;利用 BTFSC 偵測按鍵狀態 GOTO EX1 ;;;高電位繼續偵測
CALL DELAY_20MS ;;;低電路則執行 20mS 延遲程式
…… SW
;;方法(二),採用 DOUBLE CHECK 二段式檢查法 EX2:
BTFSC PORTD,0 ;;;偵測 PORTD,0 的電位狀態 GOTO EX2 ;;;若仍高電位,則繼續偵測
EX_CHECK: ;;;若偵測到低電位,代表按鍵被按下 CALL DELAY_20MS ;;;延長 20MS 時間來消除彈跳
BTFSS PORTD,0 ;;;檢查按鍵是否己經穩定,回到高電位
GOTO EX_CHECK ;;;若沒有,代表按鍵仍處於彈跳狀態,回到 EX_CHECK 繼續延長等待 ……… ;;;.程式繼續執行按鍵所要的工作
結論:
學會如何應用及處理輸入信號,對整個單晶使用者而言,是相當重要的一環。舉例來說,
去逛夜市時,相信大家都會看到有一種遊戲機台,是丟乒乓球進入不同的洞內,有的洞得 5 分,有些洞進入則得 10 分..等等,分數再由前方的矩陣式 LED 顯示出來。像這種遊戲機 就是單晶的輸入及輸出的應用而己。看到這裡,大家也應明白,要設計像夜市這樣功能的遊 戲機本身並不是太困難的事,端看各位用心程度而己。
歡迎光臨
顯示畫面
乒乓丟入孔