在PIC16F1782中实现查找表

时间:2015-08-11 13:33:03

标签: pic lookup-tables

我使用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

1 个答案:

答案 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