英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流

 找回密码
 立即注册
搜索
电子烟方案单片机单片机开发深圳单片机开发
单片机方案国产单片机8位单片机电子烟方案开发
查看: 4435|回复: 0
打印 上一主题 下一主题

PIC查表程序

[复制链接]
跳转到指定楼层
1#
发表于 2009-5-21 13:30:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在几乎所有的参考书中PIC查表程序的精典写法如下:
     movlw high(TABLE)
     movwf PCLATH        ;设定入口PC高位
     movf  index,w       ;取表的索引
     call  TABLE         ;查表并返回
;表定义
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条指令
SetTblL  Macro
         addlw    low($+4)
         skpnc
         incf    PCLATH,f      ;考虑进位
         movwf    PCL           ;修改PC,进入索引处
    endm

;查表程序
         SetTblH  TABLE    ;宏指令
         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 下一条

小黑屋|公司首页|Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 ( 粤ICP备09008620号 )

GMT+8, 2024-12-25 22:34 , Processed in 0.047985 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表