位置:51电子网 » 技术资料 » 单 片 机

PIC系列单片机程序设计基础四

发布时间:2008/5/27 0:00:00 访问次数:404

http://www.hificat.com

当芯片上电reset后,f4的bit6,bit5是随机的,非上电的reset则保持原先状态不变。

   下面的例子对bank1和bank2的30h及50h寄存器写入数据。

   例1.(设目前体选为bank0)
       bsf   4,5    ;置位bit5=1,选择bank1
       movlw  data
       movwf  10h    ; data→30h
       bcf   4,5
       bsf   4,6   ;bit6=1,bit5=0选择bank2
       movwf  10h    ;data→50h

   从上例中我们看到,对某一体(bank)中的寄存器进行读写,首先要先对f4中的体寻址位进行操作。实际应用中一般上电复位后先清f4的bit6和bit5为0,使之指向bank0,以后再根据需要使其指向相应的体。

   注意,在例子中对30h寄存器(bank1)和50h寄存器(bank2)写数时,用的指令“movwf 10h”中寄存器地址写的都是“10h”,而不是读者预期的“movwf 30h”和“movwf 50h”,为什么?

   让我们回顾一下指令表。在pic16c5x的所有有关寄存器的指令码中,寄存寻址位都只占5个位:fffff,只能寻址32个(00h—1fh)寄存器。所以要选址80个寄存器,还要再用二位体选址位pa1和pa0。当我们设置好体寻址位pa1和pa0,使之指向一个bank,那么指令“movwf 10h”就是将w内容置入这个bank中的相应寄存器内(10h,30h,50h,或70h)。

   有些设计者第一次接触体选址的概念,难免理解上有出入,下面是一个例子:

   例2:(设目前体选为bank0)
       movlw  55h 
       movwf  30h   ;欲把55h→30h寄存器
       movlw  66h
       movwf  50h   ;欲把66h→50h寄存器

   以为“movwf 30h”一定能把w置入30h,“movwf 50h”一定能把w置入50h,这是错误的。因为这两条指令的实际效果是“movwf 10h”,原因上面已经说明过了。所以例2这段程序最后结果是f10h=66h,而真正的f30h和f50h并没有被操作到。

   建议:为使体选址的程序清晰明了,建议多用名称定义符来写程序,则不易混淆。   例3:假设在程序中用到bank0,bank1,bank2的几个寄存器如下:

bank0
地址
bank1
地址
bank2
地址
bank3
地址
a
10h
b
30h
c
50h
·
70h
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·

       a   equ  10h   ;bank0
        b   equ  10h   ;bank1
        c   equ  10h   ;bank2
          ┋
        fsr  equ  4
        bit6  equ  6
        bit5  equ  5
        data  equ  55h
          ┋
        movlw  data
        movwf  a  
        bsf

http://www.hificat.com

当芯片上电reset后,f4的bit6,bit5是随机的,非上电的reset则保持原先状态不变。

   下面的例子对bank1和bank2的30h及50h寄存器写入数据。

   例1.(设目前体选为bank0)
       bsf   4,5    ;置位bit5=1,选择bank1
       movlw  data
       movwf  10h    ; data→30h
       bcf   4,5
       bsf   4,6   ;bit6=1,bit5=0选择bank2
       movwf  10h    ;data→50h

   从上例中我们看到,对某一体(bank)中的寄存器进行读写,首先要先对f4中的体寻址位进行操作。实际应用中一般上电复位后先清f4的bit6和bit5为0,使之指向bank0,以后再根据需要使其指向相应的体。

   注意,在例子中对30h寄存器(bank1)和50h寄存器(bank2)写数时,用的指令“movwf 10h”中寄存器地址写的都是“10h”,而不是读者预期的“movwf 30h”和“movwf 50h”,为什么?

   让我们回顾一下指令表。在pic16c5x的所有有关寄存器的指令码中,寄存寻址位都只占5个位:fffff,只能寻址32个(00h—1fh)寄存器。所以要选址80个寄存器,还要再用二位体选址位pa1和pa0。当我们设置好体寻址位pa1和pa0,使之指向一个bank,那么指令“movwf 10h”就是将w内容置入这个bank中的相应寄存器内(10h,30h,50h,或70h)。

   有些设计者第一次接触体选址的概念,难免理解上有出入,下面是一个例子:

   例2:(设目前体选为bank0)
       movlw  55h 
       movwf  30h   ;欲把55h→30h寄存器
       movlw  66h
       movwf  50h   ;欲把66h→50h寄存器

   以为“movwf 30h”一定能把w置入30h,“movwf 50h”一定能把w置入50h,这是错误的。因为这两条指令的实际效果是“movwf 10h”,原因上面已经说明过了。所以例2这段程序最后结果是f10h=66h,而真正的f30h和f50h并没有被操作到。

   建议:为使体选址的程序清晰明了,建议多用名称定义符来写程序,则不易混淆。   例3:假设在程序中用到bank0,bank1,bank2的几个寄存器如下:

bank0
地址
bank1
地址
bank2
地址
bank3
地址
a
10h
b
30h
c
50h
·
70h
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·

       a   equ  10h   ;bank0
        b   equ  10h   ;bank1
        c   equ  10h   ;bank2
          ┋
        fsr  equ  4
        bit6  equ  6
        bit5  equ  5
        data  equ  55h
          ┋
        movlw  data
        movwf  a  
        bsf

相关IC型号

热门点击

 

推荐技术资料

硬盘式MP3播放器终级改
    一次偶然的机会我结识了NE0 2511,那是一个远方的... [详细]
版权所有:51dzw.COM
深圳服务热线:13751165337  13692101218
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式


 复制成功!