我使用PIC16F1782并尝试实现retlw查找表。我已经编写了与微芯片AN556(实现表读取)相关的代码但是不起作用。我使用 MPLAB X IDE v3.05 模拟了此代码,发现 MOVLW HIGH IF_TABLE 将0x80置于似乎错误的WREG。然后PC会得到一个错误的值,当我调用IF_TABLE时,程序会转到错误的位置。如果你能帮助我,我将不胜感激。
ORG 0H
GOTO MAIN
;simple ISR for TIMER0 OverFlow
ORG 0004H
BTFSS INTCON,2
RETFIE
MOVLW 0X01
XORWF PORTA,F
BCF INTCON,2
RETFIE
MAIN
;OSCON,DACCON and portA configurations
BANKSEL OSCCON
MOVLW B'11110000'
MOVWF OSCCON
BANKSEL DACCON0
MOVLW B'10110000'
MOVWF DACCON0
BANKSEL OPTION_REG
MOVLW B'10000001'
MOVWF OPTION_REG
BANKSEL INTCON
MOVLW B'10100000'
MOVWF INTCON
BANKSEL TRISA
BANKSEL PORTA ;
CLRF PORTA ;Init PORTA
BANKSEL LATA ;Data Latch
CLRF LATA ;
BANKSEL ANSELA ;
CLRF ANSELA ;digital I/O
BANKSEL TRISA ;
MOVLW B'00000000'
MOVWF TRISA
BANKSEL PORTA
BSF PORTA,0
CLRF 0X27
CLRF 0X28
;the problem is in RPT loop
RPT:
MOVF 0X27,W
MOVWF 0X28
MOVLW LOW IF_TABLE
ADDWF 0X28,F
MOVLW HIGH IF_TABLE
BTFSC STATUS,C
ADDLW 1
MOVWF PCLATH
MOVF 0X28,W
CALL IF_TABLE
BANKSEL DACCON1
MOVWF DACCON1
INCF 0X27,F
GOTO RPT
IF_TABLE:
MOVWF PCL
RETLW D'126'
RETLW D'128'
RETLW D'131'
RETLW D'136'
.
.
.
END
答案 0 :(得分:1)
要指向表中的实际插槽,您必须在索引中添加一个:
RPT:
MOVF 0X27,W
MOVWF 0X28
INCF 0x28,F ; add here
MOVLW LOW IF_TABLE
此外,在BANKSEL DACCON1之后,您需要切换回存储区零
BANKSEL DACCON1
MOVWF DACCON1
BANKSEL 0X27 ; switch back here
INCF 0X27,F