英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流
标题:
PIC单片机编程漫谈(二)关于PAGE和BANK
[打印本页]
作者:
winnie
时间:
2009-5-27 09:57
标题:
PIC单片机编程漫谈(二)关于PAGE和BANK
仔细观察
PIC
汇编语言指令的格式,一条完整的汇编语言指令语句通常是这样的:
标号
操作码助记符
操作数
1
,
操作数
2
;
注释
。其中,主体部分是‘
操作码助记符
操作数
1
,操作数
2
’。
例如:
指令:
MOVF
33
,
1
操作码助记符:
MOVF ;
操作数
1:33 ;
操作数
2:
1 ;
而在程序被编译时指令语句的主体部分会被转换为代码的形式,通常是:
指令代码
操作数
2
操作数
1
。
例如在指令位数为
14
位的中档
PIC
单片机中:
指令:
MOVF
33
,
1
转换后代码:
00 1000 1
011 0011
其中指令代码为:
00 1000(MOVF f,d=00 1000 dfff ffff);
操作数
2:
1 (d = 1);
操作数
1:011 0011 (f = 33H) ;
可以看到,由于指令代码占用了
6
位,再加上操作数
2
占用的
1
位,分配给操作数
1
的只有
7
位了。也就是说操作数
1
最大只能是‘
111 1111
’(
7FH
),因此‘
MOVF
’直接的寻址范围只能是
00H~7FH
之间。其它的对寄存器操作的指令情况基本相同,因此指令位数为
14
位的
PIC
单片机将每
125
个(
00H~7FH
,
80H~FFH
……依此类推)寄存器划分为一个
BANK
,并且将
STATUS
寄存器的
RP1
、
RP0
为定为
BANK
设置位。在编写程序时,要对某个寄存器进行操作就首先要对
BANK
的设置位进行设置,从而切换到该寄存器所在的
BANK
。
例如
PIC16F877
的
EECON1
寄存器(地址
18CH
)就要通过设置
BANK的形式来寻址了,这时寻址的地址数据是这样组成的‘
BANK值
+
操作数
1
’,其中‘
BANK
值’
=
‘
RP1 RP0
’。
举个例子来说:
指令:
BSF EECON1
,
1 ;
指令转换后代码:
0101
001
000 1100
;
这时如果‘
BANK
值’
=3
,寻址的地址数据就会是‘
11
+
000 1110
’(
18CH
);而此时如果
BANK
值为
0
,则寻址的地址数据就会是‘
00
+
000 1110
’(
0CH
),这样就出现了错误。
用同样的方法我们可以分析
PIC
的
PAGE
的设置。举个例子,
PIC16C5X
的一个页面是
512
条指令。它的‘
GOTO
’指令是这样的:‘
101
k kkkk kkkk
’(‘
GOTO
’指令没有操作数
2
)。我们看到该指令的操作数
1
最大只能是‘
1 1111 1111
’(
1FFH
),因此在指令位数为
12
位的
PIC16C5X
芯片中‘
GOTO
’指令只能在
512
条指令(
000H~1FFH
,
200H~3FFH
,……)的范围内直接跳转。同样的理由,
PIC16C5X
的‘
CALL
’指令(‘
1011
kkkk kkkk
’)只能调用
256
条指令(
000H~0FFH
,
200H~2FFH
,……)范围内的子程序,因此在进行
PIC16C5X
的编程时要将供调用子程序的入口放在前半页面。
而在指令位数为
14
位的
PIC16F87X
单片机中‘
GOTO
’指令代码是‘
101
kkk kkkk kkkk
’,而‘
CALL
’的指令代码是‘
100
kkk kkkk kkkk
’,它们的寻址范围都是‘
111 1111 1111
’(
3FFH
)。因此在
PIC16F87X
单片机中,一个页面长度就是
3FFH=2048
条指令(
2K
)。而且在使用中,使用‘
CALL
’指令时就不需要将子程序入口放在上半页面了。
欢迎光临 英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 (http://enroobbs.com/)
Powered by Discuz! X3.2