我的任务是使用bcd 4511对PIC16F1517进行编程,使用TMR0的中断显示从0到9999的数字。按下断开按钮(RB0)后开始计数。显示器连接到PORTD。我使用调试器来查看它是如何工作的,但只看到数字像疯了一样增加而且不流畅所以如果它的顺序是正确的。可悲的是,我没有看到它是否有效。有人可以检查吗?我正在使用MPLAB X IDE v4.01
#define LEL PORTC,4
#DEFINE LEH PORTC,5
#DEFINE BI PORTC,2
#include<p16f1517.inc>
__CONFIG _CONFIG1 ,_FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _BOREN_OFF &_CLKOUTEN_OFF
__CONFIG _CONFIG2 , _WRT_OFF & _VCAPEN_OFF & _LVP_OFF
WSKP EQU 0x30;least significant
WSKL EQU 0x31;most significant
ORG 0x00
clrf WSKP
clrf WSKL
goto settings
ORG 0x04
GOTO interupt
settings
BANKSEL PORTB
CLRF PORTB
CLRF PORTC
CLRF PORTD
BANKSEL ANSELB
CLRF ANSELB
CLRF ANSELC
CLRF ANSELD
BANKSEL LATB
CLRF LATB
CLRF LATC
CLRF LATD
BANKSEL TRISB
MOVLW 0x01
MOVWF TRISB
CLRF TRISC
CLRF TRISD
BANKSEL OPTION_REG
bcf OPTION_REG, 5
bCf OPTION_REG, 3
bsf OPTION_REG, 2
bsf OPTION_REG, 1
bsf OPTION_REG, 0
BANKSEL PORTD
BCF BI
BSF LEL
BCF LEH
bsf PORTC,6
BSF BI
START
btfsc PORTB,0
goto START
BANKSEL INTCON
BSF INTCON,7;GIE;7
BSF INTCON,5;TMR0IE
goto START
interupt
bcf PORTC,6
incf WSKP,f
call check
call display
BANKSEL INTCON
bcf INTCON, 2;tmr0if
retfie
check
MOVFW WSKP
ANDLW 0x0f;check if wskp=10,20,...,90 if so add 0x06 to display correct number
SUBLW 0x0a
BTFSS STATUS,Z
return
MOVLW 0x06
ADDWF WSKP,f
GOTO check1
check1
movfw WSKP
ANDLW 0xF0;check if wskp=100 if so cleat it and increment wskl
SUBLW 0x60
BTFSS STATUS, Z
RETURN
clrf WSKP
incf WSKL,f
movfw WSKL
andlw 0x0F;check if wskl=10,20,...,90 if so add 0x06 to display correct number
sublw 0x0A
btfss STATUS, Z
RETURN
movlw 0x06
addwf WSKL, f
movfw WSKL
andlw 0xf0;if wskl=100 that means we displayed 9999 then clear to start counting from 0
sublw 0x60
btfss STATUS, Z
RETURN
clrf WSKP
CLRF WSKL
return
display
bcf BI
bsf LEL
bcf LEH
movfw WSKP
movwf PORTD
bcf LEL
bsf LEL
movfw WSKL
movwf PORTD
bcf LEH
bsf LEH
bsf BI
return
END
答案 0 :(得分:1)
首先,我建议您初始化INTCON
注册以避免不可预测的行为。
之后我认为问题出现在MainLoop和Interrupt代码中。对于MainLoop,您可以为INTCON
设置内存库,但不为PORTB
设置内存库;对于中断例程,您不必在开始时设置存储库,并且在跳转check
,check1
和display
代码时不要设置存储库。
这样,您读取,写入和测试的所有变量必须位于INTCON
的同一存储库中。你确定是这样吗?