新會員
Joined
: 2006/7/24 19:43 最後登入時間
: 2006/10/31 22:30
Group:
註冊會員
Level : 1 HP : 0 / 18 MP : 2 / 979 EXP : 73
|
我的程式再附上如下,之前f312380先生告知的這個訊息,我之前也試過,但其實最大的問題點在於InitPortB這個subroutine初始化完之後,PORTB的值被強迫為0x30,而不是0x00,所以會有非預期的輸出(實際接板子抓出的問題),所以麻煩各位如果有人有能力解決這個問題的話給點主意吧:
list p = 18F452 #include <p18F452.inc>
TEMP EQU 0x02
ORG 0x00 GOTO START
ORG 0x08 GOTO ServiceInterrupt
org 0x20 START call InitPortB ;initalize port B
bsf RCON,IPEN bsf INTCON,GIEH
loop sleep ;sleep till key is hit nop goto loop
ServiceInterrupt btfsc INTCON,RBIF ;change on rb int? goto ServiceWakup ;yes then service bcf INTCON,TMR0IE ;clear TMR0 int mask bcf INTCON,TMR0IF ;clear flag return
ServiceWakup bcf INTCON,RBIE ;clear mask MOVF PORTB,W ;read PORTB bcf INTCON,RBIF ;clear flag call delay16 ;do de-bounce for 16mSecs MOVF PORTB,W ;read port B again andlw B'11110000' ;mask outputs movwf TEMP ;save in temp swapf TEMP,F ;switch low and high movfF TEMP,LATB ;send as outputs. call KeyRelease ;check for key release RETFIE
KeyRelease call delay16 ;do debounce MOVF PORTB,W ;read PORTB bcf INTCON,RBIF ;clear flag bsf INTCON,RBIE ;enable mask andlw B'11110000' ;clear outputs btfsc STATUS,Z ;key still pressed? return ;no then return sleep ;else save power bcf INTCON,RBIE ;on wake up clear mask MOVF PORTB,W bcf INTCON,RBIF ;clear flag goto KeyRelease ;try again
InitPortB CLRF PORTB CLRF LATB
MOVLW 0x0F ; 使PORTB為 MOVWF ADCON1 ; Digital I/O
MOVLW 0xF0 MOVWF TRISB bcf INTCON2,RBPU ;enable pull up
bcf INTCON,RBIE ;disable mask movf PORTB,W ;read port bcf INTCON,RBIF ;clear flag bsf INTCON,RBIE ;enable mask RETURN
delay16 movlw B'11000111' ;fosc/256 --> TMR0 movwf T0CON ; / clrf TMR0L bcf INTCON,TMR0IF ;clear flag bsf INTCON,TMR0IE ;enable mask CheckAgain btfss INTCON,TMR0IF ;timer overflowed? goto CheckAgain ;no check again bcf INTCON,TMR0IE ;else clear mask bcf INTCON,TMR0IF ;clear flag return
end
發表於: 2006/7/25 11:46
|