Sirius microSystems logo   Address and telephone numbers

PIC Table Read code

Tables can be used to read a list of data from the memory of the PICmicro. The PICmicro instruction set makes table reads easy with the ADDWF and RETLW instructions.

First, use a counter to pre-load W with the position of the table element that you want to retreive.Let's use position 4 as an example.

Next, perform a call to the first table location. At this location, an ADDWF PCL instruction is used to offset the program counter by the table position loaded in W. So, in this case the program counter, which was pointing to the location following the ADDWF PCL instruction will be offset by 4, moving the program counter to the fourth table item. This item will now be retured to your main code by a RETLW instruction.

All of this works well unless the table straddles a 256-btye memory boundary. The ADDWF PCL instruction only works on the lower 8-bits of the program counter. The first Get_Char code, below, shows a typical ADDWF PCL table read. The second Get_Char table read code checks for a memory boundary overlap and allows for proper table operation in this case.

;A normal table read using the ADDWF PCL instruction will work if the
;Get_Char and Table1 code are entirely in the first 8-bit page of program
;memory (the first 256 memory locations).

                .
Get_Char        MOVF    Counter,W       ;Load W with table offset and
                CALL    Table1          ;use it to get data
                .
                .

Table1          ADDWF   PCL             ;Offset program counter by adding W
                RETLW   'D'             ;to Table1
                RETLW   'a'
                RETLW   't'
                RETLW   'a'
                  |
                RETLW   0               ;End of message


;This Table Read can be directly interchanged with the one above, and will
;work wherever the Get_Char and Table2 code is located in memory.

                .
Get_Char        MOVLW   HIGH Table2     ;Move the High Byte of the first table
                                        ;location into W
                MOVWF   PCLATH          ;and then into PCLATH
                MOVLW   Table2 + 1      ;Load W with the address of the first
                                        ;piece of data in Table2
                ADDWF   Counter,W       ;Calculate the offset address and 
                BTFSC   STATUS,C        ;see if it overflows
                INCF    PCLATH          ;If so, increment PCLATH and
                CALL    Table2          ;Jump to the data table
                .
                .

Table2          MOVWF   PCL             ;W contains low program counter
                                        ;byte and points to next location
                                        ;plus Counter offset
                RETLW   'D'
                RETLW   'a'
                RETLW   't'
                RETLW   'a'
                  |
                RETLW   0               ;End of message

© 2002 Sirius microSystems