"); //-->
MPLAB中有条非常有用的伪指令:BANKSEL可用它来快捷设置 BANK 而不用 STATUS 的 RP0 ,RP1去具体的设置BANK 。
BANKSEL ****,通常只改变STATUS,RP1,RP0,而RP1,RP0仅仅对 直接寻址 有效
但BANKSEL不会改变STATUS,IRP,也就是说,BANKSEL的页选择对 间接寻址 是没有用的.
以877A为例,如果你的寻址目标在BANK1,那么你设置BANKSEL BANK1,这样直接,间接寻址都有效
但如果你的寻址目标在BANK3,而用BANKSEL BANK3设置页地址,此时直接寻址有效,但间接寻址就会出错,因为BANKSEL不能改变STATUS,IRP
编译是能通过的,没问题,即便你不设置BANKSEL,编译也照样能通过,如果你用BSF(BCF) STATUS,RP0(RP1)语句编译并烧录后,程序能正常运行,而用BANKSEL BANK*,编译并烧录,而程序却不能通过,这样的问题才是古古怪怪的问题,那我也没办法.
我有一个大程序,开始能通过,后来因为扩展,将原来BANK1上定义的寄存器改为BANK2,对应的页设置也仅仅是用BANKSEL BANK3,编译照样能通过,运行时就麻烦了.后来在每个BANKSEL BANK*的语句后面紧跟一句BSF(BCF) STATUS,IRP.如果要返回BANK0时,全部用CLRF STATUS(或者同时将IRP,RP1RP0)三个位清0
PUSH_MACRO MACRO
MOVWF W_TEMP
SWAPF STATUS,W
MOVFW STATUS_TEMP
ENDM
POP_MACRO MACRO
SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
ENDM
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。