—— —— —— 技术资料下载中心

>> PIC单片机原理 \

PIC16C84单片机介绍
概述 PIC16C84是8位CMOS EEPROM微控制器。它有高性能的类似于RISC 的指令，共有35条单字节的指令，所有的指令除程序分支指令需要两个指令周期外，都只需要一个指令周期。当主振频率为10MHZ时一个指令周期为400ns。程序指令的宽度为14位，在芯片内有1K×14的EEPROM程序存储器 。 数据的宽度为8位，在芯片内有36×8的静态RAM的通用寄存器，64×8的EEPROM的数据存储器。8级深度的硬堆栈。具有直接、间接、相对寻址方式。有4个中断源；外部RBO／INT引脚；TMRO计时器溢出，PORTB＜7： 4＞引脚上信号的改变；数据写入EEPROM完成。

数据存储器的擦／写可达1000000次，数据的保持大于40年。有13位的I／O引脚，可以单独直接控制。每一个I／O引脚均可承受25mA的输入／输出电流，这样就可以直接驱动LED。有8位的计时／计数器（TMRO）并带有8位可编程的预分频。有通电复位（POR）；功耗上升（POWER－UP）计时器（PWRT）； 振荡器起动计时器（OST）；看门狗计时器（WDT），为了能可靠工作 ，它有自己的RC振荡器。有代码保证功能。有SLEEP（睡眠）方式，以节者功耗。有4种可供选择的振荡器：RC（低成本的RC振荡器）；XT（标准的晶体／谐振器）；HS（高速晶体／谐振器）；LP（低功耗，低 频率的晶体）。工作电压的范围宽2．0V～ 6．0V。

PIC16C84最大的特点是具有1K×14位的电可擦除的程序存储器和64×8位的电可擦除的数据存储器，这将为系统开发和各种应用提供了 更多的方便。

时钟和指令周期

从OSCI来的时钟输入在内部经4分频。产生互不叠加的时佛周期，每4个时钟周期（θ1，θ2，θ3，θ4）组成一个指令周期。在内部、程序计数内对每一个θ1加1，然后从程序存储器取指令，取出的指令在θ4时放入指令寄存内。在下一个θ1利θ4期间指令被执行。取指令和执行指令采用流水线技术，一个指令周期取指令，下一个指令周期执行已取出的指令，同时又取出下一条指令。所以每条指令执行，CPU的时间是一个指令周期。当某条指令要改变程序计数器的 内容时（如分支指令），则需要两个指令周期才能完成。被取出的指 令在执行指令周期的θ1时放入指令寄存器，在θ2，θ3，θ4时译码 并执行指令。在θ2期间读操作在θ4期间写操作数。

存贮器的结构

在PIC16C84中有两个存储器块。即程序存储器和数据存储器。每一块具有它自己的总线，即可在同一时钟周期访问每一块。数据存储器被进一步分成通用RAM和专用功能寄存器（SFRs）。专 用功能寄存器用于控制外设模式。数据存储器也包含有数据EEPROM存 储器。这个存储器并不直接映象到数据存储器，而是间接映象的。即由一个间接寻址的指针指明要读／写的数据EEPROM的地址。64个字节 的数据EEPROM具有的地址是0～3FH。

3－1程序存储器的结构

PIC16C84具有13位程序计数器，寻址能力为8K×14位的程序存储器空间。实际上对于PIC16C84能供使用的只有1K×14位的程序存储器（地址为0000～ 03FFH）。寻址上述单元，如超过了上述地址范围， 地址将卷绕。例对20H单元与地址420H，820H，C20H，1020H，1420H， 1820H，1C20H都将访问到它。系统复位时PC的值为0000H，中断向量是 0004H。

PC＜12：0＞

CALL，RETURN 13

RETFIE，RETLW 1级堆栈

．

8级堆栈

复位地址 0000H

外部中断向量 0004H

用户存贮空间 3FFH

1FFFH

图4－2程序存储的映象和堆栈

3－2数据存储器的结构

数据存储器被分成两个区域。第一个是专用功能寄存器（SFR）区域，第二是通用寄存器区域（GPR）。SFR控制着器件的操作。数据存储器被分成0块和1块。通过程序时状态寄存器STATUS中的RP1： RP0位 的设置来选择0块（RP1＝0，RP0＝0）或1块（RP0＝1）。

其中带有斜线的部分是实际不存在的单元，带有＊号的单元没有物理寄存。指令MOVWF和MOVF可以把W寄存器的值（W寄存器是器件内部的工作 寄存器）传送到寄存器文件（“F”）中的任何单元，反之也可以。整个数据存储器可以直接寻址或通过文件选择寄存器（FSR）进行间接寻址。间接寻址要根据状态寄存器的RP1：RP0位的状态决定访问数据存 储器的某一块，数据存储器的两块中都被分成通用寄存器和专用寄存 器。其中每块低地址单元留作专用寄存器，专用寄存器以上地址的单 元为通用寄存器，它们是静态RAM。

1．通用寄存器文件 寄存器文件可以直接寻址或通过FSR间接寻址。所有器件都有一定 数量的通用寄存器（GPR），它们的数据宽度是8位。PIC16C84只有36个字节的通用寄存器，地址为0CH～ 2FH，对1块对应的8CH～ AFH的访问都将实际访问0CH～ 2FH（地址的高位被忽略）。

文件地址

00 间接寻址地址（＊） 间接寻址地址（＊） 80

01 TMRO OPTION 81

02 PCL PCL 8 2

03 STATUS STATUS 83

04 FSR FSR 8 4

05 PORTA TRISA 85

06 PORTB TRISB 86

07 87

08 EEDATA EECON1 88

09 EEADR EECON2（＊） 89

0A PCLATH PCLATH 8A

0B INTCON INTCON 8B

36个通用寄 映象到 存器（SRAM） 0块 2F AF 7F FF 0块 1块

2．专用功能寄存器

CPU和外设使用专用寄存器以控制器件的操作。专用寄存是静态RAM。下面介绍几个重要的专用寄存器

①状态寄存器

状态寄存器包含有ALU（复术逻辑运算单元）的算术状态，复位状态和对数据存储器的块选择，与任何寄存器一样，状态寄存器可以作为任何指令的目的寄存器。如果状态寄存器作为某指令的目的寄存器 ，而那条指令要影响Z、DC，C位的状态，则禁止写这三位。图4－4是 状态寄存器及其状态。

R／W R／W R／W R R R／W R／W R／W

IRP RP1 RP0 TO PD Z DC C bit7 bit0

其中C是进位位，对ADDWF和ADDLW指令，当这一位为1，表示指令 运算的结果的最高有效位产生了进位输出。减法指令执行的是加第二 操作数的新码。对于循环指令（RRF，RLF），这一位即可以来自于源寄存器的高位，也可以来自于低位。如果这一位为0，表明结果的最高有效位没有产生进位输出。对于减法，这一位的极性取反。DC是数字进位或数字借位位。当这一位为1时，结果的D3位向D4位有进位，否则无进位。对于减法，这位的极性取反。Z是结果为0标志。当这一位为1时，表明算术运算和逻辑运算的结果为0，否则这一位为0，表明运算结果不为0。PD：低功耗位。当这一位为1表明电源加上按正常供电或执行了C LRWDT指令以后，这一位为0表示执行了SLEEP指令（即器件进入了低功 耗状态）。TO超时位。当这一位为1时，表明电源加上，进入了正常供电，且执行了CLRWDT和SLEEP指令，这一位为0表明产生了看门狗计时器超时。

RP1：RP0，作为直接寻址的数据存储器的块选择位。

RP1：RP＝00状态，选择0块（地址00H～7FH）。

RP1：RP0＝01状态，选择1块（地址80H～FFH）。

RP1：RP0＝10选择2块（地址100H～17FH）。

RP1：RP0＝11选择3块（地址180H～1FFH）。

每块128个字节，PIC16C84只使用RP0位，RP1编程时设置为0。不允许使用RP1为通用读／写位，这可能影响与将来产品的兼容性。IRP寄存器块选择位（作为间接寻址），当这一位设置为0，选择 0．1块（地址00H～FFH），当这一位为1时，选择2．3块（地址100H～1FFH）。PIC16C84不使用IRP位，IRP位在编程时为0。状态寄存器中的Z、DC，C位是根据器件的逻辑来置1或清0。而TO，PD位是不可写入的。状态寄存器作为目的寄存器的指令的结果将有不同的内容。例如CLRF STATUS（清0状态寄存器）。结果状态寄存器的内容为000uuluu。其中u表示不改变。只有BCF，BSF，SWAPF和MOVW F这些指令可以用来改变STATUS寄存器的内容，因为这几条指令不影响任何状态位。

②OPTION寄存器

OPTION寄存器是可读，可写的寄存器，它包含了各种控制位以配 置TMRO／WDT的预分频器，外部INT中断，TMRO和在PORTB的微弱上拉。图4－5是OPTION寄存器各位的功能。 R／W R／W R／W R／W R／W R／W R／ W R／W

RBPU INTEDG TOCS TOSE PSA PS2 PS1 PS0 bit7 bit0

其中PS2，PS1，PS0为预分频器的值的选择。（与PIC16C6X的规定 相同）。PSA位是将预分频器分配给WDT（看门狗计时器，或TMR0）。

TOSE是为TMRO选择跳变信号

INTEDG是为INT中断引脚选择跳变信号。

RBPU用来打开或关闭PORTB内部的上拉电阻。

OPTION的所有位的定义同PIC16C6X系列。

③INTCON寄存器

INTCON是可读可写的寄存器，它包含了各中断源允许或禁止中断 。图4－6是PIC16C84的INTCON寄存器

R／W R／W R／W R／W R／W R／W R／W R／W

GIE EEIE TOIE INTE RBIF TOIF INTIF RB IF bit7 bit0

其中RBIF是RB端口改变中断标志位。此位为1，表明RB＜7：4＞输入中至少有一位发生了改变，它必须用软件清0这一位。否则为0，即 RB＜7：4＞输入中没有改变。 ? ? ? ? ? INTIF是外部中断标志位。当这一位为1时，表明有外部中断发生 ，它必须用软件将其清0，否则为0，表明没有外部中断发生。

TOIF是TMRO溢出中断标志。这一位为1，表明TMRO发生了溢出，必须由软件将这一位清0，否则为0，表明TMRO没有溢出发生

RBIE是RB端口改变中断的允许或禁止位，设置此位为1，允许中断，为0禁止。

INTE是INT中断的允许或禁止位。设置为1允许中断方式，为0禁止 。

TOIE为TMRO溢出中断的允许或禁止位。设置为1允许TMRO溢出中断，否则禁止。

EEIE是EE（电可擦除）的写完成中断的允许与禁止位。当设置为1时，允许EE写完成中断，否则禁止。

GIE是所有中断的允许与禁止。设置为1时，允许所有不可屏蔽中断，为0禁止。

四、PCL和PCLATH

程序计数器（PC）是13位。低字节PCL是可读，可写的寄存器。PC的高字节（PCH）不是直接可读，可写的。PCLATH（PC latch high） 是作为PC＜12：8＞的保持寄存器，这几位的内容被传送到程序计数器 的高位。当程序计数器在执行CALL，GOTO或写PCL等指令时，即向PC装入新的值。PC的高位由PCLATH装入。

具有8个13位宽度的硬件堆栈。堆栈空间它既不是程序存储器的一部分，也不是数据存储器的一个部分，堆栈的指针是不可读／写的。当执行CALL指令或中断被响应时，整个13位的PC被压入堆栈。在执行RETURN，RETLW，RETFIE等指令时，堆栈被弹出。PUSH（压入）和POP（弹出）不影响PCLATH。

堆栈是作为循环缓冲器。当堆栈被压入38次后，第9次压入将占据第一次压入的位置，第十次压入将占据第二次压入的位置，等等。同样当堆栈弹出第9次时，与第一次弹出是一样的。注意，没有状态位来 指明堆栈上溢式下溢的条件。没有PUSH，POP指令助记符，但CALL，R ETURN，RETLW，RETFIE等指令的执行或中断发生，将实际发生压栈退栈。

4－2程序存储器的页

PIC16C84具有1K的程序存储器，CALL，GOTO指令只有11位的地址范围，这11位的地址范围允许分支在2K程序存储器页大小的范围。

为将来PIC16C8X程序存储器的扩展，必须由另外两位来说明程序 存储器的页。这些页位来自于PCLATH＜4：3＞。当执行CALL、GOTO指令时，用户必须确保这些页位的编程等指向要求的程序存储器的页。

如果执行CALL指令，整个13位被压入堆栈。所以对于返回指令不要求 对PCLATH＜4：3＞位的管理。因为PC的值将会由退栈而获得。注意：PIC16C84忽略了PCLATH＜4：3＞位，这些位用于程序存储页1，2，3（0800H－1FFFH），不可以把PIC16C84的PCLATH＜4：3＞位用作通用读／写位，这会影响将来产品的向上兼容。

4－3间接寻址，INDF和FSR的作用

INDF寄存器不是物理寄存器，只是被用来与FSR寄存器连接以执行间接寻址。

使用INDF寄存器，就可以实现间接寻址。

使用INDF寄存器的任何指令，实际寻址数据是由文件选择寄存器（FSR）所决定的。读INDF自身（FSR＝0），将产生00H。向INDF写，结果无操作（显然可以提供状态位）。8位FSR寄存器同状态寄存器STATUS＜7＞（IRP）组合可以得到9位地址。

然而PIC16C84是不用IRP的。使用下面的例程序，通过间接寻址清零。2OH～2FH单位。

MOVLW 20H ；初始化RAM的指针

MOVF FSR ；到FSR

NEXT CLRF INDF ；通过间接寻址清0，由FSR的内容所指问的寄存器。

INCF FSR ；（FSR）＋1→FSR

BIFSS FSR，4；当FSR的第4位为1跳过下一条指令

GOTO NEXT ；否则入。

五 I／O端口

PIC16C84具有两个I／O端口，PORTA，PORTB。某些端口的引脚用来与另外一些功能复用。

5－1 PORTA和TRISA寄存器

PIC16C84的 PORTH是5位宽度的锁存器。RA4是施密特触发器输入，一个集电极开路输出。端口A的所有其它的引脚为TTL电平输入，含CMOS输出驱动。所有引脚有数据方向位（TRISA寄存器），可通过TRI SA来配置PORTA的引脚是输入式输出。设置TRISA的某位为1，则对应的 PORTA的位为输入，若设置为0，对应的PORTA的某位为输出。

读PORTA寄存器，读入引脚的状态，向PORTA写入，则写到PORTA的锁存器。所有的写操作都是读－－修改－－写操作。当向端口写时，它首先读端口引脚，然后修改其位，再写入端口的数据锁存器。下面这段程序是对端口A的初始化：

CLRF PORTA；初始化端口A

BSF STATUS，RPO；选择1块

MovLW CFH ；用于初始化数据方向的值

MOVWF TRISA；设置RA＜3：0＞为输入；RA＜5：4＞为输出 ；＜ 7：6＞总是为0（无用）

RA4是为TMRO的时钟输入复用。即如果这一位用作TMRO的时钟输入，则端口A就不能用RA4。

5－2 PROTB和TRISB寄存器

PORTB是8位宽度的双向端口。相应的数据由TRISB决定，方法用端口A。

端口B的每一个引脚都具有内部弱的上拉电阻。通过一个控制位可以打开所有上拉电阻。这可通过对OPTION＜7＞RBPU位的置1，清0来控制。当端口引脚配置成输出时，内部弱上拉电阻被自动关闭。上位是 端口需要的。PORTB的4个引脚RBT～RB4具有信号改变中断的功能，只要将这几个引脚配置为输入，就可能引起中断的发生。在输入方式下，引脚的位与最后一次读PORTB的值进行比较，这四个引脚中有任何一个或多个不相同，产生RBIF中端（置INTCON＜0＞）。这个中断可能将 器件由SLEEP状态下唤醒。用户在中断服务程序中可以用这样的两个方法之一来清除中断。①通过清0RBIE（INT CON＜3＞位）关闭中断，② 读端口B，则清0 RBIF位。

不相等的条件将继续配置1RBIF位为止。读PORTB将结束不相等条件，并允许RBIF被清0。这一特征为软件可配置上拉一起允许用户非常容易的使用PORTB作为键盘输入的接口。也就可以通过按键来唤醒系统。

注意：如果正在执行敛僮鳎琁／O引脚改变了信号，RBIF中断标志不可能被置成1。

建议用改变信号中断作为按键唤醒操作，PORTB只不用改变信号中断，建议不要用查询方式。图4－7是用端口作键盘接口的原理图其R1为ESD保护而新选择的电阻。使用此接口时，通过软件选择保持内部上拉，即RB4～RB7为高，设置为输入方式。RB0～RB3输出。任何键被按下，RB4～RB7的某一根线将改变从而产生中断。这个中断可以唤醒芯片，用这种方法可以节省计时器资源。

16个键

RB4 100

RB5

RB6

RB7

RB0

RB1

RB2

BR3

Rf

图4－7利用端口B的键盘接口图。

5－3 I／O编程的考虑

任何对端口的写操作，在内部都是读－修改－写。例如BCF，BSF 指令，先将寄存器读入CPU，执行位操作，将结果写回寄存器。例如对 PORTB执行BSF操作，首先将PORTB的8位读入CPU，在Bit5上进行BSF操 作，将这一位置1，将PORTB写回输出锁存器，如果这个时候PORTB的bit0用作输入引脚，则先将PORTB读入CPU，然后进行有关操作，结果写回PORTB的锁存器，并复盖了先前的内容，如果bit0一直保持在输入方式，这一操作是没有问题，但如果bit0在销后又改变成输出方式，数据锁存器的内容是未知的。

实际写I／O端口发生在一个指令周期的结束，而读一个I／O端口，其有效的数据必须在指令周期的开始就出现。因此，对一个I／O通道相断执行读，写操作，要考虑数据的可靠性。为此，应在这两条指令之间加入一条NOP指令就可以保证数据的可靠性。

六、计时器。

（TMRO）模式 TMRO计时／计数器模式具有如下特点：

·8位计时计数器

·可读，可写

·8位软件可编程的预分配器

·从FFH到00H产生溢出中断

·具有外部时钟的边沿选择

TMRO模式的简单框图与PIC16C6X系列相同。它可以经过清0 TOCs 位（即TION＜5＞）来选择计时器方式。在计时器方式，TMRO模式对每个指令周期加1（没有预分频器），如果对TMRO写操作，则计时器为加 （操作后两个周期被禁止。）

量TOCS为1（OPTION＜5＞）选择TMRO为计数器方式。这种方式下 TMRO将对RA4／TOCK1引脚上出现的上跳变或下跳变加1。清0TOSE（OPTION＜4＞）选择上跳变否则为下跳变。有关预分频器的使用与PIC16C6X系列相同。当TMRO在计时／计数器方式下其值由FFH到00H时产生溢出中断，这个溢出中断将置TOIF位为1。此中断可以TOIE位为0来屏蔽。要能再次产生中断，必须在中断服务程序中，通过软件使TOIF清0，TMRO中断不可以用来唤醒芯片。因为在SLEEP状态下，计时器是关闭的。

如何使用TMRO的外部时钟，外部时钟的同步问题，预分频器的使用等，参看PIC16C6X系列关于TMRO的技术性能。

七、数据EEPROM存储器

数据EEPROM存储器在满电源电压（VDD）时，正常操作期间是可读，可写的，这部分存储器不能直接映象到寄存器文件空间，只有通过专用功能寄存器经间接寻址来访问，有四个SFR用于读、写这些存储器，这些寄存器是EECON1；EECON2；EEDATA；EEDAR。

其中EEDATA用来保持8位的读／写数据。EEADR用来保持正在访问 的EEPROM单元的地址。PIC16C84具有64个字节的EEPROM，其单元的地 址范围是00H－3FH。

EEPROM允许一次读／写一个字节。一个字节的写入将自动擦除该单元，写入新的内容（在写入之前擦除）。EEPROM数据存储器是高 速率的擦／写周期，写入时间正常为10ms，由芯片的计时器控制。实 际写入时间与所加电压，温度，芯片等有关。严格的时间请参看芯片的AC说明。当器件是在代码保护时，只有CPU可以完成数据存储器的读 ／写。即器件的编程器的不再访问存储器（外部读／写被关闭）。

6 连接的考虑

因为模拟输入用了ESD保护，它们有反偏二极管连到VDD和VSS。这就要求模拟输入电压应在VDD和VSS之间。

如果模拟输入电压超过了最大值的0．6V以上的范围，二极管可能变为正向导通，如果输入电流超过了说明书上的规定，它可能破坏器件。有些时候把外部的RC滤波器加在输入信号上。要求选用的电阻R要保证总的信号源电阻不超过10K，任何在模拟信号上的其它的附加元件均应有非常小的漏电流。

7．变换功能

理论上A／D变换器的变换功能如下。

当模拟输入信号电压是1位L sb的电压时（或是VREF／256）第一次变换就发生。

8 A／D变换工作的流程图

表2－4 PIC16C74／73的A／D变换所涉及的寄存器

地址 名称 bit7 bit6 bit5 bit4 bit3 bit 2 bit1 bit0

0B／8B INTCON GIE PEIE

0C PIR1 ADIF

8C PIE1 ADIE

0D PIR2 CCP2IF

8D PIE2 CCP2IE

1F ADCON0 ADCS1 ADCS0 CHS2 CHS1 CHS0 GO／DONE ADON

9F ADCON1 PCFG2 PCFG1 PCFG0

除上述所例寄存器外，还有ADRES（地址1EH）用于存放A／D变换 的结果。PORTA（地址 05H）用于输入多路模拟信号，TRISA（地址85 H）用于设置PORTA的I／O方式，PORTE（地址09H）用于输入多路模拟信号，TRISE（地址89H）用于设置PORTE的I／O方式。

表2－5 PIC16C71的A／D变换所涉及的寄存器

地址 名称 bit7 bit6 bit5 bit4 bit3 bit 2 bit1 bit0

0B／8B INTCON GIE ADIE

08 AOCON0 ADCS1 ADCS0 CHS1 CHS0 GO ／DONE ADIF ADON

88 ADCON1 PCFG1 PCFG0

此外还涉及ADRES（地址09H），PORTA，TRISA等。。

U U U U U U U U U R／P R／P R／P R ／P R／P

－ － － － － － － － － CP PWRTE WDTE FOSC 1 FOSC0 bit 13 bit0

图4－10 PIC16C84的配置寄存器

7－3 写EEPROM数据存储器

与写EEPROM的数据单元、用户必须首先写地址到EEADR寄存器，再送数据到EEDATA，最后用户必须跟着一个专门的序列起动写。例如：下面这段程序是写EEPROM的程序。 ? ? BSF STATUS， RPO ；选择1块

BCF INTCON，GIE ；关闭所有INT中断

MOVLW 55H ；

MOVWF EECON2 ；写55H

MOVLW AAH；

MOVWF EECON2；写AAH

BSF EECON1，WR；置WR位为1，开始写

BSF INTCON，GIE；允许INT中断。

如果这个程序（即先写55H 到EECON2，再写AAH到EECON2，然后置 WK＝1）未跟有严格的时间，写将不能启动。我们建议在执行这几条指令期间关闭中断。

此外，EECON1中的WREN位必须选置成1，允许写。这样的机构防止 了因错误指令的执行而写数据EEPROM。用户在所有的时间应保持WREN位为0，除了当要热修改EEPROM以外。

写序列开始以后，清0WREN位不影响这次写周期。从开始设置，直到WREN＝1为止WR位将被禁止。当完成了写周期以后，WR位由硬件清0 。写完成中断标志EEIF被置1，EEIF必须由软件将其清0。注意数据EEPROM存储器E／W周期可能偶然超过10ms，为确保写周期的完成，用户使用的EE中断或查询WR位（EECON1＜1＞）。这两个均可用来判断写周 期的完成。

除了上述提到的防止错误的写数据EEPROM外，在电源刚加电期 间的72ms内也防止写EEPROM数据存储器。

八 CPU专门的特征

微控制器为其它处理器的区别是有专门的电路，这些电路涉及实时应用的需要。PIC16C84具有最大的系统可靠性，最低的价格，最少的外部元件，提供了低功能操作模式和代码保护。

PIC16C84具有看门狗计时器，此计时器只可经配置位来关闭，为了增加其可靠性，关闭它的RC振荡器。有两个计时器提供加电时需要的延时。振荡器起振计时器（OST）保持芯片在复位状态直到石晶稳定为止。另外一个是加电计时器（POWER－UP Timer（PWRT））它提供了 固定的72ms的延时。这样保证了器件复位以及电源的可靠供电，用了这两个计时器，使多数应用不需要外接复位电路。

SLEEP方式提供了低功耗方式。用户可经外部复位；看门狗计时器溢出；中断来唤醒芯片。

8－1配置位

配置位分为可编程的位，读作0，不可编程的位，读作1。通过可编程的位来选拔各种配置。这些位映象到程序存储器的2007H单元。注意地址2007H不等于用户程序存储器空间。事实上，它属于专门的测试 ／配置存储空间（2000H～3FFH），只有在编程时可以访问。图4－10 是配置寄存器的结构（附后）

其中Fosc＜1或0＞为振荡器选择位。

11：选RC振荡器

10：选HS振荡器

01：选XT振荡器

00：选CP振荡器

WDTE是看门狗允许与禁止的选择位。此位为1，允许看门狗工作。此位为0禁止看门狗工作。

PWRTE是加电计时器允许与禁止的选择。此位为1，加电计时器允许工作，为0则禁止工作。

CP是代码保护的选择，此位为1代码保护取消，这一位为0，所有程序存储器的代码被保护。其余位是不执行的。读作1。

有关振荡器的配置，振荡器的选择与连接电路与PIC16C6X系列相同。

8－2中断

PIC16C84具有4个中断源。即外部中断RBO／INT引脚上的中断，TMR0溢出中断；PORTB改变中断（RB7：RB4）；EEPRDM写完成中断。

中断控制寄存器（INTCON在其标志位，记录了每一个中断请求。它也包括了每个中断的允许／禁止位。所有中断的允许／禁止位（IN TCON＜7＞），它就开放所有中断或禁止所有中断。从中断返回指令RETFLE返回时，退出中断，并置GIE＝1，重新开放所有中断。 RBO／INT引脚中断，RB端口改变中断和TMRO溢出中断，这些中断的中断标志在INTCON寄存器中。

当中断的响应时，GIE位被清0，关闭任何新的中断，返回地址被压入堆栈，用0004H装入PC。对于外部中断文件，如RBO／INT引脚或PORTB改变中断，这类中断需3到4个指令周期。严格的时间，取决于中 断事件的发生。一旦在中断的中断服务程序中可以通过查询中断标志 位来确定中断源。中断的标志位应在重新开发这个中断之前，经软件 将其清0。

注意：

①每一个中断的标志位被置位，而与它相应的屏蔽位或GIE无关。

②如果中断发生，而全部中的允许位GIE假设本是清0的，GIE可能被用户中断服务程序的RETFIE指令无意之间连成1。这种事情可能发生在

a、在中断被响应时，指令清0GIE位。

b、程序分支到中断向量并执行中断服务程序。

c、中断服务程序执行RETFIE指令而完成。这会引起GIE位被置1（允许中断）。同时程序返回中断关闭后的指令（实 际上由于上述原因引起中断未能关闭）。为确保GIE清0，应有如下一段程序。

l00p BGF INT CON，GIE：关闭全部中断

BTFSC INTCON，GIE；全部中断允许位被关闭了吗？

GOTO l00P；没有返回到l00p，再清0GIE，否则程序继续。

1．INT中断

在RBO／INT上的外部中断是边沿触发。如果INTEDG位（OPTION ＜6＞）是置1，则上升沿有效，如果INTEDG位被清0，则下降沿有效。当有效跳变出现在RBO／INT引脚上时，INTF位（INTCON＜1＞）被置1。清0INTE控制位（INTCON＜4＞），关闭这个中断。INTF在重新允许这个中断之前应由中断服务程序中的软件来清0这一位。在芯片进入SLEEP之前，如果INTE位被置1，则INT中断发生后可唤醒芯片。GIE位的状态决定了处理器被唤醒后是否分支到中断向量。

2．TMRO中断

TMRO溢出（由FFH～00H）将置1 TOIF位（INTCON＜2＞）。这一位 的中断可以对TOIE（INTCON＜5＞）位置1或清0而开放／关闭中断。

3．PORTB中断

在端口B的7～4位的输入改变，就置1 RBIF（INTCON＜0＞）位。 这个中断可以对RBIE（INTCON＜3＞）位置1或清0而开放或关闭。

注意 ：当正在对RB端口进行读操作时，RB7～RB4发生改变，RBIF标志位可 能不被置1。

4．中断时如何保存W和STATUS寄存器。

中断时，硬件自动将PC的值压入堆栈，这叫保存断点，用户经常希望保存关键的寄存器的内容，（如W和STATUS寄存器）。为此，执行如下一段程序。

MOVWF W－TEMP ；将W寄存拷贝到W－TEMP寄存器，W－TEMP寄存器 可在1块或0块

SWAPF STATUS，W；状态寄存器内容送入W

BCF STATUS，RPO；选0块

MOVWF STATUS－TEMP；将状态寄存器的内容（现在在W中的STATUS－TEMP寄存器中断服务程序

SWAPF STATUS－TEMP，W；将STATUS－TEMP送入W（设置块到原来 的状态）

MOVWF STATUS ；W送入STATUS（恢复STATUS）

SWAPF W－TEMP，0；W－TEMP送W（恢复W的内容）

在上面这段程序中，W－TEMP寄存器，必须定义在两个块中，且要在定在同样的块基地址。例如将W－TEMP定义在0块的20H，同时它也应定义在1块的A0H。寄存器STATUS－TEMP必须定义在0块。

5．看门狗计时器（WDT）

看门狗计时器实际使用的是在芯片上的RC振荡器，这不要求任何外部元件。这个RC振荡器与OSC1／CLKIN引脚上接的RC振荡器（主振时钟）是分开的。这样即使OSC1／CLKIN和OSC2／CLKOUT引脚停振，（例在执行SLEEP指令后）WDT仍然能够工作。在正常工作时，WDT计时器的输出产生器件的RESET信号。如果器件处于SLEEP状态下，WDT计时器的输出将唤醒器件，使器件继续正常的工作。WDT也可以通过编程的配置来关闭。其内容的框图与PIC16C6X系列相同。

九、PIC16C84的指令系统共有35条指令。与PIC16C6X系列的指令完全相同。

[ 返回 ]