PIC单片机16F84的内部硬件资源(二)
3 数据存储器在单片机 PIC16F84 中,除了有存放程序的程序存储器外,还有数据存储器。单片机在执行程序过程中,往往需要随时向单片机输入一些数据,而且有些数据还可能随时改变。在这种情况下就需用数据存储器。由于数据存储器不但要能随时读取存放在其各个单元内的数据,而且还需随时写进新的数据,或改写原来的数据。因此,数据存储器需由随机存储器 RAM 构成。RAM 存储器在断电时,所存数据随即丢失,这在实际应用中有时会带来不便。
但是,在 16F84 中有 64×8 位 E2PROM 数据存储器。存放在 E2PROM 中的数据在断电时不会丢失。 16F84 中的 RAM 数据存储器如表 1 所示,该 RAM 分为两个存储体:即存储体 0(Bank0)和存储体 1(Bank1)。每个存储体均可以直接用内部总线传送信息,所以它们都是以寄存器方式工作和寻址。这些八位寄存器,又可分为通用寄存器和专用寄存器两个部分。通用寄存器存放数据,专用寄存器存放控制单片机运作的信息。
每个存储体最大可扩展到 7FH(128 个字节)。在每个存储体中,专用寄存器被安排在低位地址空间,通用寄存器被安排在高位地址空间。 通用寄存器用法单一,但专用寄存器却各有各的用处,现将较基本的专用寄存器作一简单介绍。
(1)程序计数器(PCL、PCLATH)。程序计数器 PC 是对程序进行管理的计数器。PIC16F84 的程序计数器为 13 位宽,最大可寻址的存储空间为 8k×14 位。实际上 16F84 只使用前 1k×14 位(0000~03FFH)存储空间。因程序计数器有 13 位宽,而专用寄存器只有 8 位。因此 PC 由两个专用寄存器构成。其低八位 PCL 是一个可读/写寄存器(地址为 02H 或 82H),而高字节 PCH(有效位 5 位)不能直接进行读/写操作,它是通过一个 8 位的保持寄存器 PCLATH(地址为 0A 或 8AH)把高 5 位地址传送给程序计数器的高字节。当执行 CALL、GOTO 指写 PCL 时,PC 值的高字节就从 PCLATH 寄存器中装入。
(2)状态寄存器 STATUS。状态寄存器 STATUS 含有算术逻辑单元 ALU 运算结果的状态(如有无进位等)、复位状态及数据存储体选择位。有关位位的设定如表 2 所示,功能如下:
1)第 0 位。进位/借位位 C。执行加、减运算指令表 2 IRP RP1 RP0 TO PD Z DC C 后,若结果有进位或借位,则 C 被置 1,否则置 0。在执行移位指令时,也要用到这一位。
2)第 1 位。辅助进位/借位位 DC。执行加、减运算指令后,若结果的低四位向高四位有进位或借位,则 DC 置 1,否则置 0。
3)第 2 位。零标志位运算结果为零,Z 被置 1;运算结果不为零,Z 被清零。
4)第 3 位。低功耗标志位 PD。上电复位或执行 CLRWDT 指令后置 1,执行 SLEEP 指令后被清零。
5)第 4 位。定时时间到标志位 TO。上电复位或执行 CLRWDT、SLEEP 指令后被置 1,监视定时器的定时时间到被清零。
6)第 5 位和第 6 位(RP0、RP1)。这两位是用于直接寻址时的寄存器体选择位。即 00——选中 Bank0(00H~7FH);01——选中 Bank1(80H~FFH),16F84 只有两个存储体。故 10、11 不用。
7)第 7 位 IRP。这是间接寻址的寄存体选择位。0——选中 Bank0、1(00H~FFH),1——选中 Bank2、3。16F84 只有 Bank0、1,所以此 IRP 位应被置为 0。
(3)间接寻址 INDF 和 FSR 寄存器 INDF 寄存器不是一个物理寄存器,而是一个逻辑功能的寄存器(地址为 00H 或 80H),当对 INDF 寄存器进行寻址时,实际上是访问 FSR 寄存器内容所指的单元,即把 FSR 寄存器作为间接寄存器使用。FSR 称为“寄存器选择”寄存器,地址为(04H 或 84H)。对 INDF 寄存器本身进行间接寻址访问,将读出 FSR 寄存器的内容,例如当 FSR=00H 时,间接寻址读出 INDF 的数据将为 00H。用间接寻址方式写入 INDF 寄存器时,虽然写入操作可能会影响 STATUS 中的状态字,但写入的数据是无效的。