# LAB6 digital I/O example code ### DELAY 這個macro可以看成是一個用來製造出延遲的function,用來避免bouncing problem ### check_process 一個迴圈,用來檢查input的訊號,由於此處botton接上上拉電阻,因此按鈕打開時值為1, "BTFSC PORTB, 0" 就是用來判斷如果RB0值為1(按鈕沒被按下)就繼續在check_process裡面重複判讀 ### lightup "BTG" 是將一個bit做反轉(0->1, 1->0),因此進入該function一次,LED燈的狀態就會改變 #### 設定ADCON1 需要將adcon設定成能使腳位接收數位訊號 (有些腳位是多工,不只可以接受數位訊號,也可以接收類比訊號),而一些腳位預設是接收類比訊號,因此需要此設定 ```asm LIST p=18f4520 #include<p18f4520.inc> CONFIG OSC = INTIO67 ; 1 MHZ CONFIG WDT = OFF CONFIG LVP = OFF L1 EQU 0x14 L2 EQU 0x15 org 0x00 ; Total 2 + (2 + 7 * num1 + 2) * num2 cycles = C ; num1 = 200, num2 = 180, C = 252360 ; Total delay ~= C/1M = 0.25s DELAY macro num1, num2 local LOOP1 local LOOP2 MOVLW num2 MOVWF L2 LOOP2: MOVLW num1 MOVWF L1 LOOP1: NOP NOP NOP NOP NOP NOP DECFSZ L1, 1 BRA LOOP1 DECFSZ L2, 1 BRA LOOP2 endm start: int: ; let pin can receive digital signal MOVLW 0x0f MOVWF ADCON1 CLRF PORTB BSF TRISB, 0 CLRF LATA BCF TRISA, 0 ; ckeck button check_process: BTFSC PORTB, 0 BRA check_process BRA lightup lightup: BTG LATA, 0 DELAY d'200', d'180' ;delay 0.25s BRA check_process end ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up