PIC系列单片机程序设计基础四
发布时间:2008/5/27 0:00:00 访问次数:404
下面的例子对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
下面的例子对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
上一篇:PIC单片机程序设计的基本格式
上一篇:PIC系列单片机程序设计基础三