INDF寄存器的缩写是什么的缩写?

VIP专享文档是百度文库认证用户/机構上传的专业性文档文库VIP用户或购买VIP专享文档下载特权礼包的其他会员用户可用VIP专享文档下载特权免费下载VIP专享文档。只要带有以下“VIP專享文档”标识的文档便是该类文档

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取非会員用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档

付费文档是百度文库认证用户/机构上传的专业性文档,需偠文库用户支付人民币获取具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档

共享文档是百度文库用戶免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定只要带有以下“共享文档”标识的文档便是该类文档。

原标题:PIC单片机基础知识之二

[PIC单爿机基础知识之二]PIC中档单片机的寻址模式BANK/PAGE相关

1)操作对象寻址 -9位(512字节)寻址范围

在基础知识之一里面介绍了长字指令,一条PIC16的指令昰一个14位的长字这个长字的前半部分是指令的操作码,

后半部分则是指令所需要操作的对象地址或者操作数如下面的图示:

在这里,湔面的000111就是ADDWF的操作码d是destination的缩写,表示运算的结果放到哪里去如果逗号后面是0,则结果放到W里如果逗号后面是1,则结果放到所操作的寄存器的缩写REG里你看到这条指令逗号后面不是0或1,而是W或F这是编译器认识的一种写法,和写0或1等同主要是为了方便阅读,建议初学鍺从一开始就养成习惯逗号后面不要写0或1。接下来说到和寻址相关的部分就是指令的后面7位,这7位就是你所要操作的寄存器的缩写REG的RAM

哋址我们知道7位的地址只能访问2的7次方,也就是128个字节的单元;但是PIC中档单片机的RAM最多有512个字节怎么办呢?只能从其他地方另外设置兩位的地址来凑成9位地址这样才能访问到所有的RAM。

所借用的这两位就是STATUS里的RP1和RP0位,这两位将作为9位地址的最高两位于是,当我们需偠对某个RAM进

行操作的时候因为指令里只描述了全部地址的低7位,所以我们必须在这条操作指令之前先把9位地址的高两位

设置好,这个高两位的设置就是很多初学者感到不适应的BANK概念。因为高两位有4种组合所以就分成了4个

BANK。但是要说明并不是所有的型号都有512个字节嘚RAM,部分型号的RAM较少可能只有两个BANK或者只有一个BANK。

我们再通过图示来理解一下具体的寻址过程

|高2位地址| 低7位地址 | 这是CPU访问RAM时用的实际地址

要明白的是STATUS里面的两位,你不去设置它它是不会自动改变的,所以如果你要访问某个不在BANK0,比如某个寄存器的缩写在90H地址你就需要先设置STATUS里面的RP0位到1,然后再用指令操作该寄存器的缩写才能正确操作。如果

不先设置则很有可能操作错误地址的RAM。通常表现为:汸真时发现我用指令操作这个寄存器的缩写,怎么仿真结果上寄存器的缩写没有任何改变这时,你首先需要查的就是BANK对不对。

你可能会说天啊,为什么搞这么麻烦!

我们可以理解如果把指令字里的f地址位放到更长,就可以访问更长的地址范围但是,这样指令字長了也就增加

了单片机的硬件成本缩短指令字长度,增加了一点麻烦但这也是一种折中的选择。

当然编译器也充分考虑了因为设置BANK帶来的麻烦,提供了BANKSEL宏指令BANKSEL是BANK Select的缩写,就是

选择BANK的意思用法如下:

如果你要访问某个寄存器的缩写ABC

编译器在扫描到BANKSEL宏指令时,会自动查询ABC所在的BANK然后把该宏指令编译成相应的设置STATUS里面RP1和

RP0位的指令。这就省了你自己去查的步骤要说明的是,当你对BANK理解深入或者程序写唍了之后也要适当看看

这些BANKSEL指令,因为很有可能很多BANKSEL指令都是多余的(比如连续操作的寄存器的缩写都在同一个BANK)这时可适当地删掉┅些以缩减代码。

总结一下BANK的概念,被很多初学者诟病上面说明了它的原理以及为什么要这样,其实等你熟悉了PIC的汇编编

程之后不會觉得BANK有什么大的麻烦的,适应了就好

和前面的指令里直接描述对象地址的寻址模式完全不一样,它是间接的

间接寻址使用一个地址指针寄存器的缩写FSR,FSR是一个8位的寄存器的缩写当FSR指向某地址时,你对INDF寄存器的缩写进行操作

就是对FSR所指向的地址操作。举个例子:

如果FSR的值为0x80你执行 MOVWF INDF这条指令,就是把W的值传送到0x80地址的RAM这里要强调一点,INDF这个名字的寄存器的缩写在物理上是不存在的,INDF的意思就是FSR所指向的RAM单元。

再来看下面的一段代码:

btfss FSR,7;测试FSR里的值有没有超过7F如果超过,跳过一条指令这个不用解释了吧。

上面是一段经典的使鼡间接寻址的把RAM初始化为0的小程序。在这里插入一个小常识单片机在上电时,内部的

通用RAM(非特殊功能寄存器的缩写)里的值并不昰软件模拟或者仿真时那样都是00,而是随机值所以,单片机程序的起始部分用到的变量一定要记得初始化,或者干脆就先象上面这段程序一样用几行指令就可以把一段RAM清零。

前面说到了FSR是8位的问题又来了,PIC中档单片机最多有512个字节的RAM而8位的地址最多只能访问256个字節,怎么办还是和上面一样,要另外借助一位作为9位地址的最高位这个位就是STATUS寄存器的缩写里的IRP位。

|最高位| 低8位地址 | 这是CPU访问RAM时用的實际地址

所以和前面说到的BANK概念一样,当你要用间接寻址访问超过256个字节地址范围的RAM时要先设置STATUS寄存器的缩写里的IRP位。同样地编译器也提供了BANKISEL宏指令,编译器会把BANKISEL宏指令翻译成相应的设置IRP位的指令用法和BANKSEL相同,不再赘述相信大家都能触类旁通的。

这个就简单很多就是当你使用立即数操作指令时,(如MOVLW xxHADDLW xxH,RETLW xxH等指令)14位的指令长字的后面8位就是你所要操作的立即数这里不多说了,不过介绍一点特殊用法

你可能会看到这样的指令:

3)程序寻址/程序跳转

前面介绍的都是RAM的寻址,接下来介绍程序空间的寻址

PC的绝对寻址就是使用CALL或者GOTO指令来改变PC(程序指针)。

这里先介绍一下PCPIC中档单片机的程序空间最大为8K指令字,那么它的PC长度为13位(自己去算啊)由于是8位单片机,所以这13位分成两个字节PCH和PCL,PCH里是高5位PCL里是PC的低8位。当程序顺序执行的时候PC会自动加一,当然PCL发生进位的时候PCH也会加一当PCH和PCL都溢絀时回零,整个PC就回到程序起始地址0x00

好了,回到PC绝对寻址我们来看一下CALL指令的机器码

这里的100就是CALL指令的操作码,后面11位的k就是Sub_1标号處的PC值。问题又来了只有11位,2的11次方只有2K那么CALL只能调用2K地址范围内的子程序吗?PIC中档不是最大有8K程序空间吗怎么办?还是一样不夠就找地方来凑。这次不能找STATUS寄存器的缩写了老是找它也不好意思的,呵呵玩笑。针对PC的问题有一个专门的寄存器的缩写,叫做PCLATHPCLATH昰 PC High的缩写,顾名思义这个寄存器的缩写,是PC的高位(也就是PCH)的锁存器当你使用CALL或者GOTO指令时,因为指令长度有限指令里描述的地址呮有11位,那么高2位就借助于PCLATH的D4和D3位,这就是PAGE一样的,你必须先设好这两位才能使用CALL或者GOTO指令两位可以有四种组合,所以8K的程序空间汾成了4个2K的页和上面介绍BANK时的原理相同,不再画图表了

我们来看一个具体的过程。假设你现在要CALL一个在PAGE1的子程序那么高2位应为 0 1,你必须在执行CALL指令之前设置好来看下面的示意图。

V 这里的11位的k来自于CALL指令

所以当你的程序超过一页(2K)的时候,执行CALL或GOTO指令之前你必须清楚你要调用或者跳转的地方是在那个页,相应地要设置PCLATH的d4d3位也就是设置PAGE。同样地编译器也提供了一个宏指令给你方便,当你不想詓查或者不确定要CALL或者GOTO的地方是哪个页时可以使用宏指令PAGESEL。

用法假如你要调用子程序Sub_1,而你又不确定它是在那个PAGE时

PC的高位字节PCH是不可甴程序直接写入的它必须是在PC改变时通过它的锁存器PCLATH装入。

PCLATH始终是作为装载PCH用的一个锁存器它自己的值不会随着PCH的改变而改变。一个佷简单的例子程序假如顺序执行从00一直到8K末尾,这样PCH的最高两位也就从00一直变成11但PCLATH的高两位,如果你没有人为改变原来是什么它还昰什么。(很多人犯的一个误解:当前PC在PAGE1调用PAGE1里的子程序就不用设置PAGE了)

当CALL子程序时,CALL指令当前PC+1的13位PC地址压入堆栈(因为硬件堆栈是和PC等宽的)所以RETURN时能从堆栈弹出整个13位PC的返回地址,就不再需要设定PCLATH了但是,要记住不设定并不代表它自己会改变。假设你CALL之前设定箌Page1了Return之后回到Page0了,但此时PCLATH里的4:3位还是0:1。

PAGE的概念一样也是很多初学者不适应的地方,通常没有注意PAGE会出现“我明明是要跳转到这个地方怎么跑到别的地方去了?”这样的情况此时赶紧观察一下PCLATH的值,看看有没有忘记设置总之,等你熟悉了换页也就没有什么不习慣的。

简而言之就是通过计算让程序基于当前的PC值做相对的跳转,例如把PC加上某个值而跳转到另一个地方如:

执行该指令直接修改PC时,PCLATH里面的5位会在瞬间装入PCH(请一定要理解PCH为什么要锁存器PCLATH,如果没有锁存器你如果能用1条指令同时修改两个寄存器的缩写PCH和PCL呢?)如丅图示:

所以在做PC相对寻址前,一定要先确认PCLATH里的值正确还记得前面的MOVLW指令吗,可以在这时用哦

RETLW 0x00 ; 如果W的值为0,从这里返回一个值為什么?自己体会还记得流水线概念吗?

这是一个典型的使用PC相对寻址来做查表程序的例子实际使用时,如果PCLATH没注意设置表现就是PC跑飞。另外要注意的是W和PCL相加不能溢出,如果表太大必然溢出的话可以先试运算,然后按进位与否来改变PCLATH

还有,如果开了中断现場保护里要注意保护PCLATH,如果不保护假如恰好在ADDWF PCL,F执行之前进中断了,中断里又改变了PCLATH(极有可能如切换页),等中断返回之后就会造成PCLATH錯误从而PC跑飞曾经,因为某个

应用笔记的错误导致了一个说法,说“PIC在查表时必须关中断”就是因为没有注意保护PCLATH这个错误而产生嘚,后来一些中文书里面也引用了这个说法我在这里再次说明,“查表时必须关中断”是一个错误的说法希望不要

再次强调:PCLATH是个很偅要的寄存器的缩写,你对它稍不注意它就会让你跑飞!

我要回帖

更多关于 寄存器的缩写 的文章

 

随机推荐