基本I/O控制-霹靂燈

基礎I/O控制之按鈕跳跳跳

單晶片控制中,學習按鈕的控制也是相當重要的,此實驗以PortA作為輸入

也就是以按鈕來送出信號,在由PortB反應動作,只要將霹靂燈加以修改

加入兩個按鈕,即可完成本次實驗電路。

1.使用材料

1K電阻*3、104陶瓷電容*1、33p陶瓷電容*2、4Mhz震盪器*1

LED燈*8、470R*8、PIC16F84A*1、彈壓式按鈕*2

2.電路圖

Open in new window

 3.關於按鈕的動作

彈壓式按鈕屬機械式動作,而因這個原因,在按鈕按下與放開的瞬間會產生極短時間的彈跳(約20-50mS)

稱為機械彈性,而產生這種情況時,會造成單晶片的誤判,簡單說,因為單晶片的運算速度較快

當產生極短時間的「彈跳」時,會造成單晶片誤判為按了好幾下開關,但實際上我們可能只按了

一下,下圖為機械彈性的示意圖;

Open in new window

 所以此問題的解決辦法可以使用Delay方式,來避開這一段彈跳的時間,也就是說,

當第一時間單晶片檢測到開關被按下的瞬間,就先delay一段時間,然後再重新檢測一次。

4.程式部分 Download ASMHEX

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;基本I/O控制實驗
;
;程式功能為:
;由PORTB推動8顆LED,初始值為00000001
;由PORTA,0與PORTA,1做外部輸入控制
;當PA,0被按下時,將PORTB左旋一個位元
;當PA,1被按下時,將PORTB右旋一個位元
;
;by xuan 2008/12/19
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DLY1 SET 0x0B
DLY2 SET 0x0C
DLY3 SET 0x0D

LIST P=16F84A

ORG 00H ;設定成是起始位置
BSF 03H,5 ;切換到BANK1
BCF 03H,6
MOVLW 0x1F ;將PORTA設為輸入
MOVWF 05H
MOVLW 0x00 ;將PORTB全設為輸出
MOVWF 06H
BCF 03H,5 ;切換回BANK0

MOVLW 0x01 ;給初始值
MOVWF 06H
BCF 03H,0

CK_BUTTON:
BTFSC 05H,0 ;如果05H,0為1時跳到左旋副程式
GOTO LEFT
BTFSC 05H,1 ;如果05H,1為1時跳到又旋副程式
GOTO RIGHT
GOTO CK_BUTTON ;返回CK_BUTTON(LOOP)

LEFT:
CALL DELAY ;防止開關彈跳造成異常動作
BTFSS 05H,0
GOTO CK_BUTTON
RLF 06H,1 ;左移一個位元
GOTO CK_BUTTON ;返回等待開關被按下

RIGHT:
CALL DELAY
BTFSS 05H,1
GOTO CK_BUTTON
RRF 06H,1
GOTO CK_BUTTON
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;DELAY副程式
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY:
MOVLW 0x0A
MOVWF DLY1
DEL:
MOVLW 0xFA
MOVWF DLY2
DEC1:
MOVLW 0x19
MOVWF DLY3
DEC2:
DECFSZ DLY3,1
GOTO DEC2
DECFSZ DLY2,1
GOTO DEC1
DECFSZ DLY1,1
GOTO DEL
RETURN

END

4.實驗結果 Download 3GP file

Open in new window

 程式結果為開始的時候只有左邊第一顆燈亮,按下RA0開關之後,將PortB值左旋一個位元

如按下RA1開關,則右旋一個位元。

另外,很多書上在教這個範例的時候,都會把輸入腳位,也就是本實驗中的RA1,RA2腳位放空

必須直到有被按下時才有High或Low的信號,基本上我實驗之後發現這個是很不穩定的

所以後來我就在開關的一端接了一個1K的電阻對地,以確保信號可以正常的為Low。

如果此做法有錯,希望有看到的朋友們可以指正,謝謝!

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料