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]