winnie 发表于 2009-5-21 13:30:37

PIC查表程序

在几乎所有的参考书中PIC查表程序的精典写法如下:
   movlw high(TABLE)
   movwf PCLATH      ;设定入口PC高位
   movfindex,w       ;取表的索引
   callTABLE         ;查表并返回
;表定义
TABLE
   addwf PCL,f         ;修改PC,按w的值相对跳转
   retlw 0             ;表中的内容
   retlw 1
   retlw 2
   retlw 3
   ...
上述表体定义时有一关键点是指令“addwf PCL,f”的运算结果不能有进位发生!这样对编程人员提出一个要求就是表的位置不能随意放置,一般不要太靠近地址0x??00。想必很多PIC应用者有此体会。
看看下面的做法,可以免除表体放置时位置的束缚。
为方便程序的管理,先定义两个宏:
;设定表体入口处的PC高位
;表体入口为第一条"retlw"指令处
SetTblH    Macro    _mTblPcH
    movlw    high(_mTblPcH+4)
    movwf    PCLATH
    endm
;设定表体索引处的PC低位   
;比简单的"ADDWF PCL,f"多花3条指令
SetTblLMacro
         addlw    low($+4)
         skpnc
         incf    PCLATH,f      ;考虑进位
         movwf    PCL         ;修改PC,进入索引处
    endm

;查表程序
         SetTblHTABLE    ;宏指令
         movf    index,w
         call    TABLE
;表定义
TABLE
         SetTableL         ;宏指令
         retlw    0x00
         retlw    0x01
         retlw    0x02
         retlw    0x03
         retlw    0x04
         retlw    0x05
         retlw    0x06
         retlw    0x07
         retlw    0x08
         retlw    0x09
         retlw    0x0a
         retlw    0x0b
         retlw    0x0c
         retlw    0x0d
         retlw    0x0e
         retlw    0x0f
         ...
这样做后,表可以放在代码区的任意位置,最长可以到256(0-255)个索引,对程序编排带来了方便,也有利于日后程序扩充和维护。
注意,此法对16C5x系列不适用,5X系列查表一定要放在前半页。
页: [1]
查看完整版本: PIC查表程序