电子工程世界电子工程世界电子工程世界

产品描述

搜索

PIC16F873AT-I/SOG

器件型号:PIC16F873AT-I/SOG
器件类别:半导体    嵌入式处理器和控制器   
厂商名称:Microchip
厂商官网:https://www.microchip.com
标准:
下载文档

器件描述

8-bit Microcontrollers - MCU 7KB 192 RAM 22 I/O Lead Free Package

参数
产品属性属性值
Product AttributeAttribute Value
制造商:
Manufacturer:
Microchip
产品种类:
Product Category:
8-bit Microcontrollers - MCU
RoHS:YES
安装风格:
Mounting Style:
SMD/SMT
封装 / 箱体:
Package / Case:
SOIC-28
系列:
Series:
PIC16(L)F87x
Core:PIC16
Data Bus Width:8 bit
Maximum Clock Frequency:20 MHz
Program Memory Size:7 kB
Data RAM Size:192 B
ADC Resolution:10 bit
Number of I/Os:22 I/O
工作电源电压:
Operating Supply Voltage:
2 V to 5.5 V
最小工作温度:
Minimum Operating Temperature:
- 40 C
最大工作温度:
Maximum Operating Temperature:
+ 85 C
接口类型:
Interface Type:
I2C, SPI, USART
高度:
Height:
2.31 mm
长度:
Length:
17.9 mm
产品:
Product:
MCU
Program Memory Type:Flash
宽度:
Width:
7.5 mm
商标:
Brand:
Microchip Technology
Data ROM Size:128 B
Data ROM Type:Flash
Moisture Sensitive:Yes
Number of ADC Channels:5
Number of Timers/Counters:1 Timer
Processor Series:PIC16
产品类型:
Product Type:
8-bit Microcontrollers - MCU
工厂包装数量:
Factory Pack Quantity:
1600
子类别:
Subcategory:
Microcontrollers - MCU
电源电压-最大:
Supply Voltage - Max:
5.5 V
电源电压-最小:
Supply Voltage - Min:
4 V
商标名:
Tradename:
PIC
单位重量:
Unit Weight:
0.078125 oz

PIC16F873AT-I/SOG器件文档内容

                                                                           PIC16F87XA

                 28/40/44-Pin Enhanced Flash Microcontrollers

Devices Included in this Data Sheet:                                  Analog Features:

   •     PIC16F873A                      •  PIC16F876A                •      10-bit, up to 8-channel Analog-to-Digital

   •     PIC16F874A                      •  PIC16F877A                       Converter (A/D)

                                                                      •      Brown-out Reset (BOR)

High-Performance RISC CPU:                                            •      Analog Comparator module with:

                                                                             -  Two analog comparators

•     Only 35 single-word instructions to learn                              -  Programmable on-chip voltage reference

•     All single-cycle instructions except for program                          (VREF) module

      branches, which are two-cycle                                          -  Programmable input multiplexing from device

•     Operating speed: DC – 20 MHz clock input                                  inputs and internal voltage reference

                           DC – 200 ns instruction cycle                     -  Comparator outputs are externally accessible

•     Up to 8K x 14 words of Flash Program Memory,

      Up to 368 x 8 bytes of Data Memory (RAM),                       Special Microcontroller Features:

      Up to 256 x 8 bytes of EEPROM Data Memory

•     Pinout compatible to other 28-pin or 40/44-pin                  •      100,000 erase/write cycle Enhanced Flash

      PIC16CXXX and PIC16FXXX microcontrollers                               program memory typical

                                                                      •      1,000,000 erase/write cycle Data EEPROM

Peripheral Features:                                                         memory typical

•     Timer0: 8-bit timer/counter with 8-bit prescaler                •      Data EEPROM Retention > 40 years

•     Timer1: 16-bit timer/counter with prescaler,                    •      Self-reprogrammable under software control

      can be incremented during Sleep via external                    •      In-Circuit Serial Programming™ (ICSP™)

      crystal/clock                                                          via two pins

•     Timer2: 8-bit timer/counter with 8-bit period                   •      Single-supply 5V In-Circuit Serial Programming

      register, prescaler and postscaler                              •      Watchdog Timer (WDT) with its own on-chip RC

•     Two Capture, Compare, PWM modules                                      oscillator for reliable operation

      -  Capture is 16-bit, max. resolution is 12.5 ns                •      Programmable code protection

      -  Compare is 16-bit, max. resolution is 200 ns                 •      Power saving Sleep mode

      -  PWM max. resolution is 10-bit                                •      Selectable oscillator options

•     Synchronous Serial Port (SSP) with SPI                          •      In-Circuit Debug (ICD) via two pins

      (Master mode) and I2C™(Master/Slave)

•     Universal Synchronous Asynchronous Receiver                     CMOS Technology:

      Transmitter (USART/SCI) with 9-bit address                      •      Low-power, high-speed Flash/EEPROM

      detection                                                              technology

•     Parallel Slave Port (PSP) – 8 bits wide with                    •      Fully static design

      external RD, WR and CS controls (40/44-pin only)                •      Wide operating voltage range (2.0V to 5.5V)

•     Brown-out detection circuitry for                               •      Commercial and Industrial temperature ranges

      Brown-out Reset (BOR)                                           •      Low-power consumption

                     Program Memory         Data                                           MSSP

         Device                             SRAM     EEPROM   I/O  10-bit       CCP                 USART       Timers    Comparators

                 Bytes     # Single Word    (Bytes)  (Bytes)       A/D (ch)     (PWM)  SPI  Master              8/16-bit

                           Instructions                                                       I2C

PIC16F873A           7.2K  4096             192      128      22   5            2      Yes    Yes    Yes        2/1          2

PIC16F874A           7.2K  4096             192      128      33   8            2      Yes    Yes    Yes        2/1          2

PIC16F876A       14.3K     8192             368      256      22   5            2      Yes    Yes    Yes        2/1          2

PIC16F877A       14.3K     8192             368      256      33   8            2      Yes    Yes    Yes        2/1          2

 2001-2013 Microchip Technology Inc.                                                                             DS39582C-page 1
PIC16F87XA

Pin  Diagrams

     28-Pin PDIP, SOIC,       SSOP

     MCLR/VPP                                                  1                                                                                               28  RB7/PGD

     RA0/AN0                                                   2                                                                                               27  RB6/PGC

     RA1/AN1                                                   3                                                                                               26  RB5

     RA2/AN2/VREF-/CVREF                                       4                                 PIC16F873A/876A                                               25  RB4

     RA3/AN3/VREF+                                             5                                                                                               24  RB3/PGM

     RA4/T0CKI/C1OUT                                           6                                                                                               23  RB2

     RA5/AN4/SS/C2OUT                                          7                                                                                               22  RB1

                 VSS                                           8                                                                                               21  RB0/INT

     OSC1/CLKI                                                 9                                                                                               20  VDD

     OSC2/CLKO                                    10                                                                                                           19  VSS

     RC0/T1OSO/T1CKI                              11                                                                                                           18  RC7/RX/DT

     RC1/T1OSI/CCP2                               12                                                                                                           17  RC6/TX/CK

     RC2/CCP1                                     13                                                                                                           16  RC5/SDO

     RC3/SCK/SCL                                  14                                                                                                           15  RC4/SDI/SDA

                                                                                                                                                                   28-Pin QFN              RA1/AN1          RA0/AN0         MCLR/VPP  RB7/PGD      RB6/PGC

                                                                                                                                                                                                                                                                RB5      RB4

                                                                                                                                                                                           28               27              26        25           24           23       22

                                                                                                                                                                   RA2/AN2/VREF-/CVREF  1                                                                                           21  RB3/PGM

                                                                                                                                                                   RA3/AN3/VREF+        2                                                                                           20  RB2

                                                                                                                                                                   RA4/T0CKI/C1OUT      3  PIC16F873A                                                                               19  RB1

                                                                                                                                                                   RA5/AN4/SS/C2OUT     4  PIC16F876A                                                                               18  RB0/INT

                                                                                                                                                                               VSS      5                                                                                           17  VDD

                                                                                                                                                                        OSC1/CLKI       6                                                                                           16  VSS

                                                                                                                                                                        OSC2/CLKO       7                                                                                           15  RC7/RX/DT

                                                                                                                                                                                           8                9               10        11           12           13       14

     44-Pin QFN                                                                                        RC3/SCK/SCL            RC1/T1OSI/CCP2  RC0/T1OSO/T1CKI                              RC0/T1OSO/T1CKI  RC1/T1OSI/CCP2  RC2/CCP1  RC3/SCK/SCL  RC4/SDI/SDA  RC5/SDO  RC6/TX/CK

                              RC6/TX/CK  RC5/SDO  RC4/SDI/SDA  RD3/PSP3  RD2/PSP2  RD1/PSP1  RD0/PSP0               RC2/CCP1

     RC7/RX/DT            1   44         43       42           41        40        39        38        37           36        35              34                   OSC2/CLKO

                                                                                                                                              33

     RD4/PSP4             2                                                                                                                   32                   OSC1/CLKI

     RD5/PSP5             3                                                                                                                   31                   VSS

     RD6/PSP6             4                                                                                                                   30                   VSS

     RD7/PSP7             5                       PIC16F874A                                                                                  29                   VDD

     VSS                  6                                                                                                                   28                   VDD

     VDD                  7                       PIC16F877A                                                                                  27                   RE2/CS/AN7

     VDD                  8                                                                                                                   26                   RE1/WR/AN6

     RB0/INT              9                                                                                                                   25                   RE0/RD/AN5

     RB1                  10                                                                                                                  24                   RA5/AN4/SS/C2OUT

     RB2                  11                                       16        17                                                              2223                  RA4/T0CKI/C1OUT
                             12       13     14   15                                   18        19                 20        21

                             RB3/PGM  NC  RB4     RB5             RB6/PGC  RB7/PGD  MCLR/VPP  RA0/AN0  RA1/AN1          RA2/AN2/VREF-/CVREF   RA3/AN3/VREF+

DS39582C-page 2                                                                                                                                                                                                              2001-2013 Microchip Technology                                       Inc.
                                                                                                                                                                                                                                                            PIC16F87XA

Pin Diagrams (Continued)

   40-Pin PDIP

   MCLR/VPP                            1                                                             40                                                         RB7/PGD

   RA0/AN0                             2                                                             39                                                         RB6/PGC

   RA1/AN1                             3                                                             38                                                         RB5

   RA2/AN2/VREF-/CVREF                 4                                                             37                                                         RB4

   RA3/AN3/VREF+                       5                                                             36                                                         RB3/PGM

   RA4/T0CKI/C1OUT                     6                                                             35                                                         RB2

   RA5/AN4/SS/C2OUT                    7                               PIC16F874A/877A               34                                                         RB1

   RE0/RD/AN5                          8                                                             33                                                         RB0/INT

   RE1/WR/AN6                          9                                                             32                                                         VDD

   RE2/CS/AN7                          10                                                            31                                                         VSS

                VDD                    11                                                            30                                                         RD7/PSP7

                VSS                    12                                                            29                                                         RD6/PSP6

   OSC1/CLKI                           13                                                            28                                                         RD5/PSP5

   OSC2/CLKO                           14                                                            27                                                         RD4/PSP4                                        RA2/AN2/VREF-/CVREF

   RC0/T1OSO/T1CKI                     15                                                            26                                                         RC7/RX/DT

   RC1/T1OSI/CCP2                      16                                                            25                                                         RC6/TX/CK                       RA3/AN3/VREF+

   RC2/CCP1                            17                                                            24                                                         RC5/SDO                                                                                     MCLR/VPP

   RC3/SCK/SCL                         18                                                            23                                                         RC4/SDI/SDA                                                          RA1/AN1      RA0/AN0                       RB7/PGD   RB6/PGC

   RD0/PSP0                            19                                                            22                                                         RD3/PSP3

   RD1/PSP1                            20                                                            21                                                         RD2/PSP2                                                                                              NC                               RB5      RB4        NC

                                                                                                                                                                     44-Pin PLCC

                                                                                                                                                                                                6               5                    4            3         2         1         44        43           42       41         40

                                                                                                                                                                     RA4/T0CKI/C1OUT         7                                                                                                                                 39  RB3/PGM

                                                                                                                                                                RA5/AN4/SS/C2OUT             8                                                                                                                                 38  RB2

                                                                                                                                                                          RE0/RD/AN5         9                                                                                                                                 37  RB1

                                                                                                                                                                         RE1/WR/AN6          10                                                                                                                                36  RB0/INT

                                                                                                                                                                          RE2/CS/AN7         11                                      PIC16F874A                                                                                35  VDD

                                                                                                                                                                                VDD          12                                      PIC16F877A                                                                                34  VSS

                                                                                                                                                                                VSS          13                                                                                                                                33  RD7/PSP7

                                                                                                                                                                           OSC1/CLKI         14                                                                                                                                32  RD6/PSP6

                                                                                                                                                                          OSC2/CLKO          15                                                                                                                                31  RD5/PSP5

                                                                                                                                                                RC0/T1OSO/T1CK1              16                                                                                                                                30  RD4/PSP4

                                                                                                                                                                                  NC         17 18              19                   20           21        22        23        24        25           26       27         28  29  RC7/RX/DT

                            RC6/TX/CK  RC5/SDO  RC4/SDI/SDA  RD3/PSP3  RD2/PSP2  RD1/PSP1  RD0/PSP0  RC3/SCK/SCL  RC2/CCP1  RC1/T1OSI/CCP2                                                      RC1/T1OSI/CCP2  RC2/CCP1             RC3/SCK/SCL  RD0/PSP0  RD1/PSP1  RD2/PSP2  RD3/PSP3  RC4/SDI/SDA  RC5/SDO  RC6/TX/CK  NC

                                                                                                                                                 NC

   44-Pin TQFP

                            44         43       42           41        40        39        38        37           36        35                   34

   RC7/RX/DT            1                                                                                                                        33                        NC

   RD4/PSP4             2                                                                                                                        32                        RC0/T1OSO/T1CKI

   RD5/PSP5             3                                                                                                                        31                        OSC2/CLKO

   RD6/PSP6             4                                                                                                                        30                        OSC1/CLKI

   RD7/PSP7             5                       PIC16F874A                                                                                       29                        VSS

   VSS                  6                       PIC16F877A                                                                                       28                        VDD

   VDD                  7                                                                                                                        27                        RE2/CS/AN7

   RB0/INT              8                                                                                                                        26                        RE1/WR/AN6

   RB1                  9                                                                                                                        25                        RE0/RD/AN5

   RB2                  10                                                                                                                       24                        RA5/AN4/SS/C2OUT

   RB3/PGM              11  12         13       14           15        16        17        18        19           20        21                   23                        RA4/T0CKI/C1OUT
                                                                                                                                                 22

                            NC         NC       RB4          RB5       RB6/PGC   RB7/PGD   MCLR/VPP  RA0/AN0      RA1/AN1   RA2/AN2/VREF-/CVREF  RA3/AN3/VREF+

  2001-2013 Microchip  Technology Inc.                                                                                                                                                                                                                                                                                            DS39582C-page 3
PIC16F87XA

Table of Contents

1.0   Device Overview .........................................................................................................................................................................          5

2.0   Memory Organization................................................................................................................................................................                15

3.0   Data EEPROM and Flash Program Memory ............................................................................................................................                                  33

4.0   I/O Ports....................................................................................................................................................................................      41

5.0   Timer0 Module ..........................................................................................................................................................................           53

6.0   Timer1 Module ..........................................................................................................................................................................           57

7.0   Timer2 Module ..........................................................................................................................................................................           61

8.0   Capture/Compare/PWM Modules .............................................................................................................................................                          63

9.0   Master Synchronous Serial Port (MSSP) Module.....................................................................................................................                                  71

10.0  Addressable Universal Synchronous Asynchronous Receiver Transmitter (USART) ............................................................                                                           111

11.0  Analog-to-Digital Converter (A/D) Module ..............................................................................................................................                            127

12.0  Comparator Module ................................................................................................................................................................                 135

13.0  Comparator Voltage Reference Module .................................................................................................................................                              141

14.0  Special Features of the CPU ..................................................................................................................................................                     143

15.0  Instruction Set Summary.........................................................................................................................................................                   159

16.0  Development Support .............................................................................................................................................................                  167

17.0  Electrical Characteristics.........................................................................................................................................................                173

18.0  DC and AC Characteristics Graphs and Tables .....................................................................................................................                                  197

19.0  Packaging Information ............................................................................................................................................................                 209

Appendix A: Revision History ............................................................................................................................................................                219

Appendix B: Device Differences........................................................................................................................................................                   219

Appendix C: Conversion Considerations...........................................................................................................................................                         220

Index .................................................................................................................................................................................................  221

On-Line Support................................................................................................................................................................................          229

Systems Information and Upgrade Hot Line .....................................................................................................................................                           229

Reader Response .............................................................................................................................................................................            230

PIC16F87XA Product Identification System......................................................................................................................................                           231

                                TO OUR VALUED CUSTOMERS

It is our intention to provide our valued customers with the best documentation possible to ensure successful use of your Microchip

products. To this end, we will continue to improve our publications to better suit your needs. Our publications will be refined and

enhanced as new volumes and updates are introduced.

If you have any questions or comments regarding this publication, please contact the Marketing Communications Department via

E-mail at docerrors@mail.microchip.com or fax the Reader Response Form in the back of this data sheet to (480) 792-4150.

We welcome your feedback.

Most Current Data Sheet

To obtain the most up-to-date version of this data sheet, please register at our Worldwide Web site at:

      http://www.microchip.com

You can determine the version of a data sheet by examining its literature number found on the bottom outside corner of any page.

The last character of the literature number is the version number, (e.g., DS30000A is version A of document DS30000).

Errata

An errata sheet, describing minor operational differences from the data sheet and recommended workarounds, may exist for current

devices. As device/documentation issues become known to us, we will publish an errata sheet. The errata will specify the revision

of silicon and revision of document to which it applies.

To determine if an errata sheet exists for a particular device, please check with one of the following:

•     Microchip’s Worldwide Web site; http://www.microchip.com

•     Your local Microchip sales office (see last page)

•     The Microchip Corporate Literature Center; U.S. FAX: (480) 792-7277

When contacting a sales office or the literature center, please specify which device, revision of silicon and data sheet (include liter-

ature number) you are using.

Customer Notification System

Register on our Web site at www.microchip.com/cn to receive the most current information on all of our products.

DS39582C-page 4                                                             2001-2013 Microchip Technology Inc.
                                                                                       PIC16F87XA

1.0        DEVICE OVERVIEW                                    The available features are summarized in Table 1-1.

                                                              Block  diagrams      of  the        PIC16F873A/876A         and

This  document      contains  device   specific  information  PIC16F874A/877A devices are provided in Figure 1-1

about the following devices:                                  and  Figure 1-2,     respectively.    The  pinouts     for  these

•  PIC16F873A                                                 device families are listed in Table 1-2 and Table 1-3.

•  PIC16F874A                                                 Additional information may be found in the PIC® Mid-

•  PIC16F876A                                                 Range Reference Manual (DS33023), which may be

•  PIC16F877A                                                 obtained from your local Microchip Sales Representative

                                                              or downloaded from the Microchip web site. The Refer-

PIC16F873A/876A devices are available only in 28-pin          ence Manual should be considered a complementary

packages, while PIC16F874A/877A devices are avail-            document to this data sheet and is highly recommended

able in 40-pin and 44-pin packages. All devices in the        reading for a better understanding of the device architec-

PIC16F87XA family share common architecture with              ture and operation of the peripheral modules.

the following differences:

•  The PIC16F873A and PIC16F874A have one-half

   of the total on-chip memory of the PIC16F876A

   and PIC16F877A

•  The 28-pin devices have three I/O ports, while the

   40/44-pin devices have five

•  The 28-pin devices have fourteen interrupts, while

   the 40/44-pin devices have fifteen

•  The 28-pin devices have five A/D input channels,

   while the 40/44-pin devices have eight

•  The Parallel Slave Port is implemented only on

   the 40/44-pin devices

TABLE 1-1:          PIC16F87XA DEVICE FEATURES

               Key Features                PIC16F873A         PIC16F874A           PIC16F876A            PIC16F877A

   Operating Frequency                     DC – 20 MHz        DC – 20 MHz          DC – 20 MHz           DC – 20 MHz

   Resets (and Delays)                     POR, BOR           POR, BOR             POR, BOR              POR, BOR

                                           (PWRT, OST)        (PWRT, OST)          (PWRT, OST)           (PWRT, OST)

   Flash Program Memory                          4K           4K                       8K                    8K

   (14-bit words)

   Data Memory (bytes)                           192          192                      368                   368

   EEPROM Data Memory (bytes)                    128          128                      256                   256

   Interrupts                                    14           15                       14                    15

   I/O Ports                               Ports A, B, C      Ports A, B, C, D, E  Ports A, B, C         Ports A, B, C, D, E

   Timers                                        3            3                        3                          3

   Capture/Compare/PWM modules                   2            2                        2                          2

   Serial Communications                   MSSP, USART        MSSP, USART          MSSP, USART           MSSP, USART

   Parallel Communications                       —            PSP                      —                     PSP

   10-bit Analog-to-Digital Module         5 input channels   8 input channels     5 input channels      8 input channels

   Analog Comparators                            2            2                        2                          2

   Instruction Set                         35 Instructions    35 Instructions      35 Instructions       35 Instructions

   Packages                                28-pin PDIP        40-pin PDIP          28-pin PDIP           40-pin PDIP

                                           28-pin SOIC        44-pin PLCC          28-pin SOIC           44-pin PLCC

                                           28-pin SSOP        44-pin TQFP          28-pin SSOP           44-pin TQFP

                                           28-pin QFN         44-pin QFN           28-pin QFN            44-pin QFN

 2001-2013 Microchip Technology Inc.                                                                    DS39582C-page 5
PIC16F87XA

FIGURE  1-1:          PIC16F873A/876A BLOCK                       DIAGRAM

                                           13                           Data Bus             8       PORTA

                                               Program Counter                                                   RA0/AN0

                      Flash                                                                                      RA1/AN1

                      Program                                                                                    RA2/AN2/VREF-/CVREF

                      Memory                   8 Level Stack                   RAM                               RA3/AN3/VREF+

                                                     (13-bit)                  File                              RA4/T0CKI/C1OUT

                                                                        Registers                                RA5/AN4/SS/C2OUT

          Program     14                                          RAM Addr(1)

              Bus                                                                    9

                   Instruction reg                                      Addr MUX

                                               Direct Addr     7                           Indirect  PORTB

                                                                                     8     Addr                  RB0/INT

                                                                                    FSR reg                      RB1

                                                                                                                 RB2

                                                                                    Status reg                   RB3/PGM

                                     8                                                                           RB4

                                                                                                                 RB5

                                                                                                                 RB6/PGC

                                               Power-up              3               MUX                         RB7/PGD

                                                     Timer

                      Instruction              Oscillator

                      Decode &                 Start-up Timer                  ALU

                      Control                  Power-on

                                                     Reset        8                                  PORTC

                      Timing                   Watchdog                 W reg                                    RC0/T1OSO/T1CKI

                      Generation                     Timer                                                       RC1/T1OSI/CCP2

OSC1/CLKI                                      Brown-out                                                         RC2/CCP1

OSC2/CLKO                                            Reset                                                       RC3/SCK/SCL

                                               In-Circuit                                                        RC4/SDI/SDA

                                               Debugger                                                          RC5/SDO

                                               Low-Voltage                                                       RC6/TX/CK

                                               Programming                                                       RC7/RX/DT

                                               MCLR  VDD, VSS

      Timer0                 Timer1                  Timer2                    10-bit A/D

Data    EEPROM                                       Synchronous               USART                 Comparator  Voltage

                             CCP1,2                  Serial Port                                                 Reference

              Device                           Program Flash                         Data Memory                 Data EEPROM

          PIC16F873A                           4K words                                 192 Bytes                128 Bytes

          PIC16F876A                           8K words                                 368 Bytes                256 Bytes

Note  1:  Higher order bits  are from the  Status register.

DS39582C-page 6                                                                                       2001-2013 Microchip Technology Inc.
                                                                                                      PIC16F87XA

FIGURE    1-2:         PIC16F874A/877A BLOCK DIAGRAM

                                           13                           Data Bus           8          PORTA

                                               Program Counter                                                              RA0/AN0

                             Flash                                                                                          RA1/AN1

                       Program                                                                                              RA2/AN2/VREF-/CVREF

                       Memory                  8 Level Stack                   RAM                                          RA3/AN3/VREF+

                                                     (13-bit)                  File                                         RA4/T0CKI/C1OUT

                                                                        Registers                                           RA5/AN4/SS/C2OUT

              Program  14                                         RAM Addr(1)                         PORTB

                Bus                                                                   9

                                                                                                                            RB0/INT

                       Instruction reg                                  Addr MUX                                            RB1

                                                               7                           Indirect                         RB2

                                               Direct Addr                            8    Addr                             RB3/PGM

                                                                                                                            RB4

                                                                                      FSR  reg                              RB5

                                                                                                                            RB6/PGC

                                                                                    Status reg                              RB7/PGD

                                           8

                                                                                                      PORTC

                                                                                                                            RC0/T1OSO/T1CKI

                                               Power-up              3                MUX                                   RC1/T1OSI/CCP2

                                                     Timer                                                                  RC2/CCP1

                       Instruction             Oscillator                                                                   RC3/SCK/SCL

                       Decode &                Start-up Timer                                                               RC4/SDI/SDA

                       Control                                                 ALU                                          RC5/SDO

                                               Power-on           8                                                         RC6/TX/CK

                                                     Reset                                                                  RC7/RX/DT

                       Timing                  Watchdog                        W reg

                       Generation                    Timer                                            PORTD

      OSC1/CLKI                                Brown-out                                                                    RD0/PSP0

      OSC2/CLKO                                      Reset                                                                  RD1/PSP1

                                               In-Circuit                                                                   RD2/PSP2

                                               Debugger                                                                     RD3/PSP3

                                               Low-Voltage                                                                  RD4/PSP4

                                               Programming                                                                  RD5/PSP5

                                                                                                                            RD6/PSP6

                                                                                                                            RD7/PSP7

                                                                                                      PORTE

                                               MCLR  VDD, VSS                                                               RE0/RD/AN5

                                                                                                                            RE1/WR/AN6

                                                                                                                            RE2/CS/AN7

      Timer0                 Timer1                  Timer2             10-bit A/D                                Parallel

                                                                                                      Slave Port

Data  EEPROM                                   Synchronous                     USART                  Comparator            Voltage

                             CCP1,2                  Serial Port                                                            Reference

              Device                           Program Flash                             Data Memory                        Data EEPROM

          PIC16F874A                           4K words                                    192 Bytes                        128 Bytes

          PIC16F877A                           8K words                                    368 Bytes                        256 Bytes

Note  1:  Higher order bits  are from the  Status register.

 2001-2013 Microchip Technology Inc.                                                                                       DS39582C-page 7
PIC16F87XA

TABLE 1-2:       PIC16F873A/876A PINOUT DESCRIPTION

      Pin Name        PDIP, SOIC,  QFN        I/O/P  Buffer                                    Description

                      SSOP Pin#    Pin#       Type   Type

OSC1/CLKI                    9           6           ST/CMOS(3)        Oscillator crystal or external clock input.

OSC1                                          I                        Oscillator crystal input or external clock source input. ST

                                                                       buffer when configured in RC mode; otherwise CMOS.

CLKI                                          I                        External clock source input. Always associated with pin

                                                                       function OSC1 (see OSC1/CLKI, OSC2/CLKO pins).

OSC2/CLKO                    10          7           —                 Oscillator crystal or clock output.

OSC2                                          O                        Oscillator crystal output. Connects to crystal or resonator

                                                                       in Crystal Oscillator mode.

CLKO                                          O                        In RC mode, OSC2 pin outputs CLKO, which has 1/4 the

                                                                       frequency of OSC1 and denotes the instruction cycle rate.

MCLR/VPP                     1     26                ST                Master Clear (input) or programming voltage (output).

MCLR                                          I                        Master Clear (Reset) input. This pin is an active low Reset

                                                                       to the device.

VPP                                           P                        Programming voltage input.

                                                                       PORTA is a bidirectional I/O port.

RA0/AN0                      2     27                TTL

RA0                                           I/O                      Digital I/O.

AN0                                           I                        Analog input 0.

RA1/AN1                      3     28                TTL

RA1                                           I/O                      Digital I/O.

AN1                                           I                        Analog input 1.

RA2/AN2/VREF-/               4           1           TTL

CVREF                                         I/O                      Digital I/O.

RA2                                           I                        Analog input 2.

AN2                                           I                        A/D reference voltage (Low) input.

VREF-                                         O                        Comparator VREF output.

CVREF

RA3/AN3/VREF+                5           2           TTL

RA3                                           I/O                      Digital I/O.

AN3                                           I                        Analog input 3.

VREF+                                         I                        A/D reference voltage (High) input.

RA4/T0CKI/C1OUT              6           3           ST

RA4                                           I/O                      Digital I/O – Open-drain when configured as output.

T0CKI                                         I                        Timer0 external clock input.

C1OUT                                         O                        Comparator 1 output.

RA5/AN4/SS/C2OUT             7           4           TTL

RA5                                           I/O                      Digital I/O.

AN4                                           I                        Analog input 4.

SS                                            I                        SPI slave select input.

C2OUT                                         O                        Comparator 2 output.

Legend:    I = input         O = output            I/O = input/output          P = power

           — = Not used      TTL = TTL input       ST = Schmitt Trigger input

Note   1:  This buffer is a  Schmitt Trigger input when configured as the external interrupt.

       2:  This buffer is a  Schmitt Trigger input when used in Serial Programming mode.

       3:  This buffer is a  Schmitt Trigger input when configured in RC Oscillator mode and a CMOS input otherwise.

DS39582C-page 8                                                                                 2001-2013 Microchip Technology Inc.
                                                                                                PIC16F87XA

TABLE 1-2:       PIC16F873A/876A PINOUT DESCRIPTION (CONTINUED)

      Pin Name          PDIP, SOIC,    QFN   I/O/P  Buffer                                      Description

                        SSOP Pin#      Pin#  Type   Type

                                                                      PORTB is a bidirectional I/O port. PORTB can be software

                                                                      programmed for internal weak pull-ups on all inputs.

RB0/INT                    21          18           TTL/ST(1)

     RB0                                     I/O                      Digital I/O.

     INT                                     I                        External interrupt.

RB1                        22          19    I/O    TTL               Digital I/O.

RB2                        23          20    I/O    TTL               Digital I/O.

RB3/PGM                    24          21           TTL

     RB3                                     I/O                      Digital I/O.

     PGM                                     I                        Low-voltage (single-supply) ICSP programming enable pin.

RB4                        25          22    I/O    TTL               Digital I/O.

RB5                        26          23    I/O    TTL               Digital I/O.

RB6/PGC                    27          24           TTL/ST(2)

     RB6                                     I/O                      Digital I/O.

     PGC                                     I                        In-circuit debugger and ICSP programming clock.

RB7/PGD                    28          25           TTL/ST(2)

     RB7                                     I/O                      Digital I/O.

     PGD                                     I/O                      In-circuit debugger and ICSP programming data.

                                                                      PORTC is a bidirectional I/O port.

RC0/T1OSO/T1CKI            11          8            ST

     RC0                                     I/O                      Digital I/O.

     T1OSO                                   O                        Timer1 oscillator output.

     T1CKI                                   I                        Timer1 external clock input.

RC1/T1OSI/CCP2             12          9            ST

     RC1                                     I/O                      Digital I/O.

     T1OSI                                   I                        Timer1 oscillator input.

     CCP2                                    I/O                      Capture2 input, Compare2 output, PWM2 output.

RC2/CCP1                   13          10           ST

     RC2                                     I/O                      Digital I/O.

     CCP1                                    I/O                      Capture1 input, Compare1 output, PWM1 output.

RC3/SCK/SCL                14          11           ST

     RC3                                     I/O                      Digital I/O.

     SCK                                     I/O                      Synchronous serial clock input/output for SPI mode.

     SCL                                     I/O                      Synchronous serial clock input/output for I2C mode.

RC4/SDI/SDA                15          12           ST

     RC4                                     I/O                      Digital I/O.

     SDI                                     I                        SPI data in.

     SDA                                     I/O                      I2C data I/O.

RC5/SDO                    16          13           ST

     RC5                                     I/O                      Digital I/O.

     SDO                                     O                        SPI data out.

RC6/TX/CK                  17          14           ST

     RC6                                     I/O                      Digital I/O.

     TX                                      O                        USART asynchronous transmit.

     CK                                      I/O                      USART1 synchronous clock.

RC7/RX/DT                  18          15           ST

     RC7                                     I/O                      Digital I/O.

     RX                                      I                        USART asynchronous receive.

     DT                                      I/O                      USART synchronous data.

VSS                        8, 19       5, 6  P      —                 Ground reference for logic and I/O pins.

VDD                        20          17    P      —                 Positive supply for logic and I/O pins.

Legend:      I = input     O = output             I/O = input/output          P = power

             — = Not used  TTL = TTL input        ST = Schmitt Trigger input

Note     1:  This buffer is a Schmitt Trigger input when configured as the external interrupt.

         2:  This buffer is a Schmitt Trigger input when used in Serial Programming mode.

         3:  This buffer is a Schmitt Trigger input when configured in RC Oscillator mode and a CMOS input otherwise.

 2001-2013 Microchip Technology Inc.                                                                           DS39582C-page 9
PIC16F87XA

TABLE 1-3:        PIC16F874A/877A PINOUT DESCRIPTION

      Pin Name        PDIP     PLCC      TQFP      QFN   I/O/P         Buffer                    Description

                         Pin#  Pin#      Pin#      Pin#  Type          Type

OSC1/CLKI                13    14        30        32           ST/CMOS(4)     Oscillator crystal or external clock input.

OSC1                                                     I                     Oscillator crystal input or external clock source

                                                                               input. ST buffer when configured in RC mode;

                                                                               otherwise CMOS.

CLKI                                                     I                     External clock source input. Always associated

                                                                               with pin function OSC1 (see OSC1/CLKI,

                                                                               OSC2/CLKO pins).

OSC2/CLKO                14    15        31        33                  —       Oscillator crystal or clock output.

OSC2                                                     O                     Oscillator crystal output.

                                                                               Connects to crystal or resonator in Crystal

                                                                               Oscillator mode.

CLKO                                                     O                     In RC mode, OSC2 pin outputs CLKO, which

                                                                               has 1/4 the frequency of OSC1 and denotes the

                                                                               instruction cycle rate.

MCLR/VPP                 1     2         18        18                  ST      Master Clear (input) or programming voltage (output).

MCLR                                                     I                     Master Clear (Reset) input. This pin is an active

                                                                               low Reset to the device.

VPP                                                      P                     Programming voltage input.

                                                                               PORTA is a bidirectional I/O port.

RA0/AN0                  2     3         19        19                  TTL

RA0                                                      I/O                   Digital I/O.

AN0                                                      I                     Analog input 0.

RA1/AN1                  3     4         20        20                  TTL

RA1                                                      I/O                   Digital I/O.

AN1                                                      I                     Analog input 1.

RA2/AN2/VREF-/CVREF      4     5         21        21                  TTL

RA2                                                      I/O                   Digital I/O.

AN2                                                      I                     Analog input 2.

VREF-                                                    I                     A/D reference voltage (Low) input.

CVREF                                                    O                     Comparator VREF output.

RA3/AN3/VREF+            5     6         22        22                  TTL

RA3                                                      I/O                   Digital I/O.

AN3                                                      I                     Analog input 3.

VREF+                                                    I                     A/D reference voltage (High) input.

RA4/T0CKI/C1OUT          6     7         23        23                  ST

RA4                                                      I/O                   Digital I/O – Open-drain when configured as

                                                                               output.

T0CKI                                                    I                     Timer0 external clock input.

C1OUT                                                    O                     Comparator 1 output.

RA5/AN4/SS/C2OUT         7     8         24        24                  TTL

RA5                                                      I/O                   Digital I/O.

AN4                                                      I                     Analog input 4.

SS                                                       I                     SPI slave select input.

C2OUT                                                    O                     Comparator 2 output.

Legend:    I = input         O = output            I/O = input/output          P = power

           — = Not used      TTL = TTL input       ST = Schmitt Trigger input

Note  1:   This buffer is a Schmitt Trigger input  when configured as the external interrupt.

      2:   This buffer is a Schmitt Trigger input  when used in Serial Programming mode.

      3:   This buffer is a Schmitt Trigger input  when configured in RC Oscillator mode and a CMOS input otherwise.

DS39582C-page 10                                                                                2001-2013 Microchip Technology Inc.
                                                                                               PIC16F87XA

TABLE 1-3:      PIC16F874A/877A PINOUT DESCRIPTION (CONTINUED)

      Pin Name       PDIP     PLCC      TQFP      QFN   I/O/P         Buffer                   Description

                        Pin#  Pin#      Pin#      Pin#  Type          Type

                                                                                 PORTB is a bidirectional I/O port. PORTB can be

                                                                                 software programmed for internal weak pull-up on all

                                                                                 inputs.

RB0/INT                 33    36        8         9                   TTL/ST(1)

RB0                                                     I/O                      Digital I/O.

INT                                                     I                        External interrupt.

RB1                     34    37        9         10    I/O           TTL        Digital I/O.

RB2                     35    38        10        11    I/O           TTL        Digital I/O.

RB3/PGM                 36    39        11        12                  TTL

RB3                                                     I/O                      Digital I/O.

PGM                                                     I                        Low-voltage ICSP programming enable pin.

RB4                     37    41        14        14    I/O           TTL        Digital I/O.

RB5                     38    42        15        15    I/O           TTL        Digital I/O.

RB6/PGC                 39    43        16        16                  TTL/ST(2)

RB6                                                     I/O                      Digital I/O.

PGC                                                     I                        In-circuit debugger and ICSP programming clock.

RB7/PGD                 40    44        17        17                  TTL/ST(2)

RB7                                                     I/O                      Digital I/O.

PGD                                                     I/O                      In-circuit debugger and ICSP programming data.

Legend:   I = input         O = output            I/O = input/output             P = power

          — = Not used      TTL = TTL input       ST = Schmitt Trigger input

Note  1:  This buffer is a Schmitt Trigger input  when configured as the external interrupt.

      2:  This buffer is a Schmitt Trigger input  when used in Serial Programming mode.

      3:  This buffer is a Schmitt Trigger input  when configured in RC Oscillator mode and a CMOS input otherwise.

 2001-2013 Microchip Technology Inc.                                                                 DS39582C-page 11
PIC16F87XA

TABLE 1-3:        PIC16F874A/877A PINOUT DESCRIPTION (CONTINUED)

      Pin Name        PDIP     PLCC      TQFP      QFN   I/O/P         Buffer                  Description

                         Pin#  Pin#      Pin#      Pin#  Type          Type

                                                                               PORTC is a bidirectional I/O port.

RC0/T1OSO/T1CKI          15    16        32        34                  ST

RC0                                                      I/O                   Digital I/O.

T1OSO                                                    O                     Timer1 oscillator output.

T1CKI                                                    I                     Timer1 external clock input.

RC1/T1OSI/CCP2           16    18        35        35                  ST

RC1                                                      I/O                   Digital I/O.

T1OSI                                                    I                     Timer1 oscillator input.

CCP2                                                     I/O                   Capture2 input, Compare2 output, PWM2      output.

RC2/CCP1                 17    19        36        36                  ST

RC2                                                      I/O                   Digital I/O.

CCP1                                                     I/O                   Capture1 input, Compare1 output, PWM1      output.

RC3/SCK/SCL              18    20        37        37                  ST

RC3                                                      I/O                   Digital I/O.

SCK                                                      I/O                   Synchronous serial clock input/output for  SPI

                                                                               mode.

SCL                                                      I/O                   Synchronous serial clock input/output for  I2C

                                                                               mode.

RC4/SDI/SDA              23    25        42        42                  ST

RC4                                                      I/O                   Digital I/O.

SDI                                                      I                     SPI data in.

SDA                                                      I/O                   I2C data I/O.

RC5/SDO                  24    26        43        43                  ST

RC5                                                      I/O                   Digital I/O.

SDO                                                      O                     SPI data out.

RC6/TX/CK                25    27        44        44                  ST

RC6                                                      I/O                   Digital I/O.

TX                                                       O                     USART asynchronous transmit.

CK                                                       I/O                   USART1 synchronous clock.

RC7/RX/DT                26    29        1         1                   ST

RC7                                                      I/O                   Digital I/O.

RX                                                       I                     USART asynchronous receive.

DT                                                       I/O                   USART synchronous data.

Legend:    I = input         O = output            I/O = input/output          P = power

           — = Not used      TTL = TTL input       ST = Schmitt Trigger input

Note  1:   This buffer is a Schmitt Trigger input  when configured as the external interrupt.

      2:   This buffer is a Schmitt Trigger input  when used in Serial Programming mode.

      3:   This buffer is a Schmitt Trigger input  when configured in RC Oscillator mode and a CMOS input otherwise.

DS39582C-page 12                                                                                2001-2013 Microchip Technology Inc.
                                                                                                  PIC16F87XA

TABLE 1-3:      PIC16F874A/877A PINOUT DESCRIPTION (CONTINUED)

      Pin Name          PDIP     PLCC      TQFP      QFN     I/O/P       Buffer                      Description

                           Pin#  Pin#      Pin#      Pin#    Type        Type

                                                                                    PORTD is a bidirectional I/O port or Parallel Slave

                                                                                    Port when interfacing to a microprocessor bus.

RD0/PSP0                   19    21        38        38                  ST/TTL(3)

     RD0                                                     I/O                    Digital I/O.

     PSP0                                                    I/O                    Parallel Slave Port data.

RD1/PSP1                   20    22        39        39                  ST/TTL(3)

     RD1                                                     I/O                    Digital I/O.

     PSP1                                                    I/O                    Parallel Slave Port data.

RD2/PSP2                   21    23        40        40                  ST/TTL(3)

     RD2                                                     I/O                    Digital I/O.

     PSP2                                                    I/O                    Parallel Slave Port data.

RD3/PSP3                   22    24        41        41                  ST/TTL(3)

     RD3                                                     I/O                    Digital I/O.

     PSP3                                                    I/O                    Parallel Slave Port data.

RD4/PSP4                   27    30        2         2                   ST/TTL(3)

     RD4                                                     I/O                    Digital I/O.

     PSP4                                                    I/O                    Parallel Slave Port data.

RD5/PSP5                   28    31        3         3                   ST/TTL(3)

     RD5                                                     I/O                    Digital I/O.

     PSP5                                                    I/O                    Parallel Slave Port data.

RD6/PSP6                   29    32        4         4                   ST/TTL(3)

     RD6                                                     I/O                    Digital I/O.

     PSP6                                                    I/O                    Parallel Slave Port data.

RD7/PSP7                   30    33        5         5                   ST/TTL(3)

     RD7                                                     I/O                    Digital I/O.

     PSP7                                                    I/O                    Parallel Slave Port data.

                                                                                    PORTE is a bidirectional I/O port.

RE0/RD/AN5                 8     9         25        25                  ST/TTL(3)

     RE0                                                     I/O                    Digital I/O.

     RD                                                      I                      Read control for Parallel Slave Port.

     AN5                                                     I                      Analog input 5.

RE1/WR/AN6                 9     10        26        26                  ST/TTL(3)

     RE1                                                     I/O                    Digital I/O.

     WR                                                      I                      Write control for Parallel Slave Port.

     AN6                                                     I                      Analog input 6.

RE2/CS/AN7                 10    11        27        27                  ST/TTL(3)

     RE2                                                     I/O                    Digital I/O.

     CS                                                      I                      Chip select control for Parallel Slave    Port.

     AN7                                                     I                      Analog input 7.

VSS                     12, 31   13, 34    6, 29     6, 30,  P           —          Ground reference for logic and I/O pins.

                                                     31

VDD                     11, 32   12, 35    7, 28     7, 8,   P           —          Positive supply for logic and I/O pins.

                                                     28, 29

NC                         —     1, 17,    12,13,    13      —           —          These pins are not internally connected. These pins

                                 28, 40    33, 34                                   should be left unconnected.

Legend:      I = input         O = output            I/O = input/output             P = power

             — = Not used      TTL = TTL input       ST = Schmitt Trigger input

Note     1:  This buffer is a Schmitt Trigger input  when configured as the external interrupt.

         2:  This buffer is a Schmitt Trigger input  when used in Serial Programming mode.

         3:  This buffer is a Schmitt Trigger input  when configured in RC Oscillator mode and a CMOS input otherwise.

 2001-2013 Microchip Technology Inc.                                                                                   DS39582C-page 13
PIC16F87XA

NOTES:

DS39582C-page 14   2001-2013 Microchip Technology Inc.
                                                                                     PIC16F87XA

2.0      MEMORY ORGANIZATION                                    2.1        Program Memory Organization

There  are  three  memory  blocks            in  each  of  the  The PIC16F87XA devices have a 13-bit program coun-

PIC16F87XA devices. The program memory and data                 ter capable of addressing an 8K word x 14 bit program

memory   have   separate  buses          so  that  concurrent   memory space. The PIC16F876A/877A devices have

access can occur and is detailed in this section. The           8K words x 14 bits of Flash program memory, while

EEPROM data memory block is detailed in Section 3.0             PIC16F873A/874A devices have 4K words x 14 bits.

“Data EEPROM and Flash Program Memory”.                         Accessing a location above the physically implemented

Additional information on device memory may be found            address will cause a wraparound.

in the PIC® Mid-Range MCU Family Reference Manual               The Reset vector is at 0000h and the interrupt vector is

(DS33023).                                                      at 0004h.

                                                                FIGURE 2-2:          PIC16F873A/874A

FIGURE 2-1:            PIC16F876A/877A                                               PROGRAM MEMORY     MAP

                       PROGRAM MEMORY                  MAP                           AND STACK

                       AND STACK

                                                                                     PC<12:0>

                       PC<12:0>                                      CALL,   RETURN                 13

                                      13                             RETFIE,  RETLW

       CALL,   RETURN

       RETFIE,  RETLW

                                                                                     Stack Level 1

                       Stack Level 1                                                 Stack Level 2

                       Stack Level 2

                                                                                     Stack Level 8

                       Stack Level 8

                                                                                     Reset Vector       0000h

                       Reset Vector                0000h

                                                                                     Interrupt Vector   0004h

                       Interrupt Vector            0004h                                                0005h

                                                   0005h        On-Chip              Page 0

                       Page 0                                   Program                                 07FFh

                                                   07FFh        Memory                                  0800h

                                                   0800h                             Page 1

                       Page 1                                                                           0FFFh

On-Chip                                            0FFFh                                                1000h

Program

Memory                                             1000h

                       Page 2

                                                   17FFh

                                                   1800h                                                1FFFh

                       Page 3

                                                   1FFFh

 2001-2013 Microchip Technology Inc.                                                                   DS39582C-page 15
PIC16F87XA

2.2  Data Memory Organization                               Each bank extends up to 7Fh (128 bytes). The lower

                                                            locations of each bank are reserved for the Special

The  data  memory  is  partitioned  into   multiple  banks  Function Registers. Above the Special Function Regis-

which contain the General Purpose Registers and the         ters are General Purpose Registers, implemented as

Special Function Registers. Bits RP1 (Status<6>) and        static  RAM.      All   implemented  banks  contain  Special

RP0 (Status<5>) are the bank select bits.                   Function  Registers.         Some  frequently  used  Special

                                                            Function Registers from one bank may be mirrored in

     RP1:RP0                              Bank              another bank for code reduction and quicker access.

           00                              0                Note:     The EEPROM data memory description can

                                           1                          be found in Section 3.0 “Data EEPROM

           01                                                         and Flash Program Memory” of this data

           10                              2                          sheet.

           11                              3                2.2.1     GENERAL PURPOSE REGISTER

                                                                      FILE

                                                            The     register  file  can  be  accessed  either  directly,  or

                                                            indirectly, through the File Select Register (FSR).

DS39582C-page 16                                                                     2001-2013 Microchip Technology Inc.
                                                                                            PIC16F87XA

FIGURE 2-3:        PIC16F876A/877A REGISTER FILE MAP

                   File                                   File                        File                        File

                   Address                                Address                     Address                     Address

Indirect addr.(*)  00h                 Indirect addr.(*)  80h      Indirect addr.(*)  100h     Indirect addr.(*)  180h

      TMR0         01h                 OPTION_REG         81h      TMR0               101h     OPTION_REG         181h

          PCL      02h                 PCL                82h      PCL                102h     PCL                182h

      STATUS       03h                 STATUS             83h      STATUS             103h     STATUS             183h

          FSR      04h                 FSR                84h      FSR                104h     FSR                184h

      PORTA        05h                 TRISA              85h                         105h                        185h

      PORTB        06h                 TRISB              86h      PORTB              106h     TRISB              186h

      PORTC        07h                 TRISC              87h                         107h                        187h

      PORTD(1)     08h                 TRISD(1)           88h                         108h                        188h

      PORTE(1)     09h                 TRISE(1)           89h                         109h                        189h

      PCLATH       0Ah                 PCLATH             8Ah      PCLATH             10Ah     PCLATH             18Ah

      INTCON       0Bh                 INTCON             8Bh      INTCON             10Bh     INTCON             18Bh

          PIR1     0Ch                 PIE1               8Ch      EEDATA             10Ch     EECON1             18Ch

          PIR2     0Dh                 PIE2               8Dh      EEADR              10Dh     EECON2             18Dh

      TMR1L        0Eh                 PCON               8Eh      EEDATH             10Eh     Reserved(2)        18Eh

      TMR1H        0Fh                                    8Fh      EEADRH             10Fh     Reserved(2)        18Fh

      T1CON        10h                                    90h                         110h                        190h

      TMR2         11h                 SSPCON2            91h                         111h                        191h

      T2CON        12h                 PR2                92h                         112h                        192h

      SSPBUF       13h                 SSPADD             93h                         113h                        193h

      SSPCON       14h                 SSPSTAT            94h                         114h                        194h

      CCPR1L       15h                                    95h                         115h                        195h

      CCPR1H       16h                                    96h                         116h                        196h

      CCP1CON      17h                                    97h      General            117h     General            197h

      RCSTA        18h                 TXSTA              98h      Purpose            118h     Purpose            198h

                                                                   Register                    Register

      TXREG        19h                 SPBRG              99h      16 Bytes           119h     16 Bytes           199h

      RCREG        1Ah                                    9Ah                         11Ah                        19Ah

      CCPR2L       1Bh                                    9Bh                         11Bh                        19Bh

      CCPR2H       1Ch                 CMCON              9Ch                         11Ch                        19Ch

      CCP2CON      1Dh                 CVRCON             9Dh                         11Dh                        19Dh

      ADRESH       1Eh                 ADRESL             9Eh                         11Eh                        19Eh

      ADCON0       1Fh                 ADCON1             9Fh                         11Fh                        19Fh

                   20h                                    A0h                         120h                        1A0h

                                       General                     General                     General

      General                          Purpose                     Purpose                     Purpose

      Purpose                          Register                    Register                    Register

      Register                         80 Bytes                    80 Bytes                    80 Bytes

      96 Bytes                                            EFh                         16Fh                        1EFh

                                       accesses           F0h      accesses           170h     accesses           1F0h

                                       70h-7Fh                     70h-7Fh                     70h - 7Fh

                   7Fh                                    FFh                         17Fh                        1FFh

      Bank 0                           Bank 1                      Bank 2                      Bank 3

             Unimplemented data memory locations, read as ‘0’.

      *      Not a physical register.

Note  1:     These registers are not implemented on the PIC16F876A.

      2:     These registers are reserved; maintain these registers clear.

 2001-2013 Microchip Technology Inc.                                                          DS39582C-page 17
PIC16F87XA

FIGURE 2-4:       PIC16F873A/874A REGISTER FILE MAP

                   File                             File                         File                        File

                   Address                          Address                      Address                     Address

Indirect addr.(*)  00h      Indirect addr.(*)       80h      Indirect addr.(*)   100h     Indirect addr.(*)  180h

      TMR0         01h      OPTION_REG              81h              TMR0        101h     OPTION_REG         181h

      PCL          02h                      PCL     82h              PCL         102h     PCL                182h

STATUS             03h      STATUS                  83h      STATUS              103h     STATUS             183h

      FSR          04h                      FSR     84h              FSR         104h     FSR                184h

      PORTA        05h                      TRISA   85h                          105h                        185h

      PORTB        06h                      TRISB   86h      PORTB               106h     TRISB              186h

      PORTC        07h                      TRISC   87h                          107h                        187h

PORTD(1)           08h      TRISD(1)                88h                          108h                        188h

PORTE(1)           09h      TRISE(1)                89h                          109h                        189h

PCLATH             0Ah      PCLATH                  8Ah      PCLATH              10Ah     PCLATH             18Ah

INTCON             0Bh      INTCON                  8Bh      INTCON              10Bh     INTCON             18Bh

      PIR1         0Ch                      PIE1    8Ch      EEDATA              10Ch     EECON1             18Ch

      PIR2         0Dh                      PIE2    8Dh      EEADR               10Dh     EECON2             18Dh

      TMR1L        0Eh                      PCON    8Eh      EEDATH              10Eh     Reserved(2)        18Eh

      TMR1H        0Fh                              8Fh      EEADRH              10Fh     Reserved(2)        18Fh

      T1CON        10h                              90h                          110h                        190h

      TMR2         11h      SSPCON2                 91h

      T2CON        12h                      PR2     92h

SSPBUF             13h      SSPADD                  93h

SSPCON             14h      SSPSTAT                 94h

CCPR1L             15h                              95h

CCPR1H             16h                              96h

CCP1CON            17h                              97h

      RCSTA        18h                      TXSTA   98h

      TXREG        19h      SPBRG                   99h

      RCREG        1Ah                              9Ah

CCPR2L             1Bh                              9Bh

CCPR2H             1Ch      CMCON                   9Ch

CCP2CON            1Dh      CVRCON                  9Dh

ADRESH             1Eh      ADRESL                  9Eh

ADCON0             1Fh      ADCON1                  9Fh                          120h                        1A0h

                   20h                              A0h

General                     General

Purpose                     Purpose                          accesses                     accesses

Register                    Register                         20h-7Fh                      A0h - FFh

96 Bytes                    96 Bytes                                             16Fh                        1EFh

                                                                                 170h                        1F0h

                   7Fh                              FFh                          17Fh                        1FFh

Bank 0                                      Bank 1           Bank 2                       Bank 3

                  Unimplemented data memory locations, read as ‘0’.

             *    Not a physical register.

Note  1:          These registers are not implemented on the PIC16F873A.

      2:          These registers are reserved; maintain these registers clear.

DS39582C-page 18                                                                  2001-2013 Microchip Technology Inc.
                                                                                                      PIC16F87XA

2.2.2         SPECIAL FUNCTION REGISTERS                                          The Special Function Registers can be classified into

The Special Function Registers are registers used by                              two sets: core (CPU) and peripheral. Those registers

the  CPU      and    peripheral  modules  for  controlling      the               associated with the core functions are described in

desired operation of the device. These registers are                              detail in this section. Those related to the operation of

implemented as static RAM. A list of these registers is                           the peripheral features are described in detail in the

given in Table 2-1.                                                               peripheral features section.

TABLE 2-1:               SPECIAL FUNCTION REGISTER SUMMARY

Address            Name  Bit 7      Bit 6        Bit 5          Bit 4    Bit 3        Bit 2           Bit 1     Bit 0    Value on:    Details

                                                                                                                         POR, BOR     on page:

Bank 0

00h(3)        INDF       Addressing this location uses contents of FSR to address data memory (not a physical register)  0000  0000   31, 150

01h           TMR0       Timer0 Module Register                                                                          xxxx  xxxx   55, 150

02h(3)        PCL        Program Counter (PC) Least Significant Byte                                                     0000  0000   30, 150

03h(3)        STATUS     IRP        RP1          RP0            TO                PD  Z               DC              C  0001  1xxx   22, 150

04h(3)        FSR        Indirect Data Memory Address Pointer                                                            xxxx  xxxx   31, 150

05h           PORTA              —        —      PORTA Data Latch when written: PORTA pins when read                     --0x  0000   43, 150

06h           PORTB      PORTB Data Latch when written: PORTB pins when read                                             xxxx  xxxx   45, 150

07h           PORTC      PORTC Data Latch when written: PORTC pins when read                                             xxxx  xxxx   47, 150

08h(4)        PORTD      PORTD Data Latch when written: PORTD pins when read                                             xxxx  xxxx   48, 150

09h(4)        PORTE              —        —      —              —                 —   RE2             RE1       RE0      ----  -xxx   49, 150

0Ah(1,3)      PCLATH             —        —      —          Write Buffer for the upper 5 bits of the Program Counter     ---0  0000   30, 150

0Bh(3)        INTCON     GIE        PEIE         TMR0IE         INTE     RBIE         TMR0IF          INTF      RBIF     0000  000x   24, 150

0Ch           PIR1       PSPIF(3)   ADIF         RCIF           TXIF     SSPIF        CCP1IF          TMR2IF    TMR1IF   0000  0000   26, 150

0Dh           PIR2               —  CMIF         —              EEIF     BCLIF        —               —         CCP2IF   -0-0  0--0   28, 150

0Eh           TMR1L      Holding Register for the Least Significant Byte of the 16-bit TMR1 Register                     xxxx  xxxx   60, 150

0Fh           TMR1H      Holding Register for the Most Significant Byte of the 16-bit TMR1 Register                      xxxx  xxxx   60, 150

10h           T1CON              —        —      T1CKPS1        T1CKPS0  T1OSCEN      T1SYNC          TMR1CS    TMR1ON   --00  0000   57, 150

11h           TMR2       Timer2 Module Register                                                                          0000  0000   62, 150

12h           T2CON              —  TOUTPS3      TOUTPS2    TOUTPS1      TOUTPS0      TMR2ON          T2CKPS1   T2CKPS0  -000  0000   61, 150

13h           SSPBUF     Synchronous Serial Port Receive Buffer/Transmit Register                                        xxxx  xxxx   79, 150

14h           SSPCON     WCOL       SSPOV        SSPEN          CKP      SSPM3        SSPM2           SSPM1     SSPM0    0000  0000   82, 82,

                                                                                                                                      150

15h           CCPR1L     Capture/Compare/PWM Register 1 (LSB)                                                            xxxx  xxxx   63, 150

16h           CCPR1H     Capture/Compare/PWM Register 1 (MSB)                                                            xxxx  xxxx   63, 150

17h           CCP1CON            —        —      CCP1X          CCP1Y    CCP1M3       CCP1M2          CCP1M1    CCP1M0   --00  0000   64, 150

18h           RCSTA      SPEN       RX9          SREN           CREN     ADDEN        FERR            OERR      RX9D     0000  000x   112, 150

19h           TXREG      USART Transmit Data Register                                                                    0000  0000   118, 150

1Ah           RCREG      USART Receive Data Register                                                                     0000  0000   118, 150

1Bh           CCPR2L     Capture/Compare/PWM Register 2 (LSB)                                                            xxxx  xxxx   63, 150

1Ch           CCPR2H     Capture/Compare/PWM Register 2 (MSB)                                                            xxxx  xxxx   63, 150

1Dh           CCP2CON            —        —      CCP2X          CCP2Y    CCP2M3       CCP2M2          CCP2M1    CCP2M0   --00  0000   64, 150

1Eh           ADRESH     A/D Result Register High Byte                                                                   xxxx  xxxx   133, 150

1Fh           ADCON0     ADCS1      ADCS0        CHS2           CHS1     CHS0         GO/DONE         —         ADON     0000  00-0   127, 150

Legend:       x = unknown, u = unchanged, q = value depends on condition, - = unimplemented, read as ‘0’, r = reserved.

              Shaded locations are unimplemented, read as ‘0’.

Note      1:  The upper byte of the program counter is not directly accessible. PCLATH is a holding register for the PC<12:8>, whose

              contents are transferred to the upper byte of the program counter.

          2:  Bits PSPIE and PSPIF are reserved on PIC16F873A/876A devices; always maintain these bits clear.

          3:  These registers can be addressed from any bank.

          4:  PORTD, PORTE, TRISD and TRISE are not implemented on PIC16F873A/876A devices, read as ‘0’.

          5:  Bit 4 of EEADRH implemented only on the PIC16F876A/877A devices.

 2001-2013 Microchip Technology Inc.                                                                                    DS39582C-page 19
PIC16F87XA

TABLE 2-1:               SPECIAL FUNCTION REGISTER SUMMARY (CONTINUED)

Address            Name   Bit 7     Bit 6         Bit 5         Bit 4  Bit 3           Bit 2   Bit 1              Bit 0   Value on:   Details

                                                                                                                          POR, BOR    on page:

Bank 1

80h(3)        INDF        Addressing this location uses contents of FSR to address data memory (not a physical register)  0000  0000  31, 150

81h           OPTION_REG  RBPU      INTEDG        T0CS          T0SE   PSA             PS2     PS1                PS0     1111  1111  23, 150

82h(3)        PCL         Program Counter (PC) Least Significant Byte                                                     0000  0000  30, 150

83h(3)        STATUS      IRP       RP1           RP0           TO                PD   Z       DC                   C     0001  1xxx  22, 150

84h(3)        FSR         Indirect Data Memory Address Pointer                                                            xxxx  xxxx  31, 150

85h           TRISA       —              —        PORTA Data Direction Register                                           --11  1111  43, 150

86h           TRISB       PORTB Data Direction Register                                                                   1111  1111  45, 150

87h           TRISC       PORTC Data Direction Register                                                                   1111  1111  47, 150

88h(4)        TRISD       PORTD Data Direction Register                                                                   1111  1111  48, 151

89h(4)        TRISE       IBF       OBF           IBOV    PSPMODE                 —    PORTE Data Direction bits          0000  -111  50, 151

8Ah(1,3)      PCLATH      —              —        —       Write Buffer for the upper 5 bits of the Program Counter        ---0  0000  30, 150

8Bh(3)        INTCON      GIE       PEIE          TMR0IE        INTE   RBIE            TMR0IF  INTF               RBIF    0000  000x  24, 150

8Ch           PIE1        PSPIE(2)  ADIE          RCIE          TXIE   SSPIE           CCP1IE  TMR2IE  TMR1IE             0000  0000  25, 151

8Dh           PIE2        —         CMIE          —             EEIE   BCLIE           —       —       CCP2IE             -0-0  0--0  27, 151

8Eh           PCON        —              —        —             —                 —    —       POR                BOR     ----  --qq  29, 151

8Fh                 —     Unimplemented                                                                                   —           —

90h                 —     Unimplemented                                                                                   —           —

91h           SSPCON2     GCEN      ACKSTAT       ACKDT         ACKEN  RCEN            PEN     RSEN               SEN     0000  0000  83, 151

92h           PR2         Timer2 Period Register                                                                          1111  1111  62, 151

93h           SSPADD      Synchronous Serial Port (I2C mode) Address Register                                             0000  0000  79, 151

94h           SSPSTAT     SMP       CKE           D/A           P                 S    R/W     UA                   BF    0000  0000  79, 151

95h                 —     Unimplemented                                                                                   —           —

96h                 —     Unimplemented                                                                                   —           —

97h                 —     Unimplemented                                                                                   —           —

98h           TXSTA       CSRC      TX9           TXEN          SYNC              —    BRGH    TRMT               TX9D    0000  -010  111, 151

99h           SPBRG       Baud Rate Generator Register                                                                    0000  0000  113, 151

9Ah                 —     Unimplemented                                                                                   —           —

9Bh                 —     Unimplemented                                                                                   —           —

9Ch           CMCON       C2OUT     C1OUT         C2INV         C1INV             CIS  CM2     CM1                CM0     0000  0111  135, 151

9Dh           CVRCON      CVREN     CVROE         CVRR          —      CVR3            CVR2    CVR1               CVR0    000-  0000  141, 151

9Eh           ADRESL      A/D Result Register Low Byte                                                                    xxxx  xxxx  133, 151

9Fh           ADCON1      ADFM      ADCS2         —             —      PCFG3           PCFG2   PCFG1              PCFG0   00-- 0000   128, 151

Legend:       x = unknown, u = unchanged, q = value depends on condition, - = unimplemented, read as ‘0’, r = reserved.

              Shaded locations are unimplemented, read as ‘0’.

Note      1:  The upper byte of the program counter is not directly accessible. PCLATH is a holding register for the PC<12:8>, whose

              contents are transferred to the upper byte of the program counter.

          2:  Bits PSPIE and PSPIF are reserved on PIC16F873A/876A devices; always maintain these bits clear.

          3:  These registers can be addressed from any bank.

          4:  PORTD, PORTE, TRISD and TRISE are not implemented on PIC16F873A/876A devices, read as ‘0’.

          5:  Bit 4 of EEADRH implemented only on the PIC16F876A/877A devices.

DS39582C-page 20                                                                                2001-2013 Microchip Technology Inc.
                                                                                             PIC16F87XA

TABLE 2-1:              SPECIAL FUNCTION REGISTER SUMMARY (CONTINUED)

Address           Name   Bit 7  Bit 6              Bit 5       Bit 4          Bit 3  Bit 2   Bit 1            Bit 0      Value on:   Details

                                                                                                                         POR, BOR    on page:

Bank 2

100h(3)      INDF        Addressing this location uses contents of FSR to address data memory (not a physical register)  0000  0000  31, 150

101h         TMR0        Timer0 Module Register                                                                          xxxx  xxxx  55, 150

102h(3)      PCL         Program Counter’s (PC) Least Significant Byte                                                   0000  0000  30, 150

103h(3)      STATUS      IRP    RP1                RP0         TO                PD  Z       DC                      C   0001  1xxx  22, 150

104h(3)      FSR         Indirect Data Memory Address Pointer                                                            xxxx  xxxx  31, 150

105h               —     Unimplemented                                                                                   —           —

106h         PORTB       PORTB Data Latch when written: PORTB pins when read                                             xxxx  xxxx  45, 150

107h               —     Unimplemented                                                                                   —           —

108h               —     Unimplemented                                                                                   —           —

109h               —     Unimplemented                                                                                   —           —

10Ah(1,3)    PCLATH      —              —          —       Write Buffer for the upper 5 bits of the Program Counter      ---0  0000  30, 150

10Bh(3)      INTCON      GIE    PEIE               TMR0IE      INTE           RBIE   TMR0IF  INTF             RBIF       0000  000x  24, 150

10Ch         EEDATA      EEPROM Data Register Low Byte                                                                   xxxx  xxxx  39, 151

10Dh         EEADR       EEPROM Address Register Low Byte                                                                xxxx  xxxx  39, 151

10Eh         EEDATH      —              —        EEPROM Data Register High Byte                                          --xx  xxxx  39, 151

10Fh         EEADRH      —              —          —           —(5)     EEPROM Address Register High Byte                ----  xxxx  39, 151

Bank 3

180h(3)      INDF        Addressing this location uses contents of FSR to address data memory (not a physical register)  0000  0000  31, 150

181h         OPTION_REG  RBPU   INTEDG             T0CS        T0SE           PSA    PS2     PS1              PS0        1111  1111  23, 150

182h(3)      PCL         Program Counter (PC) Least Significant Byte                                                     0000  0000  30, 150

183h(3)      STATUS      IRP    RP1                RP0         TO                PD  Z       DC                      C   0001  1xxx  22, 150

184h(3)      FSR         Indirect Data Memory Address Pointer                                                            xxxx  xxxx  31, 150

185h               —     Unimplemented                                                                                   —           —

186h         TRISB       PORTB Data Direction Register                                                                   1111  1111  45, 150

187h               —     Unimplemented                                                                                   —           —

188h               —     Unimplemented                                                                                   —           —

189h               —     Unimplemented                                                                                   —           —

18Ah(1,3)    PCLATH      —              —          —       Write Buffer for the upper 5 bits of the Program Counter      ---0  0000  30, 150

18Bh(3)      INTCON      GIE    PEIE               TMR0IE      INTE           RBIE   TMR0IF  INTF             RBIF       0000  000x  24, 150

18Ch         EECON1      EEPGD          —          —           —        WRERR        WREN    WR                      RD  x---  x000  34, 151

18Dh         EECON2      EEPROM Control Register 2 (not a physical register)                                             ----  ----  39, 151

18Eh               —     Reserved; maintain clear                                                                        0000  0000  —

18Fh               —     Reserved; maintain clear                                                                        0000  0000  —

Legend:      x = unknown, u = unchanged, q = value depends on condition, - = unimplemented, read as ‘0’, r = reserved.

             Shaded locations are unimplemented, read as ‘0’.

Note     1:  The upper byte of the program counter is not directly accessible. PCLATH is a holding register for the PC<12:8>, whose

             contents are transferred to the upper byte of the program counter.

         2:  Bits PSPIE and PSPIF are reserved on PIC16F873A/876A devices; always maintain these bits clear.

         3:  These registers can be addressed from any bank.

         4:  PORTD, PORTE, TRISD and TRISE are not implemented on PIC16F873A/876A devices, read as ‘0’.

         5:  Bit 4 of EEADRH implemented only on the PIC16F876A/877A devices.

 2001-2013 Microchip Technology Inc.                                                                                    DS39582C-page 21
PIC16F87XA

2.2.2.1           Status Register                                 For example, CLRF               STATUS, will clear the upper three

The Status register contains the arithmetic status of the         bits and set the Z bit. This leaves the Status register as

ALU, the Reset status and the bank select bits for data           000u              u1uu (where u = unchanged).

memory.                                                           It            is  recommended,    therefore,    that  only  BCF,    BSF,

The  Status  register  can  be     the  destination  for  any     SWAPF and MOVWF instructions are used to alter the

instruction, as with any other register. If the Status reg-       Status register because these instructions do not affect

ister is the destination for an instruction that affects the      the Z, C or DC bits from the Status register. For other

Z, DC or C bits, then the write to these three bits is dis-       instructions         not  affecting        any  status      bits,   see

abled. These bits are set or cleared according to the             Section 15.0 “Instruction Set Summary”.

device logic. Furthermore, the TO and PD bits are not                           Note:  The C and DC bits operate as a borrow

writable, therefore, the result of an instruction with the                             and digit borrow bit, respectively, in sub-

Status register as destination may be different than                                   traction.  See        the  SUBLW  and  SUBWF

intended.                                                                              instructions for examples.

REGISTER 2-1:          STATUS REGISTER (ADDRESS                03h,             83h,   103h, 183h)

                            R/W-0       R/W-0        R/W-0     R-1                     R-1          R/W-x         R/W-x       R/W-x

                            IRP         RP1               RP0  TO                      PD              Z          DC          C

                       bit 7                                                                                                          bit 0

             bit  7    IRP: Register Bank Select bit (used for indirect addressing)

                       1 = Bank 2, 3 (100h-1FFh)

                       0 = Bank 0, 1 (00h-FFh)

             bit  6-5  RP1:RP0: Register Bank Select bits (used for direct addressing)

                       11 = Bank 3 (180h-1FFh)

                       10 = Bank 2 (100h-17Fh)

                       01 = Bank 1 (80h-FFh)

                       00 = Bank 0 (00h-7Fh)

                       Each bank is 128 bytes.

             bit  4    TO: Time-out bit

                       1 = After power-up, CLRWDT instruction or SLEEP instruction

                       0 = A WDT time-out occurred

             bit  3    PD: Power-down bit

                       1 = After power-up or by the CLRWDT instruction

                       0 = By execution of the SLEEP instruction

             bit  2    Z: Zero bit

                       1 = The result of an arithmetic or logic operation is zero

                       0 = The result of an arithmetic or logic operation is not zero

             bit  1    DC: Digit carry/borrow bit (ADDWF, ADDLW,SUBLW,SUBWF instructions)

                       (for borrow, the polarity is reversed)

                       1 = A carry-out from the 4th low order bit of the result occurred

                       0 = No carry-out from the 4th low order bit of the result

             bit  0    C: Carry/borrow bit (ADDWF, ADDLW,SUBLW,SUBWF                   instructions)

                       1 = A carry-out from the Most Significant bit of the result occurred

                       0 = No carry-out from the Most Significant bit of the result occurred

                            Note:       For borrow, the polarity is reversed. A subtraction is executed by adding the two’s

                                        complement of the second operand. For rotate (RRF, RLF) instructions, this bit is

                                        loaded with either the high, or low order bit of the source register.

                       Legend:

                       R = Readable bit                       W = Writable bit         U = Unimplemented bit, read as ‘0’

                       - n = Value at POR                     ‘1’ = Bit is set         ‘0’ = Bit is cleared       x = Bit is unknown

DS39582C-page 22                                                                             2001-2013 Microchip Technology Inc.
                                                                                      PIC16F87XA

2.2.2.2       OPTION_REG Register                                   Note:  To achieve a 1:1 prescaler assignment for

The OPTION_REG Register is a readable and writable                         the TMR0 register, assign the prescaler to

register, which contains various control bits to configure                 the Watchdog Timer.

the TMR0 prescaler/WDT postscaler (single assign-

able register known also as the prescaler), the external

INT interrupt, TMR0 and the weak pull-ups on PORTB.

REGISTER 2-2:      OPTION_REG REGISTER (ADDRESS 81h, 181h)

                   R/W-1               R/W-1      R/W-1     R/W-1          R/W-1      R/W-1      R/W-1         R/W-1

                   RBPU                INTEDG     T0CS      T0SE           PSA        PS2        PS1           PS0

                   bit 7                                                                                             bit 0

         bit  7    RBPU: PORTB Pull-up Enable bit

                   1 = PORTB pull-ups are disabled

                   0 = PORTB pull-ups are enabled by individual port latch values

         bit  6    INTEDG: Interrupt Edge Select bit

                   1 = Interrupt on rising edge of RB0/INT pin

                   0 = Interrupt on falling edge of RB0/INT pin

         bit  5    T0CS: TMR0 Clock Source Select bit

                   1 = Transition on RA4/T0CKI pin

                   0 = Internal instruction cycle clock (CLKO)

         bit  4    T0SE: TMR0 Source Edge Select bit

                   1 = Increment on high-to-low transition on RA4/T0CKI pin

                   0 = Increment on low-to-high transition on RA4/T0CKI pin

         bit  3    PSA: Prescaler Assignment bit

                   1 = Prescaler is assigned to the WDT

                   0 = Prescaler is assigned to the Timer0 module

         bit  2-0  PS2:PS0: Prescaler Rate Select bits

                   Bit Value           TMR0 Rate  WDT Rate

                   000                 1:2        1:1

                   001                 1:4        1:2

                   010                 1:8        1:4

                   011                 1 : 16     1:8

                   100                 1 : 32     1 : 16

                   101                 1 : 64     1 : 32

                   110                 1 : 128    1 : 64

                   111                 1 : 256    1 : 128

                   Legend:

                   R = Readable bit               W = Writable bit         U = Unimplemented bit, read as ‘0’

                   - n = Value at POR             ‘1’ = Bit is set         ‘0’ = Bit is cleared  x = Bit is unknown

                   Note:               When using Low-Voltage ICSP Programming (LVP) and the pull-ups on PORTB are

                                       enabled, bit 3 in the TRISB register must be cleared to disable the pull-up on RB3

                                       and ensure the proper operation of the device

 2001-2013 Microchip Technology Inc.                                                            DS39582C-page 23
PIC16F87XA

2.2.2.3       INTCON Register                                               Note:  Interrupt flag bits are set when an interrupt

The INTCON register is a readable and writable regis-                              condition occurs regardless of the state of its

ter, which contains various enable and flag bits for the                           corresponding         enable  bit   or  the  global

TMR0 register overflow, RB port change and external                                enable bit, GIE (INTCON<7>). User software

RB0/INT pin interrupts.                                                            should ensure the appropriate interrupt flag

                                                                                   bits are clear prior to enabling an interrupt.

REGISTER 2-3:            INTCON REGISTER (ADDRESS 0Bh, 8Bh, 10Bh, 18Bh)

                         R/W-0    R/W-0               R/W-0      R/W-0             R/W-0  R/W-0                  R/W-0     R/W-x

                             GIE  PEIE                TMR0IE      INTE             RBIE   TMR0IF                 INTF      RBIF

                         bit 7                                                                                                  bit 0

         bit  7          GIE: Global Interrupt Enable bit

                         1 = Enables all unmasked interrupts

                         0 = Disables all interrupts

         bit  6          PEIE: Peripheral Interrupt Enable bit

                         1 = Enables all unmasked peripheral interrupts

                         0 = Disables all peripheral interrupts

         bit  5          TMR0IE: TMR0 Overflow Interrupt Enable bit

                         1 = Enables the TMR0 interrupt

                         0 = Disables the TMR0 interrupt

         bit  4          INTE: RB0/INT External Interrupt Enable bit

                         1 = Enables the RB0/INT external interrupt

                         0 = Disables the RB0/INT external interrupt

         bit  3          RBIE: RB Port Change Interrupt Enable bit

                         1 = Enables the RB port change interrupt

                         0 = Disables the RB port change interrupt

         bit  2          TMR0IF: TMR0 Overflow Interrupt Flag bit

                         1 = TMR0 register has overflowed (must be cleared in software)

                         0 = TMR0 register did not overflow

         bit  1          INTF: RB0/INT External Interrupt Flag bit

                         1 = The RB0/INT external interrupt occurred (must be cleared in software)

                         0 = The RB0/INT external interrupt did not occur

         bit  0          RBIF: RB Port Change Interrupt Flag bit

                         1=     At least one of the RB7:RB4 pins changed state; a mismatch condition will continue to set

                                the bit. Reading PORTB will end the mismatch condition and allow the bit to be cleared

                                (must be cleared in software).

                         0=     None of the RB7:RB4 pins have changed state

                         Legend:

                         R = Readable bit                 W = Writable bit         U = Unimplemented bit, read as ‘0’

                         - n = Value at POR               ‘1’ = Bit is set         ‘0’ = Bit is cleared  x = Bit is unknown

DS39582C-page 24                                                                           2001-2013 Microchip Technology Inc.
                                                                                               PIC16F87XA

2.2.2.4       PIE1 Register                                                  Note:  Bit  PEIE  (INTCON<6>)  must        be  set     to

The PIE1 register contains the individual enable bits for                           enable any peripheral interrupt.

the peripheral interrupts.

REGISTER 2-4:    PIE1 REGISTER (ADDRESS 8Ch)

                            R/W-0      R/W-0    R/W-0          R/W-0                R/W-0      R/W-0      R/W-0         R/W-0

                            PSPIE(1)   ADIE     RCIE                 TXIE           SSPIE      CCP1IE     TMR2IE        TMR1IE

                            bit 7                                                                                             bit 0

         bit  7             PSPIE: Parallel Slave Port Read/Write Interrupt Enable bit(1)

                            1 = Enables the PSP read/write interrupt

                            0 = Disables the PSP read/write interrupt

                            Note 1:    PSPIE is reserved on PIC16F873A/876A devices;           always maintain this     bit clear.

         bit  6             ADIE: A/D Converter Interrupt Enable bit

                            1 = Enables the A/D converter interrupt

                            0 = Disables the A/D converter interrupt

         bit  5             RCIE: USART Receive Interrupt Enable bit

                            1 = Enables the USART receive interrupt

                            0 = Disables the USART receive interrupt

         bit  4             TXIE: USART Transmit Interrupt Enable bit

                            1 = Enables the USART transmit interrupt

                            0 = Disables the USART transmit interrupt

         bit  3             SSPIE: Synchronous Serial Port Interrupt Enable bit

                            1 = Enables the SSP interrupt

                            0 = Disables the SSP interrupt

         bit  2             CCP1IE: CCP1 Interrupt Enable bit

                            1 = Enables the CCP1 interrupt

                            0 = Disables the CCP1 interrupt

         bit  1             TMR2IE: TMR2 to PR2 Match Interrupt Enable bit

                            1 = Enables the TMR2 to PR2 match interrupt

                            0 = Disables the TMR2 to PR2 match interrupt

         bit  0             TMR1IE: TMR1 Overflow Interrupt Enable bit

                            1 = Enables the TMR1 overflow interrupt

                            0 = Disables the TMR1 overflow interrupt

                            Legend:

                            R = Readable bit    W = Writable bit                    U = Unimplemented bit, read as ‘0’

                            - n = Value at POR             ‘1’ = Bit is set         ‘0’ = Bit is cleared  x = Bit is unknown

 2001-2013 Microchip Technology Inc.                                                                       DS39582C-page 25
PIC16F87XA

2.2.2.5       PIR1 Register                                                Note:    Interrupt flag bits are set when an interrupt

The PIR1 register contains the individual flag bits for                             condition occurs regardless of the state of its

the peripheral interrupts.                                                          corresponding         enable   bit  or  the  global

                                                                                    enable bit, GIE (INTCON<7>). User software

                                                                                    should ensure the appropriate interrupt bits

                                                                                    are clear prior to enabling an interrupt.

REGISTER 2-5:     PIR1 REGISTER (ADDRESS 0Ch)

                            R/W-0        R/W-0    R-0                R-0            R/W-0    R/W-0                R/W-0     R/W-0

                            PSPIF(1)       ADIF   RCIF               TXIF           SSPIF    CCP1IF        TMR2IF           TMR1IF

                            bit 7                                                                                                bit 0

         bit  7             PSPIF: Parallel Slave Port Read/Write Interrupt Flag bit(1)

                            1 = A read or a write operation has taken place (must be cleared in software)

                            0 = No read or write has occurred

                            Note 1:      PSPIF is reserved on PIC16F873A/876A devices; always maintain this bit clear.

         bit  6             ADIF: A/D Converter Interrupt Flag bit

                            1 = An A/D conversion completed

                            0 = The A/D conversion is not complete

         bit  5             RCIF: USART Receive Interrupt Flag bit

                            1 = The USART receive buffer is full

                            0 = The USART receive buffer is empty

         bit  4             TXIF: USART Transmit Interrupt Flag bit

                            1 = The USART transmit buffer is empty

                            0 = The USART transmit buffer is full

         bit  3             SSPIF: Synchronous Serial Port (SSP) Interrupt Flag bit

                            1=     The SSP interrupt condition has occurred and must be cleared in software before returning

                                   from the Interrupt Service Routine. The conditions that will set this bit are:

                                   •  SPI – A transmission/reception has taken place.

                                   •  I2C Slave – A transmission/reception has taken place.

                                   •  I2C Master

                                      -  A transmission/reception has taken place.

                                      -  The initiated Start condition was completed by the SSP module.

                                      -  The initiated Stop condition was completed by the SSP module.

                                      -  The initiated Restart condition was completed by the SSP module.

                                      -  The initiated Acknowledge condition was completed by the SSP module.

                                      -  A Start condition occurred while the SSP module was Idle (multi-master system).

                                      -  A Stop condition occurred while the SSP module was Idle (multi-master system).

                            0=     No SSP interrupt condition has occurred

         bit  2             CCP1IF: CCP1 Interrupt Flag bit

                            Capture mode:

                            1 = A TMR1 register capture occurred (must be cleared in software)

                            0 = No TMR1 register capture occurred

                            Compare mode:

                            1 = A TMR1 register compare match occurred (must be cleared in software)

                            0 = No TMR1 register compare match occurred

                            PWM mode:

                            Unused in this mode.

         bit  1             TMR2IF: TMR2 to PR2 Match Interrupt Flag bit

                            1 = TMR2 to PR2 match occurred (must be cleared in software)

                            0 = No TMR2 to PR2 match occurred

         bit  0             TMR1IF: TMR1 Overflow Interrupt Flag bit

                            1 = TMR1 register overflowed (must be cleared in software)

                            0 = TMR1 register did not overflow

                            Legend:

                            R = Readable bit             W = Writable bit           U = Unimplemented bit, read as ‘0’

                            - n = Value at POR           ‘1’ = Bit is set           ‘0’ = Bit is cleared  x = Bit is unknown

DS39582C-page 26                                                                              2001-2013 Microchip Technology Inc.
                                                                                               PIC16F87XA

2.2.2.6       PIE2 Register                                                  Note:  Bit  PEIE  (INTCON<6>)      must  be     set    to

The PIE2 register contains the individual enable bits for                           enable any peripheral interrupt.

the CCP2 peripheral interrupt, the SSP bus collision

interrupt, EEPROM write operation interrupt and the

comparator interrupt.

REGISTER 2-6:          PIE2 REGISTER (ADDRESS 8Dh)

                       U-0             R/W-0  U-0             R/W-0                 R/W-0      U-0              U-0          R/W-0

                       —               CMIE   —               EEIE                  BCLIE      —                —            CCP2IE

                       bit 7                                                                                                 bit 0

         bit  7        Unimplemented: Read as ‘0’

         bit  6        CMIE: Comparator Interrupt Enable bit

                       1 = Enables the comparator interrupt

                       0 = Disable the comparator interrupt

         bit  5        Unimplemented: Read as ‘0’

         bit  4        EEIE: EEPROM Write Operation Interrupt Enable                bit

                       1 = Enable EEPROM write interrupt

                       0 = Disable EEPROM write interrupt

         bit  3        BCLIE: Bus Collision Interrupt Enable bit

                       1 = Enable bus collision interrupt

                       0 = Disable bus collision interrupt

         bit  2-1      Unimplemented: Read as ‘0’

         bit  0        CCP2IE: CCP2 Interrupt Enable bit

                       1 = Enables the CCP2 interrupt

                       0 = Disables the CCP2 interrupt

                       Legend:

                       R = Readable bit              W = Writable bit               U = Unimplemented     bit,  read as ‘0’

                       - n = Value at POR                  ‘1’ = Bit is set         ‘0’ = Bit is cleared  x     = Bit is unknown

 2001-2013 Microchip Technology Inc.                                                                           DS39582C-page 27
PIC16F87XA

2.2.2.7          PIR2 Register                                             Note:  Interrupt flag bits are set when an interrupt

The PIR2 register contains the flag bits for the CCP2                             condition occurs regardless of the state of

interrupt,  the  SSP  bus  collision  interrupt,  EEPROM                          its corresponding enable bit or the global

write operation interrupt and the comparator interrupt.                           enable     bit,  GIE        (INTCON<7>).  User

                                                                                  software   should     ensure     the  appropriate

                                                                                  interrupt  flag       bits  are  clear  prior   to

                                                                                  enabling an interrupt.

REGISTER 2-7:         PIR2 REGISTER (ADDRESS 0Dh)

                           U-0        R/W-0       U-0          R/W-0              R/W-0            U-0        U-0         R/W-0

                           —          CMIF        —            EEIF               BCLIF            —               —      CCP2IF

                           bit 7                                                                                                  bit 0

            bit  7    Unimplemented: Read as ‘0’

            bit  6    CMIF: Comparator Interrupt Flag bit

                      1 = The comparator input has changed (must be cleared in software)

                      0 = The comparator input has not changed

            bit  5    Unimplemented: Read as ‘0’

            bit  4    EEIF: EEPROM Write Operation Interrupt Flag bit

                      1 = The write operation completed (must be cleared in software)

                      0 = The write operation is not complete or has not been started

            bit  3    BCLIF: Bus Collision Interrupt Flag bit

                      1 = A bus collision has occurred in the SSP when configured for I2C Master mode

                      0 = No bus collision has occurred

            bit  2-1  Unimplemented: Read as ‘0’

            bit  0    CCP2IF: CCP2 Interrupt Flag bit

                      Capture mode:

                      1 = A TMR1 register capture occurred (must be cleared in software)

                      0 = No TMR1 register capture occurred

                      Compare mode:

                      1 = A TMR1 register compare match occurred (must be cleared in software)

                      0 = No TMR1 register compare match occurred

                      PWM mode:

                      Unused.

                      Legend:

                      R = Readable bit                   W = Writable bit         U = Unimplemented bit, read as ‘0’

                      - n = Value at POR                 ‘1’ = Bit is set         ‘0’ = Bit is cleared        x = Bit is unknown

DS39582C-page 28                                                                           2001-2013 Microchip Technology Inc.
                                                                                    PIC16F87XA

2.2.2.8    PCON Register                                                Note:  BOR is unknown on Power-on Reset. It

The Power Control (PCON) register contains flag bits                           must be set by the user and checked on

to  allow  differentiation  between    a  Power-on  Reset                      subsequent Resets to see if BOR is clear,

(POR), a Brown-out Reset (BOR), a Watchdog Reset                               indicating a brown-out has occurred. The

(WDT) and an external MCLR Reset.                                              BOR status bit is a “don’t care” and is not

                                                                               predictable if the brown-out circuit is dis-

                                                                               abled (by clearing the BODEN bit in the

                                                                               configuration word).

REGISTER 2-8:       PCON REGISTER (ADDRESS 8Eh)

                            U-0           U-0       U-0      U-0               U-0  U-0              R/W-0           R/W-1

                            —             —         —        —                 —    —                POR             BOR

                            bit 7                                                                                        bit 0

           bit 7-2          Unimplemented: Read as ‘0’

           bit 1            POR: Power-on Reset Status bit

                            1 = No Power-on Reset occurred

                            0 = A Power-on Reset occurred (must be set in software after a Power-on Reset occurs)

           bit 0            BOR: Brown-out Reset Status bit

                            1 = No Brown-out Reset occurred

                            0 = A Brown-out Reset occurred (must be set in software after a Brown-out Reset occurs)

                            Legend:

                            R = Readable bit          W = Writable bit         U = Unimplemented bit, read as ‘0’

                            - n = Value at POR        ‘1’ = Bit is set         ‘0’ = Bit is cleared  x = Bit is unknown

 2001-2013 Microchip Technology Inc.                                                                DS39582C-page 29
PIC16F87XA

2.3        PCL and PCLATH                                                   Note 1:     There are no status bits to indicate stack

The Program Counter (PC) is 13 bits wide. The low                                       overflow or stack underflow conditions.

byte comes from the PCL register which is a readable                             2:     There   are      no  instructions/mnemonics

and writable register. The upper bits (PC<12:8>) are                                    called PUSH or POP. These are actions

not readable, but are indirectly writable through the                                   that occur from the execution of the CALL,

PCLATH register. On any Reset, the upper bits of the                                    RETURN, RETLW and RETFIE instructions

PC will be cleared. Figure 2-5 shows the two situations                                 or the vectoring to an interrupt address.

for the loading of the PC. The upper example in the

figure shows how the PC is loaded on a write to PCL                    2.4       Program Memory Paging

(PCLATH<4:0>              PCH).  The     lower     example  in  the

figure shows how the PC is loaded during a CALL or                     All PIC16F87XA devices are capable of addressing a

GOTO instruction (PCLATH<4:3>  PCH).                                  continuous 8K word block of program memory. The

                                                                       CALL and GOTO instructions provide only 11 bits of

FIGURE 2-5:                     LOADING OF PC IN                       address   to  allow     branching     within     any   2K   program

                                DIFFERENT SITUATIONS                   memory page. When doing a CALL or GOTO instruction,

                                                                       the  upper    2  bits    of  the   address       are   provided     by

           PCH                    PCL                                  PCLATH<4:3>. When doing a CALL or GOTO instruc-

       12              8     7                   0                     tion, the user must ensure that the page select bits are

                                                    Instruction with   programmed       so    that  the   desired       program    memory

PC                                                  PCL as             page is addressed. If a return from a CALL instruction

                                                    Destination

                    PCLATH<4:0>               8                        (or interrupt) is executed, the entire 13-bit PC is popped

           5                                        ALU                off  the      stack.    Therefore,       manipulation       of      the

                                                                       PCLATH<4:3>        bits  is   not     required   for   the  RETURN

                       PCLATH                                          instructions (which POPs the address from the stack).

           PCH                  PCL                                    Note:         The contents of the PCLATH register are

       12  11   10  8     7                      0                                   unchanged       after   a    RETURN      or   RETFIE

PC                                                  GOTO,CALL                        instruction    is   executed.      The   user     must

                                                                                     rewrite the contents of the PCLATH regis-

       2   PCLATH<4:3>                    11                                         ter for any subsequent subroutine calls or

                                                    Opcode <10:0>

                                                                                     GOTO instructions.

                    PCLATH                                             Example 2-1      shows       the  calling    of  a     subroutine   in

                                                                       page 1 of the program memory. This example assumes

                                                                       that PCLATH is saved and restored by the Interrupt

2.3.1           COMPUTED GOTO                                          Service Routine (if interrupts are used).

A computed GOTO is accomplished by adding an offset

to the program counter (ADDWF             PCL). When doing a           EXAMPLE 2-1:                 CALL OF A SUBROUTINE

table     read  using     a     computed  GOTO      method,      care                               IN PAGE 1 FROM PAGE 0

should be exercised if the table location crosses a PCL                              ORG     0x500

memory boundary (each 256-byte block). Refer to the                                  BCF     PCLATH,4

application note, AN556, “Implementing a Table Read”                                 BSF     PCLATH,3        ;Select    page  1

(DS00556).                                                                                                   ;(800h-FFFh)

                                                                                     CALL    SUB1_P1         ;Call   subroutine        in

2.3.2           STACK                                                                :                       ;page   1  (800h-FFFh)

The PIC16F87XA family has an 8-level deep x 13-bit                                   :

                                                                                     ORG     0x900           ;page   1  (800h-FFFh)

wide hardware stack. The stack space is not part of                    SUB1_P1

either program or data space and the stack pointer is not                            :                       ;called    subroutine

readable or writable. The PC is PUSHed onto the stack                                                        ;page   1  (800h-FFFh)

when a CALL instruction is executed, or an interrupt                                 :

causes a branch. The stack is POP’ed in the event of a                               RETURN                  ;return    to

RETURN,    RETLW       or    a  RETFIE    instruction  execution.                                            ;Call   subroutine

PCLATH is not affected by a PUSH or POP operation.                                                           ;in  page     0

                                                                                                             ;(000h-7FFh)

The stack operates as a circular buffer. This means that

after the stack has been PUSHed eight times, the ninth

push overwrites the value that was stored from the first

push. The tenth push overwrites the second push (and

so on).

DS39582C-page 30                                                                                2001-2013 Microchip Technology Inc.
                                                                                              PIC16F87XA

2.5  Indirect Addressing, INDF and                                        A  simple  program  to   clear  RAM  locations  20h-2Fh

     FSR Registers                                                        using indirect addressing is shown in Example 2-2.

The INDF register is not a physical register. Addressing                  EXAMPLE 2-2:             INDIRECT ADDRESSING

the INDF register will cause indirect addressing.                                    MOVLW    0x20   ;initialize      pointer

Indirect addressing is possible by using the INDF reg-                               MOVWF    FSR    ;to   RAM

ister. Any instruction using the INDF register actually                   NEXT       CLRF     INDF   ;clear     INDF  register

accesses the register pointed to by the File Select Reg-                             INCF     FSR,F  ;inc  pointer

ister, FSR. Reading the INDF register itself, indirectly                             BTFSS    FSR,4  ;all  done?

(FSR = 0) will read 00h. Writing to the INDF register                                GOTO     NEXT   ;no   clear   next

indirectly results in a no operation (although status bits                CONTINUE

may be affected). An effective 9-bit address is obtained                             :               ;yes  continue

by concatenating the 8-bit FSR register and the IRP bit

(Status<7>) as shown in Figure 2-6.

FIGURE 2-6:           DIRECT/INDIRECT ADDRESSING

              Direct Addressing                                                               Indirect Addressing

RP1:RP0            6        From Opcode             0                                   IRP   7           FSR Register        0

Bank Select        Location Select                                                      Bank Select             Location Select

                                                    00     01       10          11

                                               00h         80h      100h     180h

                      Data
                      Memory(1)

                                               7Fh         FFh      17Fh     1FFh

                                               Bank 0      Bank  1  Bank 2      Bank 3

     Note 1:  For  register file map  detail,  see Figure  2-3.

 2001-2013 Microchip Technology Inc.                                                                           DS39582C-page 31
PIC16F87XA

NOTES:

DS39582C-page 32   2001-2013 Microchip Technology Inc.
                                                                                                 PIC16F87XA

3.0        DATA EEPROM AND FLASH                                       3.1      EEADR and EEADRH

           PROGRAM MEMORY                                              The EEADRH:EEADR register pair can address up to

The data EEPROM and Flash program memory is read-                      a maximum of 256 bytes of data EEPROM or up to a

able and writable during normal operation (over the full               maximum of 8K words of program EEPROM. When

VDD range). This memory is not directly mapped in the                  selecting a data address value, only the LSByte of the

register file space. Instead, it is indirectly addressed               address is written to the EEADR register. When select-

through the Special Function Registers. There are six                  ing   a  program     address   value,  the    MSByte      of  the

SFRs used to read and write this memory:                               address is written to the EEADRH register and the

                                                                       LSByte is written to the EEADR register.

•   EECON1                                                             If the device contains less memory than the full address

•   EECON2                                                             reach of the address register pair, the Most Significant

•   EEDATA                                                             bits of the registers are not implemented. For example,

•   EEDATH                                                             if the device has 128 bytes of data EEPROM, the Most

•   EEADR                                                              Significant bit of EEADR is not implemented on access

•   EEADRH                                                             to data EEPROM.

When interfacing to the data memory block, EEDATA                      3.2      EECON1 and EECON2 Registers

holds the 8-bit data for read/write and EEADR holds the

address    of  the   EEPROM          location  being  accessed.        EECON1 is the control register for memory accesses.

These devices have 128 or 256 bytes of data EEPROM                     Control bit, EEPGD, determines if the access will be a

(depending on the device), with an address range from                  program or data memory access. When clear, as it is

00h to FFh. On devices with 128 bytes, addresses from                  when reset, any subsequent operations will operate on

80h to FFh are unimplemented and will wraparound to                    the   data    memory.     When      set,  any    subsequent

the beginning of data EEPROM memory. When writing                      operations will operate on the program memory.

to unimplemented locations, the on-chip charge pump

will be turned off.                                                    Control bits, RD and WR, initiate read and write or

When      interfacing    the   program     memory     block,     the   erase, respectively. These bits cannot be cleared, only

EEDATA and EEDATH registers form a two-byte word                       set, in software. They are cleared in hardware at com-

that holds the 14-bit data for read/write and the EEADR                pletion of the read or write operation. The inability to

and EEADRH registers form a two-byte word that holds                   clear the WR bit in software prevents the accidental,

the  13-bit    address   of   the    program   memory        location  premature termination of a write operation.

being accessed. These devices have 4 or 8K words of                    The WREN bit, when set, will allow a write or erase

program Flash, with an address range from 0000h to                     operation. On power-up, the WREN bit is clear. The

0FFFh for the PIC16F873A/874A and 0000h to 1FFFh                       WRERR bit is set when a write (or erase) operation is

for the PIC16F876A/877A. Addresses above the range                     interrupted by a MCLR or a WDT Time-out Reset dur-

of   the   respective    device      will  wraparound        to  the   ing   normal  operation.  In   these   situations,    following

beginning of program memory.                                           Reset, the user can check the WRERR bit and rewrite

The EEPROM data memory allows single-byte read and                     the location. The data and address will be unchanged

write. The Flash program memory allows single-word                     in the EEDATA and EEADR registers.

reads     and  four-word      block  writes.   Program       memory    Interrupt flag bit, EEIF in the PIR2 register, is set when

write operations automatically perform an erase-before-                the write is complete. It must be cleared in software.

write  on  blocks    of  four  words.      A   byte   write  in  data  EECON2 is not a physical register. Reading EECON2

EEPROM         memory    automatically        erases  the    location  will  read    all  ‘0’s.  The  EECON2       register  is  used

and writes the new data (erase-before-write).                          exclusively in the EEPROM write sequence.

The write time is controlled by an on-chip timer. The                  Note:         The self-programming mechanism for Flash

write/erase    voltages       are  generated   by     an     on-chip                 program memory has been changed. On

charge pump, rated to operate over the voltage range                                 previous    PIC16F87X    devices,  Flash        pro-

of the device for byte or word operations.                                           gramming was done in single-word erase/

When      the  device    is   code-protected,  the    CPU        may                 write  cycles.   The     newer   PIC18F87XA

continue to read and write the data EEPROM memory.                                   devices     use  a    four-word    erase/write

Depending on the settings of the write-protect bits, the                             cycle. See Section 3.6 “Writing to Flash

device may or may not be able to write certain blocks                                Program Memory” for more information.

of the program memory; however, reads of the program

memory are allowed. When code-protected, the device

programmer can no longer access data or program

memory; this does NOT inhibit internal reads or writes.

 2001-2013 Microchip Technology Inc.                                                                            DS39582C-page 33
PIC16F87XA

REGISTER 3-1:     EECON1 REGISTER (ADDRESS 18Ch)

                  R/W-x           U-0        U-0        U-0       R/W-x  R/W-0          R/S-0                R/S-0

                  EEPGD           —          —          —         WRERR  WREN           WR                   RD

                  bit 7                                                                                      bit 0

bit  7            EEPGD: Program/Data EEPROM Select bit

                  1 = Accesses program memory

                  0 = Accesses data memory

                  Reads ‘0’ after a POR; this bit cannot be changed while a write operation is in progress.

bit  6-4          Unimplemented: Read as ‘0’

bit  3            WRERR: EEPROM Error Flag bit

                  1=  A write operation is prematurely terminated (any MCLR or any WDT Reset during normal

                      operation)

                  0=  The write operation completed

bit  2            WREN: EEPROM Write Enable bit

                  1 = Allows write cycles

                  0 = Inhibits write to the EEPROM

bit  1            WR: Write Control bit

                  1=  Initiates a write cycle. The bit is cleared by hardware once write is complete. The WR bit

                      can only be set (not cleared) in software.

                  0=  Write cycle to the EEPROM is complete

bit  0            RD: Read Control bit

                  1=  Initiates an EEPROM read; RD is cleared in hardware. The  RD bit can only be set (not

                      cleared) in software.

                  0=  Does not initiate an EEPROM read

                  Legend:

                  R = Readable bit           W = Writable bit     U = Unimplemented bit, read as ‘0’

                  - n = Value at POR         ‘1’ = Bit is set     ‘0’ = Bit is cleared  x = Bit is unknown

DS39582C-page 34                                                          2001-2013 Microchip Technology Inc.
                                                                                                                  PIC16F87XA

3.3        Reading Data EEPROM Memory                                         The steps to write to EEPROM data memory are:

To read a data memory location, the user must write the                       1.        If step 10 is not implemented, check the WR bit

address to the EEADR register, clear the EEPGD con-                                     to see if a write is in progress.

trol  bit  (EECON1<7>)        and       then   set    control     bit   RD    2.        Write the address to EEADR. Make sure that the

(EECON1<0>). The data is available in the very next                                     address is not larger than the memory size of

cycle in the EEDATA register; therefore, it can be read                                 the device.

in the next instruction (see Example 3-1). EEDATA will                        3.        Write the 8-bit data value to be programmed in

hold this value until another read or until it is written to                            the EEDATA register.

by the user (during a write operation).                                       4.        Clear the EEPGD bit to point to EEPROM data

The steps to reading the EEPROM data memory are:                                        memory.

1.    Write the address to EEADR. Make sure that the                          5.        Set the WREN bit to enable program operations.

      address is not larger than the memory size of                           6.        Disable interrupts (if enabled).

      the device.                                                             7.        Execute the special five instruction sequence:

2.    Clear the EEPGD bit to point to EEPROM data                                       •         Write 55h to EECON2 in two steps (first

      memory.                                                                                     to W, then to EECON2)

3.    Set the RD bit to start the read operation.                                       •         Write AAh to EECON2 in two steps (first

4.    Read the data from the EEDATA register.                                                     to W, then to EECON2)

                                                                                        •         Set the WR bit

EXAMPLE          3-1:         DATA EEPROM READ                                8.        Enable interrupts (if using interrupts).

      BSF          STATUS,RP1               ;                                 9.        Clear            the   WREN   bit  to  disable     program

      BCF          STATUS,RP0               ;  Bank       2                             operations.

      MOVF         DATA_EE_ADDR,W           ;  Data       Memory              10.       At the completion of the write cycle, the WR bit

      MOVWF        EEADR                    ;  Address       to   read                  is cleared and the EEIF interrupt flag bit is set.

      BSF          STATUS,RP0               ;  Bank       3                             (EEIF must be cleared by firmware.) If step 1 is

      BCF          EECON1,EEPGD             ;  Point         to   Data                  not implemented, then firmware should check

                                            ;  memory

      BSF          EECON1,RD                ;  EE     Read                              for EEIF to be set, or WR to clear, to indicate the

      BCF          STATUS,RP0               ;  Bank       2                             end of the program cycle.

      MOVF         EEDATA,W                 ;  W   =  EEDATA

                                                                              EXAMPLE                    3-2:     DATA EEPROM WRITE

3.4        Writing to Data EEPROM Memory                                                          BSF    STATUS,RP1        ;

                                                                                                  BSF    STATUS,RP0

To write an EEPROM data location, the user must first                                             BTFSC  EECON1,WR         ;Wait   for     write

write the address to the EEADR register and the data to                                           GOTO   $-1               ;to   complete

the   EEDATA       register.  Then      the    user   must        follow  a                       BCF    STATUS,    RP0    ;Bank   2

specific write sequence to initiate the write for each byte.                                      MOVF   DATA_EE_ADDR,W    ;Data   Memory

                                                                                                  MOVWF  EEADR             ;Address       to  write

The write will not initiate if the write sequence is not                                          MOVF   DATA_EE_DATA,W    ;Data   Memory     Value

exactly followed (write 55h to EECON2, write AAh to                                               MOVWF  EEDATA            ;to   write

EECON2, then set WR bit) for each byte. We strongly                                               BSF    STATUS,RP0        ;Bank   3

recommend        that  interrupts       be   disabled        during     this                      BCF    EECON1,EEPGD      ;Point     to   DATA

code segment (see Example 3-2).                                                                                            ;memory

                                                                                                  BSF    EECON1,WREN       ;Enable    writes

Additionally, the WREN bit in EECON1 must be set to

enable     write.  This     mechanism          prevents      accidental                           BCF    INTCON,GIE        ;Disable       INTs.

writes to data EEPROM due to errant (unexpected)                                                  MOVLW  55h               ;

code execution (i.e., lost programs). The user should                         Required  Sequence  MOVWF  EECON2            ;Write     55h

keep the WREN bit clear at all times, except when                                                 MOVLW  AAh               ;

updating   EEPROM.            The  WREN        bit    is     not  cleared                         MOVWF  EECON2            ;Write     AAh

by hardware                                                                                       BSF    EECON1,WR         ;Set   WR  bit     to

                                                                                                                           ;begin     write

After a write sequence has been initiated, clearing the                                           BSF    INTCON,GIE        ;Enable    INTs.

WREN bit will not affect this write cycle. The WR bit will                                        BCF    EECON1,WREN       ;Disable       writes

be inhibited from being set unless the WREN bit is set.

At    the  completion    of   the  write     cycle,   the    WR      bit  is

cleared    in    hardware     and   the      EE     Write    Complete

Interrupt Flag bit (EEIF) is set. The user can either

enable     this  interrupt    or  poll  this   bit.   EEIF        must    be

cleared by software.

 2001-2013 Microchip Technology Inc.                                                                                            DS39582C-page 35
PIC16F87XA

3.5                 Reading Flash Program Memory                             ing the “BSF     EECON1,RD” instruction to be ignored.

                                                                             The  data    is  available    in  the  very  next  cycle  in  the

To read a program memory location, the user must write                       EEDATA and EEDATH registers; therefore, it can be

two bytes of the address to the EEADR and EEADRH                             read as two bytes in the following instructions. EEDATA

registers, set the EEPGD control bit (EECON1<7>) and                         and EEDATH registers will hold this value until another

then set control bit RD (EECON1<0>). Once the read                           read or until it is written to by the user (during a write

control bit is set, the program memory Flash controller                      operation).

will use the next two instruction cycles to read the data.

This causes these two instructions immediately follow-

EXAMPLE                3-3:   FLASH PROGRAM       READ

                       BSF    STATUS,  RP1     ;

                       BCF    STATUS,  RP0     ;  Bank      2

                       MOVLW  MS_PROG_EE_ADDR  ;

                       MOVWF  EEADRH           ;  MS     Byte      of  Program    Address     to     read

                       MOVLW  LS_PROG_EE_ADDR  ;

                       MOVWF  EEADR            ;  LS     Byte      of  Program    Address     to     read

                       BSF    STATUS,  RP0     ;  Bank      3

                       BSF    EECON1,  EEPGD   ;  Point        to  PROGRAM       memory

                       BSF    EECON1,  RD      ;  EE     Read

Required  Sequence  ;

                       NOP

                       NOP                     ;  Any    instructions            here  are    ignored      as  program

                                               ;  memory       is      read  in   second      cycle  after     BSF  EECON1,RD

                    ;

                       BCF    STATUS,  RP0     ;  Bank      2

                       MOVF   EEDATA,  W       ;  W   =  LS    Byte    of    Program     EEDATA

                       MOVWF  DATAL            ;

                       MOVF   EEDATH,  W       ;  W   =  MS    Byte    of    Program     EEDATA

                       MOVWF  DATAH            ;

DS39582C-page 36                                                                                      2001-2013 Microchip Technology Inc.
                                                                                                   PIC16F87XA

3.6   Writing to Flash Program Memory                                  To transfer data from the buffer registers to the program

                                                                       memory, the EEADR and EEADRH must point to the last

Flash program memory may only be written to if the                     location in the four-word block (EEADR<1:0> = 11).

destination address is in a segment of memory that is                  Then  the    following      sequence         of  events      must    be

not write-protected, as defined in bits WRT1:WRT0 of                   executed:

the   device  configuration  word    (Register 14-1).   Flash          1.   Set the EEPGD control bit (EECON1<7>).

program memory must be written in four-word blocks. A

block consists of four words with sequential addresses,                2.   Write   55h,     then     AAh,      to  EECON2          (Flash

with a lower boundary defined by an address, where                          programming sequence).

EEADR<1:0> = 00. At the same time, all block writes to                 3.   Set control bit WR (EECON1<1>) to begin the

program memory are done as erase and write opera-                           write operation.

tions. The write operation is edge-aligned and cannot                  The user must follow the same specific sequence to ini-

occur across boundaries.                                               tiate the write for each word in the program block, writ-

To write program data, it must first be loaded into the                ing each program word in sequence (00,01,10,11).

buffer registers (see Figure 3-1). This is accomplished                When  the      write   is      performed     on    the     last   word

by first writing the destination address to EEADR and                  (EEADR<1:0>        =  11),     the  block    of    four  words     are

EEADRH and then writing the data to EEDATA and                         automatically   erased      and     the  contents  of      the    buffer

EEDATH. After the address and data have been set up,                   registers are written into the program memory.

then  the     following  sequence        of  events  must     be       After the “BSF  EECON1,WR” instruction, the processor

executed:                                                              requires two cycles to set up the erase/write operation.

1.    Set the EEPGD control bit (EECON1<7>).                           The user must place two NOP instructions after the WR

2.    Write   55h,   then    AAh,    to  EECON2       (Flash           bit is set. Since data is being written to buffer registers,

      programming sequence).                                           the writing of the first three words of the block appears

3.    Set the WR control bit (EECON1<1>).                              to occur immediately. The processor will halt internal

                                                                       operations for the typical 4 ms, only during the cycle in

All four buffer register locations MUST be written to with             which the erase takes place (i.e., the last word of the

correct data. If only one, two or three words are being                four-word block). This is not Sleep mode as the clocks

written to in the block of four words, then a read from                and   peripherals     will  continue     to  run.  After     the  write

the program memory location(s) not being written to                    cycle, the processor will resume operation with the third

must be performed. This takes the data from the pro-                   instruction after the EECON1 write instruction. If the

gram location(s) not being written and loads it into the               sequence is performed to any other location, the action

EEDATA and EEDATH registers. Then the sequence of                      is ignored.

events to transfer data to the buffer registers must be

executed.

FIGURE 3-1:                BLOCK WRITES TO FLASH PROGRAM MEMORY

                                             7       5            07                               0

                                                        EEDATH               EEDATA                                     Four words of

                                                                                                                        Flash are erased,

                                                           6                           8                                then all buffers

                                                                                                                        are transferred

                                                                                                                        to Flash

              First word of block                                                                                       automatically

              to be written                                                                                             after this word

                                                                                                                        is written

                             14                            14                          14                                 14

    EEADR<1:0> = 00                  EEADR<1:0> = 01              EEADR<1:0> = 10                  EEADR<1:0> = 11

                    Buffer Register             Buffer Register              Buffer Register                        Buffer Register

                                                              Program  Memory

 2001-2013 Microchip Technology Inc.                                                                                   DS39582C-page 37
PIC16F87XA

An example of the complete four-word write sequence

is shown in Example 3-4. The initial address is loaded

into the EEADRH:EEADR register pair; the four words

of data are loaded using indirect addressing.

EXAMPLE 3-4:                         WRITING TO FLASH PROGRAM MEMORY

;  This                write  routine     assumes   the  following:

;

;  1.        A         valid  starting    address   (the    least   significant           bits   =  ‘00’)is    loaded     in  ADDRH:ADDRL

;  2.        The       8    bytes    of  data  are  loaded,    starting      at     the   address     in   DATADDR

;  3.        ADDRH,           ADDRL  and  DATADDR   are   all  located       in     shared   data     memory   0x70   -   0x7f

;

                       BSF    STATUS,RP1                 ;

                       BCF    STATUS,RP0                 ;   Bank   2

                       MOVF   ADDRH,W                    ;   Load   initial         address

                       MOVWF  EEADRH                     ;

                       MOVF   ADDRL,W                    ;

                       MOVWF  EEADR                      ;

                       MOVF   DATAADDR,W                 ;   Load   initial         data   address

                       MOVWF  FSR                        ;

LOOP                   MOVF   INDF,W                     ;   Load   first       data   byte     into    lower

                       MOVWF  EEDATA                     ;

                       INCF   FSR,F                      ;   Next   byte

                       MOVF   INDF,W                     ;   Load   second       data     byte   into   upper

                       MOVWF  EEDATH                     ;

                       INCF   FSR,F                      ;

                       BSF    STATUS,RP0                 ;   Bank   3

                       BSF    EECON1,EEPGD               ;   Point     to   program       memory

                       BSF    EECON1,WREN                ;   Enable     writes

                       BCF    INTCON,GIE                 ;   Disable       interrupts       (if   using)

                       MOVLW  55h                        ;   Start     of   required       write    sequence:

                       MOVWF  EECON2                     ;   Write     55h

                       MOVLW  AAh                        ;

   Required  Sequence  MOVWF  EECON2                     ;   Write     AAh

                       BSF    EECON1,WR                  ;   Set   WR   bit     to  begin    write

                       NOP                               ;   Any   instructions           here   are    ignored  as   processor

                                                         ;   halts     to   begin     write     sequence

                       NOP                               ;   processor       will     stop   here     and  wait  for      write  complete

                                                         ;   after     write     processor       continues     with   3rd  instruction

                       BCF    EECON1,WREN                ;   Disable       writes

                       BSF    INTCON,GIE                 ;   Enable     interrupts         (if   using)

                       BCF    STATUS,RP0                 ;   Bank   2

                       INCF   EEADR,F                    ;   Increment       address

                       MOVF   EEADR,W                    ;   Check     if   lower     two   bits    of  address      are  ‘00’

                       ANDLW  0x03                       ;   Indicates       when     four   words      have   been  programmed

                       XORLW  0x03                       ;

                       BTFSC  STATUS,Z                   ;   Exit   if     more     than   four   words,

                       GOTO   LOOP                       ;   Continue       if   less     than   four   words

DS39582C-page 38                                                                                                2001-2013 Microchip Technology  Inc.
                                                                                        PIC16F87XA

3.7      Protection Against Spurious Write                        3.8        Operation During Code-Protect

There are conditions when the device should not write             When the data EEPROM is code-protected, the micro-

to the data EEPROM or Flash program memory. To                    controller can read and write to the EEPROM normally.

protect against spurious writes, various mechanisms               However,   all  external  access      to  the   EEPROM      is

have been built-in. On power-up, WREN is cleared.                 disabled. External write access to the program memory

Also, the Power-up Timer (72 ms duration) prevents an             is also disabled.

EEPROM write.                                                     When program memory is code-protected, the microcon-

The write initiate sequence and the WREN bit together             troller can read and write to program memory normally,

help  prevent  an  accidental  write   during  brown-out,         as well as execute instructions. Writes by the device may

power glitch or software malfunction.                             be selectively inhibited to regions of the memory depend-

                                                                  ing on the setting of bits WR1:WR0 of the configuration

                                                                  word (see Section 14.1 “Configuration Bits” for addi-

                                                                  tional information). External access to the memory is also

                                                                  disabled.

TABLE 3-1:         REGISTERS/BITS ASSOCIATED WITH DATA EEPROM AND

                   FLASH PROGRAM MEMORIES

                                                                                                        Value on  Value on

Address        Name  Bit 7     Bit 6   Bit 5   Bit 4       Bit 3  Bit 2      Bit 1      Bit 0           Power-on  all other

                                                                                                        Reset     Resets

10Ch     EEDATA      EEPROM/Flash Data Register Low Byte                                        xxxx        xxxx  uuuu  uuuu

10Dh     EEADR       EEPROM/Flash Address Register Low Byte                                     xxxx        xxxx  uuuu  uuuu

10Eh     EEDATH      —         —       EEPROM/Flash Data Register High Byte                     xxxx        xxxx  ---0  q000

10Fh     EEADRH      —         —       —       EEPROM/Flash Address Register High Byte          xxxx        xxxx  ----  ----

18Ch     EECON1      EEPGD     —       —       —           WRERR  WREN       WR             RD  x---        x000  ---0  q000

18Dh     EECON2      EEPROM Control Register 2 (not a physical register)                        ----        ----  ----  ----

0Dh      PIR2        —         CMIF    —       EEIF        BCLIF          —       —     CCP2IF  -0-0        0--0  -0-0  0--0

8Dh      PIE2        —         CMIE    —       EEIE        BCLIE          —       —     CCP2IE  -0-0        0--0  -0-0  0--0

Legend:  x = unknown, u = unchanged, - = unimplemented, read as ‘0’, q = value depends upon condition.

         Shaded cells are not used by data EEPROM or Flash program memory.

 2001-2013 Microchip Technology Inc.                                                                       DS39582C-page 39
PIC16F87XA

NOTES:

DS39582C-page 40   2001-2013 Microchip Technology Inc.
                                                                                            PIC16F87XA

4.0         I/O PORTS                                              EXAMPLE 4-1:                INITIALIZING PORTA

Some pins for these I/O ports are multiplexed with an              BCF        STATUS,  RP0         ;

alternate    function  for  the  peripheral  features   on  the    BCF        STATUS,  RP1         ;    Bank0

                                                                   CLRF       PORTA                ;    Initialize         PORTA      by

device. In general, when a peripheral is enabled, that                                             ;    clearing      output

pin may not be used as a general purpose I/O pin.                                                  ;    data    latches

Additional information on I/O ports may be found in the            BSF        STATUS,  RP0         ;    Select      Bank   1

PIC® Mid-Range Reference Manual (DS33023).                         MOVLW      0x06                 ;    Configure        all   pins

                                                                   MOVWF      ADCON1               ;    as   digital       inputs

                                                                   MOVLW      0xCF                 ;    Value   used       to

4.1         PORTA and the TRISA Register                                                           ;    initialize         data

PORTA is a 6-bit wide, bidirectional port. The corre-                                              ;    direction

                                                                   MOVWF      TRISA                ;    Set  RA<3:0>       as  inputs

sponding data direction register is TRISA. Setting a                                               ;    RA<5:4>      as    outputs

TRISA bit (= 1) will make the corresponding PORTA pin                                              ;    TRISA<7:6>are          always

an input (i.e., put the corresponding output driver in a                                           ;    read    as   '0'.

High-Impedance mode). Clearing a TRISA bit (= 0) will

make the corresponding PORTA pin an output (i.e., put

the contents of the output latch on the selected pin).             FIGURE     4-1:             BLOCK DIAGRAM                   OF

Reading the PORTA register reads the status of the                                             RA3:RA0 PINS

pins, whereas writing to it will write to the port latch. All      Data       Data   Latch

write  operations      are  read-modify-write     operations.      Bus

Therefore, a write to a port implies that the port pins are                   D             Q

read, the value is modified and then written to the port           WR                                                 VDD

data latch.                                                        PORTA      CK       Q

Pin RA4 is multiplexed with the Timer0 module clock                                                                     P      I/O pin(1)

input to become the RA4/T0CKI pin. The RA4/T0CKI                              TRIS   Latch

pin is a Schmitt Trigger input and an open-drain output.                      D             Q                         N

All other PORTA pins have TTL input levels and full

CMOS output drivers.                                               WR

Other PORTA pins are multiplexed with analog inputs                TRISA      CK       Q                              VSS

and the analog VREF input for both the A/D converters                                                         Analog

                                                                                                              Input

and    the  comparators.    The  operation   of   each  pin    is                                             Mode

selected by clearing/setting the appropriate control bits

in the ADCON1 and/or CMCON registers.                              RD

                                                                   TRISA                                                       TTL

Note:        On a Power-on Reset, these pins are con-                                                                          Input

             figured as analog inputs and read as ‘0’.                                                                         Buffer

             The   comparators   are   in    the  off  (digital)                                        Q        D

             state.

The TRISA register controls the direction of the port                                                           EN

pins even when they are being used as analog inputs.

The user must ensure the bits in the TRISA register are            RD PORTA

maintained set when using them as analog inputs.

                                                                   To A/D Converter or Comparator

                                                                   Note   1:  I/O pins have protection  diodes  to VDD  and  VSS.

 2001-2013 Microchip Technology Inc.                                                                           DS39582C-page 41
PIC16F87XA

FIGURE 4-2:       BLOCK DIAGRAM OF RA4/T0CKI                            PIN

                         CMCON<2:0> = x01 or 011

                         C1OUT

                         Data Bus            Data Latch          1

                                                D   Q

                         WR PORTA                                                         N    I/O pin(1)

                                                CK  Q            0

                                             TRIS Latch                                   VSS

                                                D   Q

                         WR TRISA               CK  Q                               Schmitt

                                                                                    Trigger

                                                                                    Input

                                                                                    Buffer

                         RD TRISA

                                                                             Q      D

                                                                                    ENEN

                         RD PORTA

                         TMR0 Clock Input

                         Note 1: I/O pin has protection     diodes  to  VSS  only.

FIGURE 4-3:       BLOCK DIAGRAM OF                  RA5     PIN

                  CMCON<2:0> = 011 or 101

                  C2OUT

                                   Data Latch                                       VDD

                  Data Bus         D         Q           1

                  WR PORTA         CK        Q                                      P

                                                         0

                                   TRIS Latch                                       N                    I/O pin(1)

                                   D         Q                                                 Analog

                                                                                               IIP Mode

                  WR TRISA         CK        Q

                                                                                    VSS                  TTL

                                                                                                         Input

                                                                                                         Buffer

                  RD TRISA

                                                                                Q         D

                                                                                    ENEN

                  RD PORTA

                  A/D Converter or SS Input

                  Note 1: I/O pin has protection diodes to VDD and VSS.

DS39582C-page 42                                                                                2001-2013 Microchip  Technology  Inc.
                                                                                         PIC16F87XA

TABLE 4-1:       PORTA FUNCTIONS

         Name            Bit#          Buffer                                  Function

RA0/AN0                  bit 0         TTL     Input/output or analog input.

RA1/AN1                  bit 1         TTL     Input/output or analog input.

RA2/AN2/VREF-/CVREF      bit 2         TTL     Input/output or analog input or VREF- or CVREF.

RA3/AN3/VREF+            bit 3         TTL     Input/output or analog input or VREF+.

RA4/T0CKI/C1OUT          bit 4         ST      Input/output or external clock input for Timer0 or  comparator output.

                                               Output is open-drain type.

RA5/AN4/SS/C2OUT         bit 5         TTL     Input/output or analog input or slave select input  for synchronous serial

                                               port or comparator output.

Legend:  TTL = TTL input, ST = Schmitt         Trigger input

TABLE 4-2:       SUMMARY OF REGISTERS ASSOCIATED WITH                          PORTA

                                                                                                   Value on:        Value on

Address  Name     Bit 7  Bit 6         Bit 5    Bit 4         Bit 3   Bit 2    Bit 1     Bit 0     POR, BOR         all other

                                                                                                                    Resets

05h      PORTA       —          —          RA5  RA4           RA3     RA2      RA1       RA0       --0x   0000   --0u  0000

85h      TRISA       —          —      PORTA Data Direction Register                               --11   1111   --11  1111

9Ch      CMCON    C2OUT  C1OUT         C2INV    C1INV         CIS     CM2      CM1       CM0       0000   0111   0000  0111

9Dh      CVRCON   CVREN  CVROE         CVRR     —             CVR3    CVR2     CVR1      CVR0      000-   0000   000-  0000

9Fh      ADCON1   ADFM   ADCS2              —   —             PCFG3   PCFG2    PCFG1   PCFG0       00--   0000   00--  0000

Legend:  x = unknown, u = unchanged, - = unimplemented locations read as ‘0’.  Shaded cells are not used by PORTA.

Note:    When using the SSP module in SPI Slave mode and SS enabled, the A/D converter must be set to one of

         the following modes, where PCFG3:PCFG0 = 0100,               0101,    011x,   1101,       1110,  1111.

 2001-2013 Microchip Technology Inc.                                                                     DS39582C-page 43
PIC16F87XA

4.2        PORTB and the TRISB Register                                   This interrupt can wake the device from Sleep. The

                                                                          user, in the Interrupt Service Routine, can clear the

PORTB is an 8-bit wide, bidirectional port. The corre-                    interrupt in the following manner:

sponding data direction register is TRISB. Setting a                      a)  Any read or write of PORTB. This will end the

TRISB bit (= 1) will make the corresponding PORTB                             mismatch condition.

pin an input (i.e., put the corresponding output driver in

a High-Impedance mode). Clearing a TRISB bit (= 0)                        b)  Clear flag bit RBIF.

will make the corresponding PORTB pin an output (i.e.,                    A mismatch condition will continue to set flag bit RBIF.

put the contents of the output latch on the selected pin).                Reading PORTB will end the mismatch condition and

Three pins of PORTB are multiplexed with the In-Circuit                   allow flag bit RBIF to be cleared.

Debugger       and  Low-Voltage    Programming                 function:  The interrupt-on-change feature is recommended for

RB3/PGM,       RB6/PGC        and  RB7/PGD.      The           alternate  wake-up on key depression operation and operations

functions of these pins are described in Section 14.0                     where PORTB is only used for the interrupt-on-change

“Special Features of the CPU”.                                            feature. Polling of PORTB is not recommended while

Each of the PORTB pins has a weak internal pull-up. A                     using the interrupt-on-change feature.

single control bit can turn on all the pull-ups. This is per-             This interrupt-on-mismatch feature, together with soft-

formed by clearing bit RBPU (OPTION_REG<7>). The                          ware configurable pull-ups on these four pins, allow

weak pull-up is automatically turned off when the port                    easy interface to a keypad and make it possible for

pin  is    configured     as  an   output.  The    pull-ups       are     wake-up on key depression. Refer to the application

disabled on a Power-on Reset.                                             note, AN552, “Implementing Wake-up on Key Stroke”

                                                                          (DS00552).

FIGURE 4-4:                   BLOCK DIAGRAM OF                            RB0/INT       is  an  external    interrupt     input      pin  and    is

                              RB3:RB0 PINS                                configured using the INTEDG bit (OPTION_REG<6>).

                                                    VDD                   RB0/INT is discussed in detail in Section 14.11.1 “INT

     RBPU(2)                                             Weak             Interrupt”.

                                                    P    Pull-up

                    Data Latch

     Data Bus          D      Q                                           FIGURE 4-5:               BLOCK DIAGRAM OF

     WR Port                                           I/O pin(1)                                   RB7:RB4 PINS

                       CK

                    TRIS Latch                                                                                                    VDD

                                                                              RBPU(2)                                                Weak

                       D      Q             TTL                                                                                   P  Pull-up

     WR TRIS                                Input                                               Data Latch

                       CK                   Buffer                            Data Bus          D   Q

                                                                              WR Port                                                I/O pin(1)

                                                                                                CK

     RD TRIS

                                                                                                TRIS Latch

                                   Q        D                                                   D   Q

     RD Port                                                                  WR TRIS           CK                        TTL

                                            EN                                                                            Input

                                                                                                                          Buffer          ST

     RB0/INT                                                                                                                            Buffer

     RB3/PGM                                                                  RD TRIS

                           Schmitt Trigger          RD Port                                                    Latch

                           Buffer                                                                           Q          D

     Note  1:  I/O pins have diode protection to VDD and VSS.                 RD Port

                                                                                                                       EN                 Q1

           2:  To enable weak pull-ups, set the appropriate TRIS              Set RBIF

               bit(s) and clear the RBPU bit (OPTION_REG<7>).

Four of the PORTB pins, RB7:RB4, have an interrupt-                                                         Q          D

on-change feature. Only pins configured as inputs can                         From other                                             RD Port

                                                                              RB7:RB4 pins                     EN

cause this interrupt to occur (i.e., any RB7:RB4 pin                                                                                      Q3

configured as an output is excluded from the interrupt-                       RB7:RB6

on-change comparison). The input pins (of RB7:RB4)                            In Serial Programming Mode

are compared with the old value latched on the last                           Note  1:  I/O pins have diode protection to VDD and VSS.

read of PORTB. The “mismatch” outputs of RB7:RB4                                    2:  To enable weak pull-ups, set the appropriate TRIS

are OR’ed together to generate the RB port change                                       bit(s) and clear the RBPU bit (OPTION_REG<7>).

interrupt with flag bit RBIF (INTCON<0>).

DS39582C-page 44                                                                                    2001-2013 Microchip Technology Inc.
                                                                                    PIC16F87XA

TABLE 4-3:  PORTB FUNCTIONS

Name        Bit#       Buffer                                         Function

RB0/INT     bit 0      TTL/ST(1)       Input/output pin or external interrupt input. Internal software programmable

                                       weak pull-up.

RB1         bit 1      TTL             Input/output pin. Internal software programmable weak pull-up.

RB2         bit 2      TTL             Input/output pin. Internal software programmable weak pull-up.

RB3/PGM(3)  bit 3      TTL             Input/output pin or programming pin in LVP mode. Internal software

                                       programmable weak pull-up.

RB4         bit 4      TTL             Input/output pin (with interrupt-on-change). Internal software programmable

                                       weak pull-up.

RB5         bit 5      TTL             Input/output pin (with interrupt-on-change). Internal software programmable

                                       weak pull-up.

RB6/PGC     bit 6      TTL/ST(2)       Input/output pin (with interrupt-on-change) or in-circuit debugger pin.

                                       Internal software programmable weak pull-up. Serial programming clock.

RB7/PGD     bit 7      TTL/ST(2)       Input/output pin (with interrupt-on-change) or in-circuit debugger pin.

                                       Internal software programmable weak pull-up. Serial programming data.

Legend:    TTL = TTL input, ST = Schmitt Trigger input

Note  1:   This buffer is a Schmitt Trigger input when configured as the external interrupt.

      2:   This buffer is a Schmitt Trigger input when used in Serial Programming mode or in-circuit debugger.

      3:   Low-Voltage ICSP Programming (LVP) is enabled by default which disables the RB3 I/O function. LVP

           must be disabled to enable RB3 as an I/O pin and allow maximum compatibility to the other 28-pin and

           40-pin mid-range devices.

TABLE 4-4:  SUMMARY OF REGISTERS ASSOCIATED WITH PORTB

                                                                                              Value on:         Value on

Address     Name       Bit 7           Bit 6   Bit 5    Bit 4  Bit 3  Bit 2  Bit 1  Bit 0     POR, BOR          all other

                                                                                                                Resets

06h, 106h  PORTB       RB7             RB6     RB5      RB4    RB3    RB2    RB1    RB0       xxxx  xxxx  uuuu   uuuu

86h, 186h  TRISB       PORTB Data Direction Register                                          1111  1111  1111   1111

81h, 181h  OPTION_REG  RBPU            INTEDG  T0CS     T0SE   PSA    PS2    PS1    PS0       1111  1111  1111   1111

Legend:    x = unknown, u = unchanged. Shaded cells are not used by PORTB.

 2001-2013 Microchip Technology Inc.                                                               DS39582C-page 45
PIC16F87XA

4.3           PORTC and the TRISC Register                                   FIGURE 4-7:                PORTC BLOCK DIAGRAM

PORTC is an 8-bit wide, bidirectional port. The corre-                                                  (PERIPHERAL OUTPUT

sponding data direction register is TRISC. Setting a                                                    OVERRIDE) RC<4:3>

TRISC bit (= 1) will make the corresponding PORTC                            Port/Peripheral Select(2)

pin an input (i.e., put the corresponding output driver in

a High-Impedance mode). Clearing a TRISC bit (= 0)                           Peripheral Data Out        0

will make the corresponding PORTC pin an output (i.e.,                                                                               VDD

put the contents of the output latch on the selected pin).                   Data Bus    D        Q

                                                                                                                                     P

PORTC is multiplexed with several peripheral functions                       WR Port     CK       Q     1

(Table 4-5). PORTC pins have Schmitt Trigger input                                       Data Latch

buffers.                                                                                                                                        I/O
                                                                                                                                             pin(1)
When the I2C module is enabled, the PORTC<4:3>                                           D        Q

pins can be configured with normal I2C levels, or with                       WR TRIS     CK       Q                                  N

SMBus levels, by using the CKE bit (SSPSTAT<6>).                                         TRIS Latch

When enabling peripheral functions, care should be                                                                          VSS

taken in defining TRIS bits for each PORTC pin. Some                         RD TRIS                                        Schmitt

peripherals override the TRIS bit to make a pin an                                                                          Trigger

output, while other peripherals override the TRIS bit to                     Peripheral

make a pin an input. Since the TRIS bit override is in                       OE(3)                               Q     D                  Schmitt

effect  while  the   peripheral         is  enabled,          read-modify-                                                                Trigger

                                                                                                                       EN                 with

write instructions (BSF, BCF, XORWF) with TRISC as the                       RD Port                                                      SMBus

destination, should be avoided. The user should refer                                                                                0    Levels

to the corresponding peripheral section for the correct                      SSP Input

TRIS bit settings.                                                                                                                   1

                                                                                                                       CKE

FIGURE 4-6:                    PORTC BLOCK DIAGRAM                                                                     SSPSTAT<6>

                               (PERIPHERAL OUTPUT                            Note   1:   I/O pins have diode protection to VDD and VSS.

                               OVERRIDE) RC<2:0>,                                   2:   Port/Peripheral Select signal selects between port data

                               RC<7:5>                                                   and peripheral output.

                                                                                    3:   Peripheral OE (Output Enable) is only activated if

Port/Peripheral Select(2)                                                                Peripheral Select is active.

Peripheral Data Out            0                              VDD

Data Bus       D          Q

                                                              P

WR Port        CK         Q    1

               Data Latch

                                                                   I/O
                                                                   pin(1)
               D          Q

WR TRIS        CK         Q                                   N

               TRIS Latch

                                                              VSS

RD TRIS                                             Schmitt

                                                    Trigger

Peripheral

OE(3)                                   Q       D

                                                EN

RD Port

Peripheral Input

Note      1:  I/O pins have diode protection to VDD and VSS.

          2:  Port/Peripheral  Select   signal  selects  between   port

              data and peripheral output.

          3:  Peripheral  OE   (Output  Enable)     is  only  activated  if

              Peripheral Select is active.

DS39582C-page 46                                                                                   2001-2013 Microchip Technology Inc.
                                                                                       PIC16F87XA

TABLE 4-5:       PORTC FUNCTIONS

     Name        Bit#   Buffer Type                                             Function

RC0/T1OSO/T1CKI  bit 0                 ST         Input/output port pin or Timer1 oscillator output/Timer1 clock input.

RC1/T1OSI/CCP2   bit 1                 ST         Input/output port pin or Timer1 oscillator input or Capture2 input/

                                                  Compare2 output/PWM2 output.

RC2/CCP1         bit 2                 ST         Input/output port pin or Capture1 input/Compare1 output/

                                                  PWM1 output.

RC3/SCK/SCL      bit 3                 ST         RC3 can also be the synchronous serial clock for both SPI and

                                                  I2C modes.

RC4/SDI/SDA      bit 4                 ST         RC4 can also be the SPI data in (SPI mode) or data I/O (I2C mode).

RC5/SDO          bit 5                 ST         Input/output port pin or Synchronous Serial Port data output.

RC6/TX/CK        bit 6                 ST         Input/output port pin or USART asynchronous transmit or

                                                  synchronous clock.

RC7/RX/DT        bit 7                 ST         Input/output port pin  or USART asynchronous receive or

                                                  synchronous data.

Legend:   ST = Schmitt Trigger input

TABLE 4-6:       SUMMARY OF REGISTERS ASSOCIATED WITH PORTC

                                                                                              Value on:          Value on

Address    Name  Bit 7  Bit 6              Bit 5  Bit 4       Bit 3      Bit 2  Bit 1  Bit 0  POR, BOR           all other

                                                                                                                 Resets

07h       PORTC  RC7    RC6                RC5    RC4         RC3        RC2    RC1    RC0    xxxx  xxxx         uuuu    uuuu

87h       TRISC  PORTC Data Direction Register                                                1111  1111         1111    1111

Legend:   x = unknown, u = unchanged

 2001-2013 Microchip Technology Inc.                                                               DS39582C-page 47
PIC16F87XA

4.4         PORTD and TRISD Registers                                           FIGURE          4-8:             PORTD BLOCK DIAGRAM

                                                                                                                 (IN I/O PORT MODE)

Note:           PORTD and TRISD are not implemented

                on the 28-pin devices.                                                 Data     Data      Latch

                                                                                       Bus            D   Q

PORTD       is  an  8-bit    port    with  Schmitt     Trigger  input                  WR

buffers. Each pin is individually configurable as an input                             Port                                               I/O pin(1)

or output.                                                                                            CK

PORTD       can     be       configured    as     an     8-bit  wide                            TRIS      Latch

microprocessor         port   (Parallel    Slave  Port)  by     setting                               D   Q

control bit, PSPMODE (TRISE<4>). In this mode, the                                     WR

input buffers are TTL.                                                                 TRIS           CK                   Schmitt

                                                                                                                           Trigger

                                                                                                                           Input

                                                                                                                           Buffer

                                                                                       RD

                                                                                       TRIS

                                                                                                                  Q        D

                                                                                                                       ENEN

                                                                                       RD Port

                                                                                       Note 1:  I/O pins have protection diodes to VDD and VSS.

TABLE 4-7:             PORTD FUNCTIONS

     Name              Bit#              Buffer Type                                            Function

RD0/PSP0               bit 0               ST/TTL(1)            Input/output port pin  or    Parallel Slave Port  bit  0.

RD1/PSP1               bit 1               ST/TTL(1)            Input/output port pin  or    Parallel Slave Port  bit  1.

RD2/PSP2               bit2                ST/TTL(1)            Input/output port pin  or    Parallel Slave Port  bit  2.

RD3/PSP3               bit 3               ST/TTL(1)            Input/output port pin  or    Parallel Slave Port  bit  3.

RD4/PSP4               bit 4               ST/TTL(1)            Input/output port pin  or    Parallel Slave Port  bit  4.

RD5/PSP5               bit 5               ST/TTL(1)            Input/output port pin  or    Parallel Slave Port  bit  5.

RD6/PSP6               bit 6               ST/TTL(1)            Input/output port pin  or    Parallel Slave Port  bit  6.

RD7/PSP7               bit 7               ST/TTL(1)            Input/output port pin  or    Parallel Slave Port  bit  7.

Legend:         ST =   Schmitt Trigger input, TTL =      TTL input

Note  1:        Input  buffers are Schmitt Triggers      when in I/O mode and          TTL buffers when in Parallel        Slave    Port  mode.

TABLE 4-8:             SUMMARY OF REGISTERS ASSOCIATED WITH PORTD

                                                                                                                       Value on:    Value on

Address         Name          Bit 7  Bit 6     Bit 5     Bit 4           Bit 3  Bit 2           Bit 1     Bit 0        POR, BOR     all other

                                                                                                                                          Resets

08h             PORTD         RD7    RD6          RD5        RD4         RD3    RD2             RD1       RD0     xxxx     xxxx     uuuu         uuuu

88h             TRISD        PORTD Data Direction Register                                                        1111     1111     1111         1111

89h             TRISE         IBF    OBF       IBOV      PSPMODE         —      PORTE Data Direction Bits         0000     -111     0000         -111

Legend:         x = unknown, u = unchanged, - = unimplemented, read as ‘0’. Shaded cells are not used by PORTD.

DS39582C-page 48                                                                                           2001-2013 Microchip Technology Inc.
                                                                                                     PIC16F87XA

4.5       PORTE and TRISE Register                               FIGURE              4-9:            PORTE BLOCK DIAGRAM

                                                                                                     (IN I/O PORT MODE)

Note:         PORTE and TRISE are not implemented

              on the 28-pin devices.                                           Data      Data Latch

PORTE has three pins (RE0/RD/AN5, RE1/WR/AN6                                   Bus         D      Q

and RE2/CS/AN7) which are individually configurable                            WR                                  I/O pin(1)

as inputs or outputs. These pins have Schmitt Trigger                          Port        CK

input buffers.                                                                           TRIS Latch

The PORTE pins become the I/O control inputs for the                                       D      Q

microprocessor port when bit PSPMODE (TRISE<4>) is                             WR

set. In this mode, the user must make certain that the                         TRIS        CK           Schmitt

TRISE<2:0> bits are set and that the pins are configured                                                Trigger

as digital inputs. Also, ensure that ADCON1 is config-                                                  Input

ured for digital I/O. In this mode, the input buffers are                                               Buffer

TTL.                                                                           RD

                                                                               TRIS

Register 4-1    shows  the  TRISE      register  which   also

controls the Parallel Slave Port operation.                                                          Q  D

PORTE pins are multiplexed with analog inputs. When

selected for analog input, these pins will read as ‘0’s.                                                ENEN

TRISE controls the direction of the RE pins, even when                         RD Port

they are being used as analog inputs. The user must

make sure to keep the pins configured as inputs when

using them as analog inputs.                                                   Note  1:  I/O pins have protection diodes to VDD and VSS.

Note:         On  a  Power-on  Reset,    these   pins     are

              configured as analog inputs and read as ‘0’.

TABLE 4-9:           PORTE FUNCTIONS

      Name           Bit#   Buffer Type                                                 Function

                                         I/O port pin or read control input in Parallel Slave Port mode or analog input:

                            ST/TTL(1)    RD

RE0/RD/AN5           bit 0               1       = Idle

                                         0       = Read operation. Contents of PORTD register are output to PORTD

                                                 I/O pins (if chip selected).

                                         I/O port pin or write control input in Parallel Slave Port mode or analog input:

                            ST/TTL(1)    WR

RE1/WR/AN6           bit 1               1 = Idle

                                         0 = Write operation. Value of PORTD I/O pins is latched into PORTD

                                                 register (if chip selected).

                                         I/O port pin or chip select control input in Parallel Slave Port mode or analog input:

RE2/CS/AN7           bit 2  ST/TTL(1)    CS

                                         1 = Device is not selected

                                         0 = Device is selected

Legend:     ST = Schmitt Trigger input, TTL = TTL input

Note  1:    Input buffers are Schmitt Triggers when in I/O mode and TTL buffers when in Parallel Slave Port mode.

 2001-2013 Microchip Technology Inc.                                                                         DS39582C-page 49
PIC16F87XA

TABLE 4-10:       SUMMARY OF REGISTERS ASSOCIATED WITH PORTE

                                                                                                  Value on:          Value on

Address  Name     Bit 7       Bit 6  Bit 5     Bit 4   Bit 3       Bit 2       Bit 1       Bit 0  POR, BOR           all other

                                                                                                                     Resets

09h      PORTE    —           —      —          —      —           RE2         RE1         RE0    ----    -xxx       ----  -uuu

89h      TRISE    IBF         OBF    IBOV   PSPMODE    —          PORTE Data Direction bits       0000    -111       0000  -111

9Fh      ADCON1   ADFM   ADCS2       —          —      PCFG3      PCFG2        PCFG1       PCFG0  00--    0000       00--  0000

Legend:  x = unknown, u = unchanged, - = unimplemented, read as ‘0’. Shaded cells are not used by PORTE.

REGISTER 4-1:     TRISE REGISTER (ADDRESS 89h)

                         R-0         R-0       R/W-0   R/W-0                   U-0         R/W-1          R/W-1      R/W-1

                         IBF         OBF        IBOV   PSPMODE                 —           Bit 2          Bit 1      Bit 0

                  bit 7                                                                                                    bit 0

                  Parallel Slave Port Status/Control Bits:

         bit  7   IBF: Input Buffer Full Status bit

                  1 = A word has been received and is waiting to be read by the CPU

                  0 = No word has been received

         bit  6   OBF: Output Buffer Full Status bit

                  1 = The output buffer still holds a previously written word

                  0 = The output buffer has been read

         bit  5   IBOV: Input Buffer Overflow Detect bit (in Microprocessor mode)

                  1=     A write occurred when  a     previously  input  word  has    not  been   read    (must  be  cleared  in

                         software)

                  0=     No overflow occurred

         bit  4   PSPMODE: Parallel Slave Port Mode Select bit

                  1 = PORTD functions in Parallel Slave Port mode

                  0 = PORTD functions in general purpose I/O mode

         bit  3   Unimplemented: Read as ‘0’

                  PORTE Data Direction Bits:

         bit  2   Bit 2: Direction Control bit for pin RE2/CS/AN7

                  1 = Input

                  0 = Output

         bit  1   Bit 1: Direction Control bit for pin RE1/WR/AN6

                  1 = Input

                  0 = Output

         bit  0   Bit 0: Direction Control bit for pin RE0/RD/AN5

                  1 = Input

                  0 = Output

                  Legend:

                  R = Readable bit              W = Writable bit          U = Unimplemented bit, read as ‘0’

                  - n = Value at POR            ‘1’ = Bit is set          ‘0’ = Bit is cleared    x = Bit is unknown

DS39582C-page 50                                                                       2001-2013 Microchip Technology Inc.
                                                                                                      PIC16F87XA

4.6         Parallel Slave Port                                             When not in PSP mode, the IBF and OBF bits are held

                                                                            clear. However, if flag bit IBOV was previously set, it

The Parallel Slave Port (PSP) is not implemented on                         must be cleared in firmware.

the PIC16F873A or PIC16F876A.                                               An  interrupt    is   generated    and  latched     into    flag  bit

PORTD operates as an 8-bit wide Parallel Slave Port,                        PSPIF when a read or write operation is completed.

or microprocessor port, when control bit PSPMODE                            PSPIF must be cleared by the user in firmware and the

(TRISE<4>) is set. In Slave mode, it is asynchronously                      interrupt  can   be      disabled  by   clearing    the     interrupt

readable and writable by the external world through RD                      enable bit PSPIE (PIE1<7>).

control input pin, RE0/RD/AN5, and WR control input

pin, RE1/WR/AN6.                                                            FIGURE 4-10:              PORTD AND PORTE

The    PSP    can         directly     interface     to      an   8-bit                               BLOCK DIAGRAM

microprocessor data bus. The external microprocessor                                                  (PARALLEL SLAVE PORT)

can read or write the PORTD latch as an 8-bit latch.

Setting bit PSPMODE enables port pin RE0/RD/AN5 to

be the RD input, RE1/WR/AN6 to be the WR input and                              Data Bus

RE2/CS/AN7 to be the CS (Chip Select) input. For this                                             D   Q

functionality, the corresponding data direction bits of                                WR                                               RDx pin

the TRISE register (TRISE<2:0>) must be configured                                     Port       CK

as   inputs   (set).  The        A/D    port   configuration        bits,                                           TTL

PCFG3:PCFG0           (ADCON1<3:0>),           must       be     set  to                         Q    D

configure pins RE2:RE0 as digital I/O.

There are actually two 8-bit latches: one for data output                         RD Port             ENEN

and one for data input. The user writes 8-bit data to the

PORTD data latch and reads data from the port pin

latch (note that they have the same address). In this                           One bit of PORTD

mode, the TRISD register is ignored since the external                          Set Interrupt Flag

device is controlling the direction of data flow.                               PSPIF (PIR1<7>)

A write to the PSP occurs when both the CS and WR

lines are first detected low. When either the CS or WR

lines become high (level triggered), the Input Buffer Full

(IBF) status flag bit (TRISE<7>) is set on the Q4 clock                                                             Read      TTL

cycle, following the next Q2 cycle, to signal the write is                                                                              RD

complete (Figure 4-11). The interrupt flag bit, PSPIF                                                              Chip Select

(PIR1<7>), is also set on the same Q4 clock cycle. IBF                                                                        TTL       CS

can only be cleared by reading the PORTD input latch.                                                               Write

The    Input  Buffer      Overflow      (IBOV)    status      flag    bit                                                     TTL       WR

(TRISE<5>)    is     set  if  a  second  write    to     the  PSP     is

attempted when the previous byte has not been read                          Note  1:   I/O pins have protection diodes to VDD and VSS.

out of the buffer.

A read from the PSP occurs when both the CS and RD

lines  are    first  detected    low.   The    Output     Buffer      Full

(OBF)  status         flag    bit     (TRISE<6>)         is   cleared

immediately (Figure 4-12), indicating that the PORTD

latch is waiting to be read by the external bus. When

either the CS or RD pin becomes high (level triggered),

the interrupt flag bit PSPIF is set on the Q4 clock cycle,

following the next Q2 cycle, indicating that the read is

complete.     OBF     remains      low  until  data   is     written  to

PORTD by the user firmware.

 2001-2013 Microchip Technology Inc.                                                                               DS39582C-page 51
PIC16F87XA

FIGURE 4-11:      PARALLEL         SLAVE  PORT   WRITE  WAVEFORMS

                  Q1        Q2     Q3     Q4     Q1     Q2           Q3      Q4      Q1                Q2    Q3    Q4

          CS

          WR

          RD

     PORTD<7:0>

          IBF

          OBF

          PSPIF

FIGURE 4-12:      PARALLEL SLAVE PORT READ WAVEFORMS

                  Q1        Q2     Q3     Q4     Q1     Q2           Q3      Q4      Q1                Q2    Q3    Q4

          CS

          WR

          RD

     PORTD<7:0>

          IBF

          OBF

          PSPIF

TABLE 4-11:       REGISTERS ASSOCIATED WITH PARALLEL SLAVE PORT

                                                                                                       Value on:   Value on

Address   Name    Bit 7     Bit 6  Bit 5  Bit 4      Bit 3           Bit 2   Bit 1   Bit 0             POR, BOR    all other

                                                                                                                   Resets

08h       PORTD   Port Data Latch when written; Port pins when read                                    xxxx  xxxx  uuuu      uuuu

09h       PORTE   —         —      —          —      —               RE2     RE1     RE0               ----  -xxx  ----      -uuu

89h       TRISE   IBF       OBF    IBOV   PSPMODE    —               PORTE Data Direction bits         0000  -111  0000      -111

0Ch       PIR1    PSPIF(1)  ADIF   RCIF   TXIF       SSPIF           CCP1IF  TMR2IF  TMR1IF            0000  0000  0000      0000

8Ch       PIE1    PSPIE(1)  ADIE   RCIE   TXIE       SSPIE           CCP1IE  TMR2IE  TMR1IE            0000  0000  0000      0000

9Fh       ADCON1  ADFM      ADCS2  —          —      PCFG3           PCFG2   PCFG1   PCFG0             00--  0000  00--      0000

Legend:   x = unknown, u = unchanged, - = unimplemented, read as ‘0’. Shaded cells are not used by the Parallel Slave Port.

Note  1:  Bits PSPIE and PSPIF are reserved on the PIC16F873A/876A; always maintain these bits clear.

DS39582C-page 52                                                                     2001-2013 Microchip Technology Inc.
                                                                                                         PIC16F87XA

5.0         TIMER0 MODULE                                                      Counter    mode     is    selected   by     setting    bit  T0CS

                                                                               (OPTION_REG<5>).          In   Counter    mode,      Timer0     will

The  Timer0   module    timer/counter     has     the    following             increment either on every rising or falling edge of pin

features:                                                                      RA4/T0CKI. The incrementing edge is determined by

•  8-bit timer/counter                                                         the  Timer0        Source      Edge      Select      bit,   T0SE

•  Readable and writable                                                       (OPTION_REG<4>). Clearing bit T0SE selects the ris-

•  8-bit software programmable prescaler                                       ing edge. Restrictions on the external clock input are

                                                                               discussed in detail in Section 5.2 “Using Timer0 with

•  Internal or external clock select                                           an External Clock”.

•  Interrupt on overflow from FFh to 00h                                       The prescaler is mutually exclusively shared between

•  Edge select for external clock                                              the  Timer0    module     and  the   Watchdog        Timer.     The

Figure 5-1 is a block diagram of the Timer0 module and                         prescaler  is  not  readable   or    writable.       Section 5.3

the prescaler shared with the WDT.                                             “Prescaler” details the operation of the prescaler.

Additional   information      on     the  Timer0    module     is              5.1        Timer0 Interrupt

available in the PIC® Mid-Range MCU Family Refer-

ence Manual (DS33023).                                                         The  TMR0      interrupt  is   generated    when     the    TMR0

Timer  mode       is  selected       by   clearing  bit     T0CS               register overflows from FFh to 00h. This overflow sets

(OPTION_REG<5>).          In  Timer       mode,     the  Timer0                bit  TMR0IF    (INTCON<2>).         The     interrupt      can  be

module will increment every instruction cycle (without                         masked     by  clearing   bit  TMR0IE     (INTCON<5>).          Bit

prescaler). If the TMR0 register is written, the incre-                        TMR0IF must be cleared in software by the Timer0

ment is inhibited for the following two instruction cycles.                    module Interrupt Service Routine before re-enabling

The user can work around this by writing an adjusted                           this interrupt. The TMR0 interrupt cannot awaken the

value to the TMR0 register.                                                    processor from Sleep since the timer is shut-off during

                                                                               Sleep.

FIGURE 5-1:               BLOCK DIAGRAM OF THE TIMER0/WDT PRESCALER

       CLKO (= FOSC/4)

                                                                                                              Data Bus

                                                 M                                                                      8

                                          0                           1

   RA4/T0CKI                                     U                        M                 Sync

       pin                                       X                        U                   2               TMR0 Reg

                                          1                           0   X               Cycles

                        T0SE

                                             T0CS                         PSA                                           Set  Flag bit TMR0IF

                                                                                                                             on Overflow

                                                                    PRESCALER

                                  0                      8-bit Prescaler

                                     M

                                     U

       Watchdog                   1  X                      8

           Timer

                                                         8-to-1 MUX                      PS2:PS0

                                     PSA

     WDT Enable bit                                      0            1

                                                            MUX                     PSA

                                                            WDT

                                                            Time-out

     Note: T0CS, T0SE, PSA, PS2:PS0 are (OPTION_REG<5:0>).

 2001-2013 Microchip Technology Inc.                                                                                      DS39582C-page 53
PIC16F87XA

5.2  Using Timer0 with an External                                 Timer0 module means that there is no prescaler for the

     Clock                                                         Watchdog Timer and vice versa. This prescaler is not

                                                                   readable or writable (see Figure 5-1).

When no prescaler is used, the external clock input is             The      PSA    and    PS2:PS0        bits  (OPTION_REG<3:0>)

the same as the prescaler output. The synchronization              determine the prescaler assignment and prescale ratio.

of  T0CKI  with    the  internal  phase  clocks  is  accom-

plished by sampling the prescaler output on the Q2 and             When assigned to the Timer0 module, all instructions

Q4 cycles of the internal phase clocks. Therefore, it is           writing to the TMR0 register (e.g., CLRF 1, MOVWF 1,

necessary for T0CKI to be high for at least 2 TOSC (and            BSF 1,x....etc.) will clear the prescaler. When assigned

a small RC delay of 20 ns) and low for at least 2 TOSC             to WDT, a CLRWDT instruction will clear the prescaler

(and a small RC delay of 20 ns). Refer to the electrical           along with the Watchdog Timer. The prescaler is not

specification of the desired device.                               readable or writable.

                                                                            Note:  Writing  to  TMR0     when  the    prescaler    is

5.3  Prescaler                                                                     assigned to Timer0 will clear the prescaler

There is only one prescaler available which is mutually                            count, but will not change the prescaler

exclusively shared between the Timer0 module and the                               assignment.

Watchdog   Timer.       A  prescaler  assignment     for  the

REGISTER 5-1:              OPTION_REG REGISTER

                           R/W-1         R/W-1       R/W-1         R/W-1           R/W-1        R/W-1          R/W-1   R/W-1

                           RBPU          INTEDG      T0CS          T0SE            PSA          PS2            PS1     PS0

                           bit 7                                                                                                   bit 0

           bit  7          RBPU

           bit  6          INTEDG

           bit  5          T0CS: TMR0 Clock Source Select bit

                           1 = Transition on T0CKI pin

                           0 = Internal instruction cycle clock (CLKO)

           bit  4          T0SE: TMR0 Source Edge Select bit

                           1 = Increment on high-to-low transition on T0CKI pin

                           0 = Increment on low-to-high transition on T0CKI pin

           bit  3          PSA: Prescaler Assignment bit

                           1 = Prescaler is assigned to the WDT

                           0 = Prescaler is assigned to the Timer0 module

           bit  2-0        PS2:PS0: Prescaler Rate Select bits

                           Bit Value  TMR0 Rate      WDT Rate

                           000           1:2              1:1

                           001           1:4              1:2

                           010           1:8              1:4

                           011           1 : 16           1:8

                           100           1 : 32           1 : 16

                           101           1 : 64           1 : 32

                           110           1 : 128          1 : 64

                           111           1 : 256          1 : 128

                           Legend:

                           R = Readable bit               W = Writable bit         U = Unimplemented bit, read as ‘0’

                           - n = Value at POR             ‘1’ = Bit is set         ‘0’ = Bit is cleared        x = Bit is unknown

                           Note:      To avoid an unintended device Reset, the instruction sequence shown in the PIC®

                                      Mid-Range MCU Family Reference Manual (DS33023) must be executed when

                                      changing the prescaler assignment from Timer0 to the WDT. This sequence must

                                      be followed even if the WDT is disabled.

DS39582C-page 54                                                                             2001-2013 Microchip Technology Inc.
                                                                                           PIC16F87XA

TABLE 5-1:        REGISTERS ASSOCIATED WITH TIMER0

                                                                                                  Value on:               Value on

Address     Name             Bit 7     Bit 6         Bit 5  Bit 4  Bit 3    Bit 2   Bit 1  Bit 0  POR, BOR                all other

                                                                                                                          Resets

01h,101h    TMR0             Timer0 Module Register                                               xxxx  xxxx  uuuu        uuuu

0Bh,8Bh,    INTCON           GIE       PEIE    TMR0IE       INTE   RBIE     TMR0IF  INTF   RBIF   0000  000x  0000        000u

10Bh,18Bh

81h,181h    OPTION_REG       RBPU      INTEDG  T0CS         T0SE   PSA      PS2     PS1    PS0    1111  1111  1111        1111

Legend:    x = unknown, u =  unchanged, - = unimplemented   locations read  as ‘0’. Shaded cells are not used by Timer0.

 2001-2013 Microchip Technology Inc.                                                                   DS39582C-page 55
PIC16F87XA

NOTES:

DS39582C-page 56   2001-2013 Microchip Technology Inc.
                                                                                          PIC16F87XA

6.0         TIMER1 MODULE                                         In Timer mode, Timer1 increments every instruction

                                                                  cycle. In Counter mode, it increments on every rising

The Timer1 module is a 16-bit timer/counter consisting            edge of the external clock input.

of two 8-bit registers (TMR1H and TMR1L) which are                Timer1      can  be     enabled/disabled     by  setting/clearing

readable    and     writable.  The  TMR1    register        pair  control bit, TMR1ON (T1CON<0>).

(TMR1H:TMR1L)         increments    from    0000h  to  FFFFh

and rolls over to 0000h. The TMR1 interrupt, if enabled,          Timer1 also has an internal “Reset input”. This Reset

is generated on overflow which is latched in interrupt            can be generated by either of the two CCP modules

flag  bit,  TMR1IF    (PIR1<0>).    This    interrupt  can  be    (Section 8.0     “Capture/Compare/PWM               Modules”).

enabled/disabled      by  setting/clearing  TMR1       interrupt  Register 6-1 shows the Timer1 Control register.

enable bit, TMR1IE (PIE1<0>).                                     When the Timer1 oscillator is enabled (T1OSCEN is

Timer1 can operate in one of two modes:                           set),       the  RC1/T1OSI/CCP2         and  RC0/T1OSO/T1CKI

•  As a Timer                                                     pins become inputs. That is, the TRISC<1:0> value is

•  As a Counter                                                   ignored and these pins read as ‘0’.

The operating mode is determined by the clock select              Additional information on timer modules is available in

bit, TMR1CS (T1CON<1>).                                           the PIC® Mid-Range MCU Family Reference Manual

                                                                  (DS33023).

REGISTER 6-1:             T1CON: TIMER1 CONTROL REGISTER (ADDRESS 10h)

                               U-0          U-0        R/W-0      R/W-0            R/W-0   R/W-0               R/W-0       R/W-0

                               —            —          T1CKPS1    T1CKPS0     T1OSCEN     T1SYNC          TMR1CS           TMR1ON

                          bit 7                                                                                               bit 0

            bit  7-6      Unimplemented: Read as ‘0’

            bit  5-4      T1CKPS1:T1CKPS0: Timer1 Input Clock Prescale Select bits

                          11 = 1:8 prescale value

                          10 = 1:4 prescale value

                          01 = 1:2 prescale value

                          00 = 1:1 prescale value

            bit  3        T1OSCEN: Timer1 Oscillator Enable Control bit

                          1 = Oscillator is enabled

                          0 = Oscillator is shut-off (the oscillator inverter is turned off to eliminate  power    drain)

            bit  2        T1SYNC: Timer1 External Clock Input Synchronization Control bit

                          When TMR1CS = 1:

                          1 = Do not synchronize external clock input

                          0 = Synchronize external clock input

                          When TMR1CS = 0:

                          This bit is ignored. Timer1 uses the internal clock when TMR1CS = 0.

            bit 1         TMR1CS: Timer1 Clock Source Select bit

                          1 = External clock from pin RC0/T1OSO/T1CKI (on the rising edge)

                          0 = Internal clock (FOSC/4)

            bit 0         TMR1ON: Timer1 On bit

                          1 = Enables Timer1

                          0 = Stops Timer1

                          Legend:

                          R = Readable bit                  W = Writable bit       U = Unimplemented bit, read as ‘0’

                          - n = Value at POR                ‘1’ = Bit is set       ‘0’ = Bit is cleared   x = Bit is unknown

 2001-2013 Microchip Technology Inc.                                                                          DS39582C-page 57
PIC16F87XA

6.1    Timer1 Operation in Timer Mode                                      6.2        Timer1 Counter Operation

Timer  mode   is     selected  by  clearing     the  TMR1CS                Timer1 may operate in either a Synchronous, or an

(T1CON<1>) bit. In this mode, the input clock to the                       Asynchronous mode, depending on the setting of the

timer is FOSC/4. The synchronize control bit, T1SYNC                       TMR1CS bit.

(T1CON<2>), has no effect since the internal clock is                      When       Timer1  is  being     incremented    via  an  external

always in sync.                                                            source, increments occur on a rising edge. After Timer1

                                                                           is enabled in Counter mode, the module must first have

                                                                           a falling edge before the counter begins to increment.

FIGURE 6-1:               TIMER1 INCREMENTING EDGE

     T1CKI

     (Default High)

     T1CKI

     (Default Low)

     Note: Arrows indicate counter increments.

6.3    Timer1 Operation in Synchronized                                    If T1SYNC is cleared, then the external clock input is

       Counter Mode                                                        synchronized with internal phase clocks. The synchro-

                                                                           nization   is  done       after  the  prescaler      stage.  The

Counter mode is selected by setting bit TMR1CS. In                         prescaler stage is an asynchronous ripple counter.

this mode, the timer increments on every rising edge of                    In this configuration, during Sleep mode, Timer1 will not

clock  input  on     pin  RC1/T1OSI/CCP2             when  bit             increment even if the external clock is present since the

T1OSCEN is set, or on pin RC0/T1OSO/T1CKI when                             synchronization        circuit   is  shut-off.  The  prescaler,

bit T1OSCEN is cleared.                                                    however, will continue to increment.

FIGURE 6-2:               TIMER1 BLOCK DIAGRAM

                     Set Flag bit

                     TMR1IF on

                     Overflow                                                                     0              Synchronized

                                                TMR1                                                             Clock Input

                                   TMR1H             TMR1L

                                                                                                  1

                                                                           TMR1ON

                                                                              On/Off          T1SYNC

                                   T1OSC

       RC0/T1OSO/T1CKI                                                           1                               Synchronize

                                                                                              Prescaler

                                                     T1OSCEN        FOSC/4                    1, 2, 4, 8                   det

                                                     Enable         Internal     0
                                                     Oscillator(1)
       RC1/T1OSI/CCP2(2)                                            Clock                            2           Q Clock

                                                                                      T1CKPS1:T1CKPS0

                                                                              TMR1CS

       Note 1: When the T1OSCEN bit is cleared, the inverter        is turned off. This eliminates power drain.

DS39582C-page 58                                                                                   2001-2013 Microchip Technology Inc.
                                                                                             PIC16F87XA

6.4       Timer1 Operation in                                       TABLE 6-1:            CAPACITOR SELECTION FOR

          Asynchronous Counter Mode                                                       THE TIMER1 OSCILLATOR

If control bit T1SYNC (T1CON<2>) is set, the external               Osc Type              Freq.           C1             C2

clock input is not synchronized. The timer continues to                   LP              32 kHz          33 pF          33 pF

increment asynchronous to the internal phase clocks.                               100 kHz                15 pF          15 pF

The timer will continue to run during Sleep and can

generate an interrupt-on-overflow which will wake-up                               200 kHz                15 pF          15 pF

the    processor.      However,      special   precautions     in        These values are for design guidance only.

software are needed to read/write the timer.                                              Crystals Tested:

In   Asynchronous        Counter  mode,    Timer1     cannot   be   32.768 kHz     Epson C-001R32.768K-A                 ± 20 PPM

used as a time base for capture or compare operations.

                                                                         100 kHz   Epson C-2 100.00 KC-P                 ± 20 PPM

6.4.1         READING AND WRITING TIMER1 IN                              200 kHz          STD XTL 200.000 kHz            ± 20 PPM

              ASYNCHRONOUS COUNTER MODE                             Note  1:       Higher capacitance increases the stability

Reading TMR1H or TMR1L while the timer is running                                  of oscillator but also increases the start-up

from an external asynchronous clock will ensure a valid                            time.

read (taken care of in hardware). However, the user                       2:       Since each resonator/crystal has its own

should keep in mind that reading the 16-bit timer in two                           characteristics, the user should consult

8-bit values itself, poses certain problems, since the                             the resonator/crystal manufacturer for

timer may overflow between the reads.                                              appropriate values of external

For writes, it is recommended that the user simply stop                            components.

the timer and write the desired values. A write conten-

tion may occur by writing to the timer registers while the          6.6        Resetting Timer1 Using a CCP

register  is    incrementing.        This  may     produce     an              Trigger Output

unpredictable value in the timer register.

Reading      the     16-bit   value  requires      some  care.      If the CCP1 or CCP2 module is configured in Compare

Examples 12-2 and 12-3 in the PIC® Mid-Range MCU                    mode       to  generate       a  “special    event   trigger”

Family    Reference      Manual   (DS33023)     show     how   to   (CCP1M3:CCP1M0          =     1011),  this   signal  will  reset

read    and     write    Timer1   when     it  is     running  in   Timer1.

Asynchronous mode.                                                  Note:          The special event triggers from the CCP1

6.5       Timer1 Oscillator                                                        and CCP2 modules will not set interrupt

                                                                                   flag bit, TMR1IF (PIR1<0>).

A crystal oscillator circuit is built-in between pins T1OSI         Timer1 must be configured for either Timer or Synchro-

(input) and T1OSO (amplifier output). It is enabled by              nized Counter mode to take advantage of this feature.

setting control bit, T1OSCEN (T1CON<3>). The oscil-                 If Timer1 is running in Asynchronous Counter mode,

lator is a low-power oscillator, rated up to 200 kHz. It            this Reset operation may not work.

will continue to run during Sleep. It is primarily intended         In the event that a write to Timer1 coincides with a

for  use  with    a  32  kHz  crystal.     Table 6-1  shows    the  special event trigger from CCP1 or CCP2, the write will

capacitor selection for the Timer1 oscillator.                      take precedence.

The Timer1 oscillator is identical to the LP oscillator.            In this mode of operation, the CCPRxH:CCPRxL regis-

The user must provide a software time delay to ensure               ter  pair  effectively  becomes       the  period  register   for

proper oscillator start-up.                                         Timer1.

 2001-2013 Microchip Technology Inc.                                                                           DS39582C-page 59
PIC16F87XA

6.7       Resetting of Timer1 Register Pair               6.8      Timer1 Prescaler

          (TMR1H, TMR1L)                                  The      prescaler  counter              is   cleared  on  writes  to  the

TMR1H and TMR1L registers are not reset to 00h on a       TMR1H or TMR1L registers.

POR, or any other Reset, except by the CCP1 and

CCP2 special event triggers.

T1CON register is reset to 00h on a Power-on Reset,

or a Brown-out Reset, which shuts off the timer and

leaves a 1:1 prescale. In all other Resets, the register

is unaffected.

TABLE 6-2:        REGISTERS ASSOCIATED WITH TIMER1 AS A TIMER/COUNTER

                                                                                                           Value on:     Value on

Address         Name  Bit 7     Bit 6  Bit 5    Bit 4     Bit 3    Bit 2      Bit 1                Bit 0   POR, BOR      all other

                                                                                                                             Resets

0Bh,8Bh,    INTCON    GIE       PEIE   TMR0IE   INTE      RBIE     TMR0IF     INTF                 RBIF    0000  000x    0000    000u

10Bh, 18Bh

0Ch         PIR1      PSPIF(1)  ADIF   RCIF     TXIF      SSPIF    CCP1IF     TMR2IF               TMR1IF  0000  0000    0000    0000

8Ch         PIE1      PSPIE(1)  ADIE   RCIE     TXIE      SSPIE    CCP1IE     TMR2IE               TMR1IE  0000  0000    0000    0000

0Eh         TMR1L     Holding Register for the Least Significant Byte of the 16-bit TMR1 Register          xxxx  xxxx    uuuu    uuuu

0Fh         TMR1H     Holding Register for the Most Significant Byte of the 16-bit TMR1 Register           xxxx  xxxx    uuuu    uuuu

10h         T1CON     —         —      T1CKPS1  T1CKPS0   T1OSCEN  T1SYNC  TMR1CS                  TMR1ON  --00  0000    --uu    uuuu

Legend:     x = unknown, u = unchanged, - = unimplemented, read as ‘0’. Shaded cells are not used by the Timer1 module.

Note  1:    Bits PSPIE and PSPIF are reserved on the 28-pin devices; always maintain these bits clear.

DS39582C-page 60                                                               2001-2013 Microchip Technology Inc.
                                                                                                                     PIC16F87XA

7.0     TIMER2 MODULE                                                      Register 7-1 shows the Timer2 Control register.

Timer2  is   an     8-bit  timer      with     a  prescaler  and     a     Additional information on timer modules is available in

postscaler. It can be used as the PWM time base for the                    the PIC® Mid-Range MCU Family Reference Manual

PWM mode of the CCP module(s). The TMR2 register                           (DS33023).

is readable and writable and is cleared on any device                      FIGURE 7-1:                               TIMER2 BLOCK DIAGRAM

Reset.

The   input  clock    (FOSC/4)    has       a  prescale      option  of                Sets Flag      TOMuRtp2ut(1)

1:1,    1:4   or    1:16,         selected        by  control        bits              bit TMR2IF

T2CKPS1:T2CKPS0 (T2CON<1:0>).

The Timer2 module has an 8-bit period register, PR2.                                                  Reset          TMR2 Reg    Prescaler       FOSC/4

Timer2 increments from 00h until it matches PR2 and                                                                              1:1, 1:4, 1:16

then resets to 00h on the next increment cycle. PR2 is                                 Postscaler                    Comparator           2

a readable and writable register. The PR2 register is                                  1:1 to 1:16    EQ

                                                                                                                                 T2CKPS1:

initialized to FFh upon Reset.                                                                     4                 PR2 Reg     T2CKPS0

The   match   output       of  TMR2    goes       through    a     4-bit               T2OUTPS3:

postscaler (which gives a 1:1 to 1:16 scaling inclusive)                               T2OUTPS0

to  generate  a     TMR2       interrupt    (latched     in  flag    bit,              Note 1: TMR2 register output can be       software selected by the

TMR2IF (PIR1<1>)).                                                                     SSP module as a baud clock.

Timer2 can be shut-off by clearing control bit, TMR2ON

(T2CON<2>), to minimize power consumption.

REGISTER 7-1:                  T2CON: TIMER2 CONTROL REGISTER (ADDRESS 12h)

                                  U-0             R/W-0         R/W-0      R/W-0       R/W-0                         R/W-0       R/W-0           R/W-0

                                  —            TOUTPS3       TOUTPS2       TOUTPS1     TOUTPS0               TMR2ON              T2CKPS1     T2CKPS0

                               bit 7                                                                                                                 bit 0

             bit 7             Unimplemented: Read as ‘0’

             bit 6-3           TOUTPS3:TOUTPS0: Timer2 Output Postscale Select bits

                               0000 = 1:1 postscale

                               0001 = 1:2 postscale

                               0010 = 1:3 postscale

                               •

                               •

                               •

                               1111 = 1:16 postscale

             bit 2             TMR2ON: Timer2 On bit

                               1 = Timer2 is on

                               0 = Timer2 is off

             bit 1-0           T2CKPS1:T2CKPS0: Timer2 Clock Prescale Select bits

                               00 = Prescaler is 1

                               01 = Prescaler is 4

                               1x = Prescaler is 16

                               Legend:

                               R = Readable bit                      W = Writable bit  U = Unimplemented                      bit, read as ‘0’

                               - n = Value at POR                    ‘1’ = Bit is set  ‘0’ = Bit is cleared                      x = Bit is unknown

 2001-2013 Microchip Technology Inc.                                                                                            DS39582C-page 61
PIC16F87XA

7.1        Timer2 Prescaler and Postscaler                     7.2      Output of TMR2

The   prescaler   and  postscaler  counters      are  cleared  The output of TMR2 (before the postscaler) is fed to the

when any of the following occurs:                              SSP module, which optionally uses it to generate the

•  a write to the TMR2 register                                shift clock.

•  a write to the T2CON register

•  any device Reset (POR, MCLR Reset, WDT

   Reset or BOR)

TMR2 is not cleared when T2CON is written.

TABLE 7-1:         REGISTERS ASSOCIATED WITH TIMER2 AS A TIMER/COUNTER

                                                                                                             Value on:   Value on

   Address  Name       Bit 7       Bit 6       Bit 5  Bit 4    Bit 3    Bit 2   Bit 1               Bit 0    POR, BOR    all other

                                                                                                                         Resets

0Bh, 8Bh,   INTCON     GIE         PEIE   TMR0IE      INTE     RBIE     TMR0IF  INTF                RBIF     0000  000x  0000  000u

10Bh, 18Bh

0Ch         PIR1       PSPIF(1)    ADIF        RCIF   TXIF     SSPIF    CCP1IF  TMR2IF              TMR1IF   0000  0000  0000  0000

8Ch         PIE1       PSPIE(1)    ADIE        RCIE   TXIE     SSPIE    CCP1IE  TMR2IE              TMR1IE   0000  0000  0000  0000

11h         TMR2       Timer2 Module’s Register                                                              0000  0000  0000  0000

12h         T2CON      —         TOUTPS3  TOUTPS2     TOUTPS1  TOUTPS0  TMR2ON  T2CKPS1             T2CKPS0  -000  0000  -000  0000

92h         PR2        Timer2 Period Register                                                                1111  1111  1111  1111

Legend:     x = unknown, u = unchanged, - = unimplemented, read as ‘0’. Shaded cells are not used by the Timer2 module.

Note  1:    Bits PSPIE and PSPIF are reserved on 28-pin devices; always maintain these bits clear.

DS39582C-page 62                                                                 2001-2013 Microchip Technology Inc.
                                                                               PIC16F87XA

8.0  CAPTURE/COMPARE/PWM                                  CCP2 Module:

     MODULES                                              Capture/Compare/PWM Register 2 (CCPR2) is com-

                                                          prised of two 8-bit registers: CCPR2L (low byte) and

Each Capture/Compare/PWM (CCP) module contains            CCPR2H (high byte). The CCP2CON register controls

a 16-bit register which can operate as a:                 the operation of CCP2. The special event trigger is

•  16-bit Capture register                                generated by a compare match and will reset Timer1

•  16-bit Compare register                                and  start  an  A/D  conversion  (if  the  A/D      module  is

•  PWM Master/Slave Duty Cycle register                   enabled).

Both the CCP1 and CCP2 modules are identical in           Additional information on CCP modules is available in

operation, with the exception being the operation of the  the PIC® Mid-Range MCU Family Reference Manual

special event trigger. Table 8-1 and Table 8-2 show the   (DS33023) and in application note AN594, “Using the

resources and interactions of the CCP module(s). In       CCP Module(s)” (DS00594).

the following sections, the operation of a CCP module     TABLE 8-1:           CCP MODE – TIMER

is described with respect to CCP1. CCP2 operates the

same as CCP1 except where noted.                                               RESOURCES REQUIRED

CCP1 Module:                                                   CCP Mode                    Timer Resource

Capture/Compare/PWM Register 1 (CCPR1) is com-                        Capture                       Timer1

prised of two 8-bit registers: CCPR1L (low byte) and                 Compare                        Timer1

CCPR1H (high byte). The CCP1CON register controls                     PWM                           Timer2

the operation of CCP1. The special event trigger is

generated by a compare match and will reset Timer1.

TABLE 8-2:    INTERACTION OF TWO CCP MODULES

   CCPx Mode  CCPy Mode                                        Interaction

   Capture    Capture       Same TMR1 time base

   Capture    Compare       The compare should be configured for the special event trigger which clears TMR1

   Compare    Compare       The compare(s) should be configured for the special event trigger which clears TMR1

     PWM      PWM           The PWMs will have the same frequency and update rate (TMR2 interrupt)

     PWM      Capture       None

     PWM      Compare       None

 2001-2013 Microchip Technology Inc.                                                           DS39582C-page 63
PIC16F87XA

REGISTER 8-1:     CCP1CON REGISTER/CCP2CON REGISTER (ADDRESS 17h/1Dh)

                  U-0            U-0  R/W-0   R/W-0            R/W-0              R/W-0  R/W-0     R/W-0

                  —              —    CCPxX   CCPxY            CCPxM3           CCPxM2   CCPxM1    CCPxM0

                  bit 7                                                                                         bit 0

bit 7-6           Unimplemented: Read as ‘0’

bit 5-4           CCPxX:CCPxY: PWM Least Significant bits

                  Capture mode:

                  Unused.

                  Compare mode:

                  Unused.

                  PWM mode:

                  These bits are the two LSbs of the PWM duty cycle. The eight MSbs are found in CCPRxL.

bit 3-0           CCPxM3:CCPxM0: CCPx Mode Select bits

                  0000 = Capture/Compare/PWM disabled (resets CCPx module)

                  0100 = Capture mode, every falling edge

                  0101 = Capture mode, every rising edge

                  0110 = Capture mode, every 4th rising edge

                  0111 = Capture mode, every 16th rising edge

                  1000 = Compare mode, set output on match (CCPxIF bit is set)

                  1001 = Compare mode, clear output on match (CCPxIF bit is set)

                  1010 = Compare mode, generate software interrupt on match (CCPxIF bit is set, CCPx pin is

                         unaffected)

                  1011 = Compare mode, trigger special event (CCPxIF bit is set, CCPx pin is unaffected); CCP1

                         resets TMR1; CCP2 resets TMR1 and starts an A/D conversion (if A/D module is

                         enabled)

                  11xx = PWM mode

                  Legend:

                  R = Readable bit    W = Writable bit         U = Unimplemented bit, read as ‘0’

                  - n = Value at POR  ‘1’ = Bit is set         ‘0’ = Bit is cleared      x = Bit is unknown

DS39582C-page 64                                                        2001-2013 Microchip Technology Inc.
                                                                                               PIC16F87XA

8.1         Capture Mode                                               8.1.2        TIMER1 MODE SELECTION

In  Capture  mode,        CCPR1H:CCPR1L               captures   the   Timer1 must be running in Timer mode, or Synchro-

16-bit value of the TMR1 register when an event occurs                 nized Counter mode, for the CCP module to use the

on pin RC2/CCP1. An event is defined as one of the                     capture feature. In Asynchronous Counter mode, the

following:                                                             capture operation may not work.

•   Every falling edge                                                 8.1.3        SOFTWARE INTERRUPT

•   Every rising edge                                                  When the Capture mode is changed, a false capture

•   Every 4th rising edge                                              interrupt may be generated. The user should keep bit

•   Every 16th rising edge                                             CCP1IE (PIE1<2>) clear to avoid false interrupts and

The    type  of    event  is   configured      by     control   bits,  should clear the flag bit, CCP1IF, following any such

CCP1M3:CCP1M0             (CCPxCON<3:0>).          When  a      cap-   change in operating mode.

ture is made, the interrupt request flag bit, CCP1IF                   8.1.4        CCP PRESCALER

(PIR1<2>), is set. The interrupt flag must be cleared in

software. If another capture occurs before the value in                There  are   four  prescaler  settings,   specified   by   bits

register   CCPR1      is  read,  the  old      captured  value   is    CCP1M3:CCP1M0.          Whenever    the   CCP     module       is

overwritten by the new value.                                          turned off, or the CCP module is not in Capture mode,

                                                                       the prescaler counter is cleared. Any Reset will clear

8.1.1        CCP PIN CONFIGURATION                                     the prescaler counter.

In  Capture      mode,    the    RC2/CCP1      pin    should     be    Switching from one capture prescaler to another may

configured as an input by setting the TRISC<2> bit.                    generate an interrupt. Also, the prescaler counter will

    Note:    If the RC2/CCP1 pin is configured as an                   not be cleared, therefore, the first capture may be from

             output, a write to the port can cause a                   a non-zero prescaler. Example 8-1 shows the recom-

             Capture condition.                                        mended      method  for  switching       between     capture

                                                                       prescalers.  This   example   also   clears  the  prescaler

                                                                       counter and will not generate the “false” interrupt.

FIGURE       8-1:          CAPTURE MODE

                           OPERATION BLOCK                             EXAMPLE 8-1:             CHANGING BETWEEN

                           DIAGRAM                                                              CAPTURE PRESCALERS

                          Set Flag bit CCP1IF                          CLRF    CCP1CON          ;    Turn   CCP  module     off

                           (PIR1<2>)                                   MOVLW   NEW_CAPT_PS      ;    Load   the  W  reg     with

             Prescaler                                                                          ;    the   new   prescaler

              1, 4, 16                                                                         ;    move   value   and     CCP   ON

   RC2/CCP1                            CCPR1H            CCPR1L

     pin                                                               MOVWF   CCP1CON          ;    Load   CCP1CON   with   this

                                                                                                ;    value

                 and             Capture

             Edge Detect         Enable

                                               TMR1H     TMR1L

                   CCP1CON<3:0>

             Qs

 2001-2013 Microchip Technology Inc.                                                                           DS39582C-page 65
PIC16F87XA

8.2         Compare Mode                                                   8.2.2    TIMER1 MODE SELECTION

In Compare mode, the 16-bit CCPR1 register value is                        Timer1 must be running in Timer mode, or Synchro-

constantly compared against the TMR1 register pair                         nized Counter mode, if the CCP module is using the

value. When a match occurs, the RC2/CCP1 pin is:                           compare feature. In Asynchronous Counter mode, the

•  Driven high                                                             compare operation may not work.

•  Driven low                                                              8.2.3    SOFTWARE INTERRUPT MODE

•  Remains unchanged                                                       When Generate Software Interrupt mode is chosen, the

The action on the pin is based on the value of control                     CCP1 pin is not affected. The CCPIF bit is set, causing

bits,  CCP1M3:CCP1M0                   (CCP1CON<3:0>).           At   the  a CCP interrupt (if enabled).

same time, interrupt flag bit CCP1IF is set.

                                                                           8.2.4    SPECIAL EVENT TRIGGER

FIGURE 8-2:                     COMPARE MODE                               In this mode, an internal hardware trigger is generated

                                OPERATION BLOCK                            which may be used to initiate an action.

                                DIAGRAM                                    The special event trigger output of CCP1 resets the

   Special event trigger will:                                             TMR1 register pair. This allows the CCPR1 register to

       reset Timer1, but not set interrupt flag bit TMR1IF (PIR1<0>)       effectively be a 16-bit programmable period register for

       and set bit GO/DONE (ADCON0<2>).                                    Timer1.

                      Special Event Trigger                                The special event trigger output of CCP2 resets the

                                                                           TMR1 register pair and starts an A/D conversion (if the

                                       Set Flag bit CCP1IF                 A/D module is enabled).

                                       (PIR1<2>)

   RC2/CCP1                                         CCPR1H      CCPR1L     Note:    The special event trigger from the CCP1

       pin

                 Q    S         Output                                              and CCP2 modules will not set interrupt

                                Logic        Match  Comparator                      flag bit TMR1IF (PIR1<0>).

                      R

       TRISC<2>                                     TMR1H       TMR1L

       Output Enable  CCP1CON<3:0>

                         Mode Select

8.2.1        CCP PIN CONFIGURATION

The    user  must     configure         the  RC2/CCP1       pin  as    an

output by clearing the TRISC<2> bit.

   Note:     Clearing the CCP1CON register will force

             the RC2/CCP1 compare output latch to

             the      default   low     level.      This    is  not   the

             PORTC I/O data latch.

DS39582C-page 66                                                                     2001-2013 Microchip Technology Inc.
                                                                                                      PIC16F87XA

8.3        PWM Mode (PWM)                                                     8.3.1         PWM PERIOD

In  Pulse      Width    Modulation         mode,     the  CCPx           pin  The PWM period is specified by writing to the PR2

produces up to a 10-bit resolution PWM output. Since                          register. The PWM period can be calculated using the

the CCP1 pin is multiplexed with the PORTC data latch,                        following formula:

the TRISC<2> bit must be cleared to make the CCP1                                  PWM Period = [(PR2) + 1] • 4 • TOSC •

pin an output.                                                                                    (TMR2 Prescale Value)

    Note:      Clearing the CCP1CON register will force                       PWM frequency is defined as 1/[PWM period].

               the CCP1 PWM output latch to the default                       When TMR2 is equal to PR2, the following three events

               low level. This is not the PORTC I/O data                      occur on the next increment cycle:

               latch.                                                         •  TMR2 is cleared

Figure 8-3     shows    a  simplified      block  diagram      of        the  •  The CCP1 pin is set (exception: if PWM duty

CCP module in PWM mode.                                                          cycle = 0%, the CCP1 pin will not be set)

For a step-by-step procedure on how to set up the CCP                         •  The PWM duty cycle is latched from CCPR1L into

module for PWM operation, see Section 8.3.3 “Setup                               CCPR1H

for PWM Operation”.                                                              Note:      The Timer2 postscaler (see Section 7.1

FIGURE 8-3:                   SIMPLIFIED PWM BLOCK                                          “Timer2 Prescaler and Postscaler”) is

                              DIAGRAM                                                       not used in the determination of the PWM

                                                                                            frequency. The postscaler could be used

     Duty Cycle Registers              CCP1CON<5:4>                                         to have a servo update rate at a different

                                                                                            frequency than the PWM output.

     CCPR1L

                                                                              8.3.2         PWM DUTY CYCLE

                                                                              The    PWM    duty  cycle   is   specified       by  writing  to  the

     CCPR1H (Slave)                                                           CCPR1L register and to the CCP1CON<5:4> bits. Up

                                                                              to 10-bit resolution is available. The CCPR1L contains

                                                          RC2/CCP1            the eight MSbs and the CCP1CON<5:4> contains the

           Comparator                      R      Q                           two    LSbs.  This      10-bit   value      is   represented      by

                                                                              CCPR1L:CCP1CON<5:4>. The following equation is

           TMR2         (Note 1)                                              used to calculate the PWM duty cycle in time:

                                           S                                       PWM Duty Cycle =(CCPR1L:CCP1CON<5:4>) •

                                                     TRISC<2>                                         TOSC • (TMR2 Prescale Value)

     Comparator

                           Clear Timer,                                       CCPR1L and CCP1CON<5:4> can be written to at any

                           CCP1 pin and                                       time,  but  the  duty   cycle    value      is   not   latched    into

           PR2             latch D.C.

                                                                              CCPR1H until after a match between PR2 and TMR2

                                                                              occurs (i.e., the period is complete). In PWM mode,

    Note   1:  The 8-bit timer is concatenated with 2-bit internal Q          CCPR1H is a read-only register.

               clock, or 2 bits of the prescaler, to create 10-bit time

               base.                                                          The CCPR1H register and a 2-bit                  internal latch are

A PWM output (Figure 8-4) has a time base (period)                            used   to   double-buffer       the  PWM         duty  cycle.     This

and a time that the output stays high (duty cycle). The                       double-buffering    is  essential           for  glitch-free   PWM

frequency      of  the  PWM       is  the  inverse   of   the  period         operation.

(1/period).                                                                   When   the    CCPR1H        and      2-bit  latch    match    TMR2,

                                                                              concatenated with an internal 2-bit Q clock or 2 bits of

FIGURE 8-4:                   PWM OUTPUT                                      the TMR2 prescaler, the CCP1 pin is cleared.

                                                                              The maximum PWM resolution (bits) for a given PWM

                      Period                                                  frequency is given by the following formula.

                                                                              EQUATION 8-1:

                                                                                                          ( ) log
               Duty Cycle                                                                                          FOSC

                                                                                            Resolution =           FPWM        bits

                                      TMR2 = PR2                                                               log(2)

                           TMR2 = Duty Cycle

     TMR2 = PR2                                                                  Note:      If the PWM duty cycle value is longer than

                                                                                            the PWM period, the CCP1 pin will not be

                                                                                            cleared.

 2001-2013 Microchip Technology Inc.                                                                                          DS39582C-page 67
PIC16F87XA

8.3.3        SETUP FOR PWM OPERATION

The following steps should be taken when configuring

the CCP module for PWM operation:

1.   Set the PWM period by writing to the PR2 register.

2.   Set   the  PWM   duty  cycle  by     writing  to  the

     CCPR1L register and CCP1CON<5:4> bits.

3.   Make the CCP1 pin an output by clearing the

     TRISC<2> bit.

4.   Set the TMR2 prescale value and enable Timer2

     by writing to T2CON.

5.   Configure the CCP1 module for PWM operation.

TABLE 8-3:          EXAMPLE PWM FREQUENCIES AND RESOLUTIONS AT 20 MHz

             PWM Frequency                1.22 kHz          4.88 kHz  19.53 kHz           78.12kHz    156.3 kHz     208.3 kHz

Timer Prescaler (1, 4, 16)                         16              4           1              1               1             1

PR2 Value                                 0xFFh             0xFFh            0xFFh            0x3Fh   0x1Fh                 0x17h

Maximum Resolution (bits)                          10          10              10             8               7             5.5

TABLE 8-4:          REGISTERS ASSOCIATED WITH CAPTURE, COMPARE AND TIMER1

                                                                                                                 Value on:  Value on

    Address     Name       Bit 7   Bit 6  Bit 5             Bit 4     Bit 3        Bit 2      Bit 1   Bit 0   POR, BOR      all other

                                                                                                                            Resets

0Bh,8Bh,     INTCON         GIE    PEIE   TMR0IE            INTE      RBIE     TMR0IF         INTF    RBIF    0000  000x    0000   000u

10Bh, 18Bh

0Ch          PIR1     PSPIF(1)     ADIF   RCIF              TXIF      SSPIF    CCP1IF         TMR2IF  TMR1IF  0000  0000    0000   0000

0Dh          PIR2           —      —      —                 —         —             —         —       CCP2IF  ----  ---0    ----   ---0

8Ch          PIE1     PSPIE(1)     ADIE   RCIE              TXIE      SSPIE    CCP1IE     TMR2IE      TMR1IE  0000  0000    0000   0000

8Dh          PIE2           —      —      —                 —         —             —         —       CCP2IE  ----  ---0    ----   ---0

87h          TRISC    PORTC Data Direction Register                                                           1111  1111    1111   1111

0Eh          TMR1L    Holding Register for the Least Significant Byte of the 16-bit TMR1 Register             xxxx  xxxx    uuuu   uuuu

0Fh          TMR1H    Holding Register for the Most Significant Byte of the 16-bit TMR1 Register              xxxx  xxxx    uuuu   uuuu

10h          T1CON          —      —      T1CKPS1 T1CKPS0             T1OSCEN  T1SYNC     TMR1CS TMR1ON --00        0000 --uu      uuuu

15h          CCPR1L   Capture/Compare/PWM Register 1 (LSB)                                                    xxxx  xxxx    uuuu   uuuu

16h          CCPR1H   Capture/Compare/PWM Register 1 (MSB)                                                    xxxx  xxxx    uuuu   uuuu

17h          CCP1CON        —      —      CCP1X          CCP1Y        CCP1M3   CCP1M2     CCP1M1      CCP1M0  --00  0000    --00   0000

1Bh          CCPR2L   Capture/Compare/PWM Register 2 (LSB)                                                    xxxx  xxxx    uuuu   uuuu

1Ch          CCPR2H   Capture/Compare/PWM Register 2 (MSB)                                                    xxxx  xxxx    uuuu   uuuu

1Dh          CCP2CON        —      —      CCP2X          CCP2Y        CCP2M3   CCP2M2     CCP2M1      CCP2M0  --00  0000    --00   0000

Legend:      x = unknown, u = unchanged, - = unimplemented, read as ‘0’. Shaded cells are not used by Capture and Timer1.

Note   1:    The PSP is not implemented on 28-pin devices; always maintain these bits clear.

DS39582C-page 68                                                                               2001-2013 Microchip Technology Inc.
                                                                                PIC16F87XA

TABLE 8-5:         REGISTERS ASSOCIATED WITH PWM AND TIMER2

                                                                                                            Value on:  Value on

Address     Name     Bit 7     Bit 6           Bit 5  Bit 4  Bit 3   Bit 2   Bit 1                  Bit 0   POR, BOR   all other

                                                                                                                       Resets

0Bh,8Bh,    INTCON   GIE       PEIE       TMR0IE      INTE   RBIE    TMR0IF  INTF                   RBIF    0000  000x 0000  000u

10Bh, 18Bh

0Ch         PIR1     PSPIF(1)  ADIF       RCIF        TXIF   SSPIF   CCP1IF  TMR2IF                 TMR1IF  0000  0000 0000  0000

0Dh         PIR2     —                 —       —      —      —       —       —                      CCP2IF  ----  ---0 ----  ---0

8Ch         PIE1     PSPIE(1)  ADIE       RCIE        TXIE   SSPIE   CCP1IE  TMR2IE                 TMR1IE  0000  0000 0000  0000

8Dh         PIE2     —                 —       —      —      —       —       —                      CCP2IE  ----  ---0 ----  ---0

87h         TRISC    PORTC Data Direction Register                                                          1111  1111 1111  1111

11h         TMR2     Timer2 Module’s Register                                                               0000  0000 0000  0000

92h         PR2      Timer2 Module’s Period Register                                                        1111  1111 1111  1111

12h         T2CON    —         TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0       TMR2ON  T2CKPS1                T2CKPS0 -000  0000 -000  0000

15h         CCPR1L   Capture/Compare/PWM Register 1 (LSB)                                                   xxxx  xxxx uuuu  uuuu

16h         CCPR1H   Capture/Compare/PWM Register 1 (MSB)                                                   xxxx  xxxx uuuu  uuuu

17h         CCP1CON  —                 —  CCP1X       CCP1Y  CCP1M3  CCP1M2  CCP1M1                 CCP1M0  --00  0000 --00  0000

1Bh         CCPR2L   Capture/Compare/PWM Register 2 (LSB)                                                   xxxx  xxxx uuuu  uuuu

1Ch         CCPR2H   Capture/Compare/PWM Register 2 (MSB)                                                   xxxx  xxxx uuuu  uuuu

1Dh         CCP2CON  —                 —  CCP2X       CCP2Y  CCP2M3  CCP2M2  CCP2M1                 CCP2M0  --00  0000 --00  0000

Legend:     x = unknown, u = unchanged, - = unimplemented, read as ‘0’. Shaded cells are not used by PWM and Timer2.

Note  1:    Bits PSPIE and PSPIF are reserved on 28-pin devices; always maintain these bits clear.

 2001-2013 Microchip Technology Inc.                                                                       DS39582C-page 69
PIC16F87XA

NOTES:

DS39582C-page 70   2001-2013 Microchip Technology Inc.
                                                                                PIC16F87XA

9.0        MASTER SYNCHRONOUS                                      FIGURE 9-1:        MSSP BLOCK DIAGRAM

           SERIAL PORT (MSSP)                                                         (SPI MODE)

           MODULE                                                                                             Internal

                                                                                                             Data Bus

9.1        Master SSP (MSSP) Module                                             Read                       Write

           Overview                                                                         SSPBUF reg

The Master Synchronous Serial Port (MSSP) module is

a serial interface, useful for communicating with other

peripheral or microcontroller devices. These peripheral

devices    may  be      serial  EEPROMs,        shift  registers,                           SSPSR reg

display drivers, A/D converters, etc. The MSSP module              RC4/SDI/SDA        bit0                   Shift

can operate in one of two modes:                                                                             Clock

•  Serial Peripheral Interface (SPI)                               RC5/SDO      Peripheral OE

•  Inter-Integrated Circuit (I2C)

   -  Full Master mode

   -  Slave mode (with general address call)                                    SS Control
                                                                                      Enable

The   I2C   interface   supports    the  following     modes  in   RA5/AN4/

hardware:                                                          SS/C2OUT     Edge

•  Master mode                                                                  Select

•  Multi-Master mode                                                                                  2

•  Slave mode                                                                                  Clock Select

                                                                                            SSPM3:SSPM0

9.2        Control Registers                                                    SMP:CKE        4         TMR22Output

                                                                                            2

The   MSSP     module   has     three    associated    registers.                      Edge

These include a status register (SSPSTAT) and two                                     Select             Prescaler     TOSC

control registers (SSPCON and SSPCON2). The use                    RC3/SCK/SCL                           4, 16, 64

of these registers and their individual configuration bits

differ significantly, depending on whether             the  MSSP                            Data to TX/RX in SSPSR

module is operated in SPI or I2C mode.                                                      TRIS bit

Additional     details  are  provided    under  the    individual

sections.

                                                                   Note:  When the SPI is in Slave mode with SS pin

9.3        SPI Mode                                                       control enabled (SSPCON<3:0> = 0100),

                                                                          the state of the SS pin can affect the state

The SPI mode allows 8 bits of data to be synchronously                    read  back   from    the    TRISC<5>    bit.  The

transmitted    and      received   simultaneously.     All  four          Peripheral OE signal from the SSP mod-

modes      of   SPI     are     supported.  To      accomplish            ule in PORTC controls the state that is

communication, typically three pins are used:                             read  back   from    the    TRISC<5>    bit   (see

•  Serial Data Out (SDO) – RC5/SDO                                        Section 4.3  “PORTC         and    the    TRISC

•  Serial Data In (SDI) – RC4/SDI/SDA                                     Register” for information on PORTC). If

•  Serial Clock (SCK) – RC3/SCK/SCL                                       Read-Modify-Write    instructions,      such  as

                                                                          BSF, are performed on the TRISC register

Additionally, a fourth pin may be used when in a Slave                    while the SS pin is high, this will cause the

mode of operation:                                                        TRISC<5> bit to be set, thus disabling the

•  Slave Select (SS) – RA5/AN4/SS/C2OUT                                   SDO output.

Figure 9-1     shows    the  block  diagram     of     the  MSSP

module when operating in SPI mode.

 2001-2013 Microchip Technology Inc.                                                                    DS39582C-page 71
PIC16F87XA

9.3.1    REGISTERS                                                SSPSR is the shift register used for shifting data in or

The MSSP module has four registers for SPI mode                   out. SSPBUF is the buffer register to which data bytes

operation. These are:                                             are written to or read from.

•  MSSP Control Register (SSPCON)                                 In receive operations, SSPSR and SSPBUF together

•  MSSP Status Register (SSPSTAT)                                 create       a  double-buffered       receiver.  When     SSPSR

                                                                  receives a complete byte, it is transferred to SSPBUF

•  Serial Receive/Transmit Buffer Register                        and the SSPIF interrupt is set.

   (SSPBUF)                                                       During       transmission,  the       SSPBUF     is  not  double-

•  MSSP Shift Register (SSPSR) – Not directly                     buffered. A write to SSPBUF will write to both SSPBUF

   accessible                                                     and SSPSR.

SSPCON   and      SSPSTAT     are  the  control    and   status

registers in SPI mode operation. The SSPCON regis-

ter is readable and writable. The lower six bits of the

SSPSTAT  are      read-only.  The    upper  two    bits  of  the

SSPSTAT are read/write.

REGISTER 9-1:          SSPSTAT: MSSP STATUS REGISTER (SPI MODE) (ADDRESS 94h)

                              R/W-0         R/W-0            R-0  R-0             R-0         R-0       R-0                 R-0

                              SMP           CKE              D/A  P               S           R/W       UA                  BF

                       bit 7                                                                                                bit 0

         bit   7       SMP: Sample bit

                       SPI Master mode:

                       1 = Input data sampled at end of data output time

                       0 = Input data sampled at middle of data output time

                       SPI Slave mode:

                       SMP must be cleared when SPI is used in Slave mode.

         bit   6       CKE: SPI Clock Select bit

                       1 = Transmit occurs on transition from active to Idle clock state

                       0 = Transmit occurs on transition from Idle to active clock state

                              Note:     Polarity of clock state is set by the CKP bit (SSPCON1<4>).

         bit   5       D/A: Data/Address bit

                       Used in I2C mode only.

         bit   4       P: Stop bit

                       Used in I2C mode only. This bit is cleared when the MSSP module is disabled,     SSPEN          is   cleared.

         bit   3       S: Start bit

                       Used in I2C mode only.

         bit   2       R/W: Read/Write bit information

                       Used in I2C mode only.

         bit   1       UA: Update Address bit

                       Used in I2C mode only.

         bit   0       BF: Buffer Full Status bit (Receive mode only)

                       1 = Receive complete, SSPBUF is full

                       0 = Receive not complete, SSPBUF is empty

                       Legend:

                       R = Readable bit                      W = Writable bit     U = Unimplemented bit, read as ‘0’

                       - n = Value at POR                    ‘1’ = Bit is set     ‘0’ = Bit is cleared  x = Bit is unknown

DS39582C-page 72                                                                        2001-2013 Microchip Technology Inc.
                                                                                                 PIC16F87XA

REGISTER 9-2:  SSPCON1: MSSP CONTROL REGISTER 1 (SPI MODE) (ADDRESS 14h)

               R/W-0                       R/W-0   R/W-0        R/W-0             R/W-0          R/W-0        R/W-0   R/W-0

               WCOL                    SSPOV       SSPEN        CKP               SSPM3          SSPM2        SSPM1   SSPM0

               bit 7                                                                                                              bit 0

bit 7          WCOL: Write Collision Detect bit (Transmit mode only)

               1=     The SSPBUF register              is  written while it  is   still  transmitting  the  previous word. (Must  be

                      cleared in software.)

               0=     No collision

bit 6          SSPOV: Receive Overflow Indicator bit

               SPI Slave mode:

               1=     A new byte is received while the SSPBUF register is still holding the previous data. In case

                      of overflow, the data in SSPSR is lost. Overflow can only occur in Slave mode. The user

                      must read the SSPBUF, even if only transmitting data, to avoid setting overflow. (Must be

                      cleared in software.)

               0=     No overflow

               Note:                   In  Master  mode,   the  overflow     bit  is  not  set,  since  each  new  reception  (and

                                       transmission) is initiated by writing to the SSPBUF register.

bit 5          SSPEN: Synchronous Serial Port Enable bit

               1 = Enables serial port and configures SCK, SDO, SDI, and SS as serial port pins

               0 = Disables serial port and configures these pins as I/O port pins

               Note:                   When enabled, these pins must be properly configured as input or output.

bit 4          CKP: Clock Polarity Select bit

               1 = Idle state for clock is a high level

               0 = Idle state for clock is a low level

bit 3-0        SSPM3:SSPM0: Synchronous Serial Port Mode Select bits

               0101 = SPI Slave mode, clock = SCK pin. SS pin control disabled. SS can be used as I/O pin.

               0100 = SPI Slave mode, clock = SCK pin. SS pin control enabled.

               0011 = SPI Master mode, clock = TMR2 output/2

               0010 = SPI Master mode, clock = FOSC/64

               0001 = SPI Master mode, clock = FOSC/16

               0000 = SPI Master mode, clock = FOSC/4

               Note:                   Bit combinations not specifically listed here are either reserved or implemented in

                                       I2C mode only.

               Legend:

               R = Readable bit                        W = Writable bit           U = Unimplemented bit, read as ‘0’

               - n = Value at POR                      ‘1’ = Bit is set           ‘0’ = Bit is cleared        x = Bit is unknown

 2001-2013 Microchip Technology Inc.                                                                         DS39582C-page 73
PIC16F87XA

9.3.2          OPERATION                                                  SSPBUF register during transmission/reception of data

When initializing the SPI, several options need to be                     will be ignored and the write collision detect bit, WCOL

specified. This is done by programming the appropriate                    (SSPCON<7>), will be set. User software must clear

control  bits    (SSPCON<5:0>     and      SSPSTAT<7:6>).                 the WCOL bit so that it can be determined if the follow-

These control bits allow the following to be specified:                   ing  write(s)  to   the  SSPBUF     register  completed

                                                                          successfully.

•  Master mode (SCK is the clock output)                                  When the application software is expecting to receive

•  Slave mode (SCK is the clock input)                                    valid data, the SSPBUF should be read before the next

•  Clock Polarity (Idle state of SCK)                                     byte of data to transfer is written to the SSPBUF. Buffer

•  Data Input Sample Phase (middle or end of data                         Full bit, BF (SSPSTAT<0>), indicates when SSPBUF

   output time)                                                           has been loaded with the received data (transmission

•  Clock Edge (output data on rising/falling edge of                      is complete). When the SSPBUF is read, the BF bit is

   SCK)                                                                   cleared. This data may be irrelevant if the SPI is only a

•  Clock Rate (Master mode only)                                          transmitter. Generally, the MSSP interrupt is used to

•  Slave Select mode (Slave mode only)                                    determine when the transmission/reception has com-

                                                                          pleted. The SSPBUF must be read and/or written. If the

The MSSP consists of a transmit/receive shift register                    interrupt method is not going to be used, then software

(SSPSR) and a buffer register (SSPBUF). The SSPSR                         polling can be done to ensure that a write collision does

shifts the data in and out of the device, MSb first. The                  not  occur.    Example 9-1  shows   the   loading  of  the

SSPBUF holds the data that was written to the SSPSR                       SSPBUF (SSPSR) for data transmission.

until the received data is ready. Once the eight bits of                  The SSPSR is not directly readable or writable and can

data have been received, that byte is moved to the                        only be accessed by addressing the SSPBUF register.

SSPBUF register. Then, the Buffer Full detect bit, BF                     Additionally,  the  MSSP    Status  register  (SSPSTAT)

(SSPSTAT<0>), and the interrupt flag bit, SSPIF, are                      indicates the various status conditions.

set.     This  double-buffering   of   the   received     data

(SSPBUF) allows the next byte to start reception before

reading the data that was just received. Any write to the

EXAMPLE 9-1:           LOADING THE SSPBUF (SSPSR) REGISTER

   LOOP  BTFSS   SSPSTAT,     BF       ;Has   data    been  received(transmit          complete)?

         BRA     LOOP                  ;No

         MOVF    SSPBUF,   W           ;WREG     reg  =   contents    of  SSPBUF

         MOVWF   RXDATA                ;Save     in   user  RAM,  if  data     is  meaningful

         MOVF    TXDATA,   W           ;W   reg  =    contents    of  TXDATA

         MOVWF   SSPBUF                ;New   data    to    xmit

DS39582C-page 74                                                                               2001-2013 Microchip Technology Inc.
                                                                                                      PIC16F87XA

9.3.3         ENABLING SPI I/O                                            9.3.4       TYPICAL CONNECTION

To   enable   the  serial  port,  SSP  Enable   bit,  SSPEN               Figure 9-2  shows   a       typical   connection  between   two

(SSPCON<5>), must be set. To reset or reconfigure                         microcontrollers. The master controller (Processor 1)

SPI    mode,  clear  the   SSPEN       bit,  re-initialize  the           initiates the data transfer by sending the SCK signal.

SSPCON registers and then set the SSPEN bit. This                         Data   is  shifted  out     of  both  shift  registers  on  their

configures the SDI, SDO, SCK and SS pins as serial                        programmed clock edge and latched on the opposite

port pins. For the pins to behave as the serial port func-                edge   of   the     clock.      Both  processors  should    be

tion, some must have their data direction bits (in the                    programmed to the same Clock Polarity (CKP), then

TRIS register) appropriately programmed. That is:                         both controllers would send and receive data at the

•   SDI is automatically controlled by the SPI module                     same time. Whether the data is meaningful (or dummy

•   SDO must have TRISC<5> bit cleared                                    data) depends on the application software. This leads

                                                                          to three scenarios for data transmission:

•   SCK (Master mode) must have TRISC<3> bit                              •  Master sends data–Slave sends dummy data

    cleared

•   SCK (Slave mode) must have TRISC<3> bit set                           •  Master sends data–Slave sends data

•   SS must have TRISC<4> bit set                                         •  Master sends dummy data–Slave sends data

Any serial port function that is not desired may be

overridden    by   programming    the  corresponding        data

direction (TRIS) register to the opposite value.

FIGURE 9-2:                SPI MASTER/SLAVE CONNECTION

             SPI Master SSPM3:SSPM0 = 00xxb                                           SPI Slave SSPM3:SSPM0 = 010xb

                                                  SDO                            SDI

                     Serial Input Buffer                                                      Serial Input Buffer

                           (SSPBUF)                                                                (SSPBUF)

                           Shift Register         SDI                            SDO          Shift Register

                           (SSPSR)                                                                 (SSPSR)

                     MSb                   LSb                                        MSb                       LSb

                                                            Serial Clock

                                                  SCK                            SCK

                     PROCESSOR 1                                                              PROCESSOR 2

 2001-2013 Microchip Technology Inc.                                                                                  DS39582C-page 75
PIC16F87XA

9.3.5           MASTER MODE                                                    Figure 9-3, Figure 9-5 and Figure 9-6, where the MSB

The master can initiate the data transfer at any time                          is transmitted first. In Master mode, the SPI clock rate

because it controls the SCK. The master determines                             (bit   rate)  is  user  programmable         to   be  one  of   the

when   the      slave   (Processor         2,  Figure 9-2)        is  to       following:

broadcast data by the software protocol.                                       •  FOSC/4 (or TCY)

In Master mode, the data is transmitted/received as                            •  FOSC/16 (or 4 • TCY)

soon as the SSPBUF register is written to. If the SPI is                       •  FOSC/64 (or 16 • TCY)

only   going    to   receive,  the       SDO   output      could      be       •  Timer2 output/2

disabled     (programmed       as     an      input).  The     SSPSR           This   allows     a  maximum   data   rate       (at  40  MHz)  of

register will continue to shift in the signal present on the                   10.00 Mbps.

SDI pin at the programmed clock rate. As each byte is

received, it will be loaded into the SSPBUF register as                        Figure 9-3     shows    the    waveforms     for  Master     mode.

if a normal received byte (interrupts and status bits                          When the CKE bit is set, the SDO data is valid before

appropriately    set).  This   could       be  useful      in  receiver        there is a clock edge on SCK. The change of the input

applications as a “Line Activity Monitor” mode.                                sample is shown based on the state of the SMP bit. The

The clock polarity is selected by appropriately program-                       time when the SSPBUF is loaded with the received

ming the CKP bit (SSPCON<4>). This then, would give                            data is shown.

waveforms       for    SPI  communication              as  shown      in

FIGURE 9-3:                 SPI MODE           WAVEFORM               (MASTER  MODE)

      Write to

      SSPBUF

      SCK

      (CKP = 0

      CKE = 0)

      SCK

      (CKP = 1

      CKE = 0)

                                                                                                                                     4 Clock

      SCK                                                                                                                            Modes

      (CKP = 0

      CKE = 1)

      SCK

      (CKP = 1

      CKE = 1)

      SDO                      bit    7        bit 6       bit 5      bit 4    bit 3  bit    2         bit 1  bit 0

      (CKE = 0)

      SDO                      bit    7        bit 6       bit 5      bit 4    bit 3  bit    2         bit 1  bit 0

      (CKE = 1)

      SDI

      (SMP = 0)                                                                                               bit 0

                               bit 7

      Input

      Sample

      (SMP = 0)

      SDI

      (SMP = 1)                       bit  7                                                                         bit 0

      Input

      Sample

      (SMP = 1)

      SSPIF

      SSPSR to                                                                                                              Next Q4 Cycle

      SSPBUF                                                                                                                after Q2

DS39582C-page 76                                                                                        2001-2013 Microchip Technology Inc.
                                                                                      PIC16F87XA

9.3.6        SLAVE MODE                                    the SS pin goes high, the SDO pin is no longer driven

In Slave mode, the data is transmitted and received as     even if in the middle of a transmitted byte and becomes

the external clock pulses appear on SCK. When the          a floating output. External pull-up/pull-down resistors

last bit is latched, the SSPIF interrupt flag bit is set.  may be desirable, depending on the application.

While in Slave mode, the external clock is supplied by     Note 1:       When the SPI is in Slave mode with SS pin

the external clock source on the SCK pin. This external                  control enabled (SSPCON<3:0> = 0100),

clock must meet the minimum high and low times as                        the SPI module will reset if the SS pin is set

specified in the electrical specifications.                              to VDD.

While in Sleep mode, the slave can transmit/receive                  2:  If the SPI is used in Slave Mode with CKE

data. When a byte is received, the device will wake-up                   set,   then  the  SS  pin  control      must  be

from Sleep.                                                              enabled.

                                                           When the SPI module resets, the bit counter is forced

9.3.7        SLAVE SELECT                                  to ‘0’. This can be done by either forcing the SS pin to

             SYNCHRONIZATION                               a high level or clearing the SSPEN bit.

The SS pin allows a Synchronous Slave mode. The            To emulate two-wire communication, the SDO pin can

SPI must be in Slave mode with SS pin control enabled      be connected to the SDI pin. When the SPI needs to

(SSPCON<3:0> = 04h). The pin must not be driven low        operate as a receiver, the SDO pin can be configured

for the SS pin to function as an input. The data latch     as an input. This disables transmissions from the SDO.

must be high. When the SS pin is low, transmission and     The SDI can always be left as an input (SDI function)

reception are enabled and the SDO pin is driven. When      since it cannot create a bus conflict.

FIGURE 9-4:  SLAVE SYNCHRONIZATION                         WAVEFORM

SS

SCK

(CKP = 0

CKE = 0)

SCK

(CKP = 1

CKE = 0)

Write to

SSPBUF

SDO                        bit 7             bit 6                       bit 7                            bit 0

SDI                                                                                                       bit 0

(SMP = 0)                  bit 7                                         bit 7

Input

Sample

(SMP = 0)

SSPIF

Interrupt

Flag                                                                                           Next Q4 Cycle

SSPSR to                                                                                       after Q2

SSPBUF

 2001-2013 Microchip Technology Inc.                                                               DS39582C-page        77
PIC16F87XA

FIGURE 9-5:       SPI  MODE WAVEFORM (SLAVE MODE          WITH   CKE    =  0)

SS

Optional

SCK

(CKP = 0

CKE = 0)

SCK

(CKP = 1

CKE = 0)

Write to

SSPBUF

SDO                       bit 7   bit 6     bit 5  bit 4  bit 3  bit 2         bit  1         bit 0

SDI

(SMP = 0)                 bit 7                                                        bit 0

Input

Sample

(SMP = 0)

SSPIF

Interrupt

Flag

                                                                                              Next Q4 Cycle

SSPSR to                                                                                      after Q2

SSPBUF

FIGURE 9-6:       SPI MODE        WAVEFORM  (SLAVE MODE   WITH   CKE =     1)

SS

Not Optional

SCK

(CKP = 0

CKE = 1)

SCK

(CKP = 1

CKE = 1)

Write to

SSPBUF

SDO               bit  7          bit 6     bit 5  bit 4  bit 3  bit 2         bit  1  bit 0

SDI

(SMP = 0)                 bit  7                                                       bit 0

Input

Sample

(SMP = 0)

SSPIF

Interrupt

Flag

                                                                                              Next Q4 Cycle

SSPSR to                                                                                      after Q2

SSPBUF

DS39582C-page 78                                                          2001-2013   Microchip Technology Inc.
                                                                                      PIC16F87XA

9.3.8          SLEEP OPERATION                                     9.3.10     BUS MODE COMPATIBILITY

In Master mode, all module clocks are halted and the               Table 9-1  shows   the    compatibility  between    the

transmission/reception will remain in that state until the         standard SPI modes and the states of the CKP and

device wakes from Sleep. After the device returns to               CKE control bits.

normal   mode,     the  module  will  continue  to   transmit/

receive data.                                                      TABLE 9-1:         SPI BUS MODES

In Slave mode, the SPI Transmit/Receive Shift register             Standard SPI Mode          Control Bits State

operates asynchronously to the device. This allows the                   Terminology

device to be placed in Sleep mode and data to be                                              CKP                 CKE

shifted  into  the  SPI  Transmit/Receive     Shift  register.                0,  0           0                   1

When all 8 bits have been received, the MSSP interrupt

flag bit will be set and if enabled, will wake the device                     0,  1           0                   0

from Sleep.                                                                   1,  0           1                   1

9.3.9          EFFECTS OF A RESET                                             1,  1           1                   0

A Reset disables the MSSP module and terminates the                There is also a SMP bit which controls when the data is

current transfer.                                                  sampled.

TABLE 9-2:            REGISTERS ASSOCIATED WITH SPI OPERATION

                                                                                              Value on            Value on

Name            Bit 7    Bit 6        Bit 5     Bit 4       Bit 3  Bit 2      Bit 1   Bit 0   POR, BOR            all other

                                                                                                                  Resets

INTCON          GIE/     PEIE/        TMR0IE    INT0IE      RBIE   TMR0IF     INT0IF  RBIF    0000  000x    0000     000u

               GIEH      GIEL

PIR1           PSPIF(1)  ADIF         RCIF      TXIF        SSPIF  CCP1IF     TMR2IF  TMR1IF  0000  0000    0000     0000

PIE1           PSPIE(1)  ADIE         RCIE      TXIE        SSPIE  CCP1IE     TMR2IE  TMR1IE  0000  0000    0000     0000

TRISC          PORTC Data Direction Register                                                  1111  1111    1111     1111

SSPBUF         Synchronous Serial Port Receive Buffer/Transmit Register                       xxxx  xxxx    uuuu     uuuu

SSPCON         WCOL      SSPOV        SSPEN     CKP         SSPM3  SSPM2      SSPM1   SSPM0   0000  0000    0000     0000

TRISA              —     PORTA Data Direction Register                                        --11  1111    --11     1111

SSPSTAT         SMP      CKE           D/A           P          S  R/W            UA  BF      0000  0000    0000     0000

Legend:        x = unknown, u = unchanged, - = unimplemented, read as ‘0’.

               Shaded cells are not used by the MSSP in SPI mode.

Note     1:    The PSPIF, PSPIE and PSPIP bits are reserved on 28-pin devices; always maintain these bits clear.

 2001-2013 Microchip Technology Inc.                                                               DS39582C-page 79
PIC16F87XA

9.4          I2C Mode                                               9.4.1          REGISTERS

The MSSP module in I2C mode fully implements all                    The MSSP module has six registers for I2C operation.

master and slave functions (including general call sup-             These are:

port) and provides interrupts on Start and Stop bits in             •  MSSP Control Register (SSPCON)

hardware to determine a free bus (multi-master func-                •  MSSP Control Register 2 (SSPCON2)

tion).  The  MSSP  module     implements          the  standard     •  MSSP Status Register (SSPSTAT)

mode    specifications,  as   well       as  7-bit  and     10-bit  •  Serial Receive/Transmit Buffer Register

addressing.                                                            (SSPBUF)

Two pins are used for data transfer:                                •  MSSP Shift Register (SSPSR) – Not directly

•  Serial clock (SCL) – RC3/SCK/SCL                                    accessible

•  Serial data (SDA) – RC4/SDI/SDA                                  •  MSSP Address Register (SSPADD)

The user must configure these pins as inputs or outputs             SSPCON, SSPCON2 and SSPSTAT are the control

through the TRISC<4:3> bits.                                        and    status     registers  in   I2C       mode     operation.  The

                                                                    SSPCON and SSPCON2 registers are readable and

FIGURE 9-7:              MSSP BLOCK DIAGRAM                         writable.     The   lower    six  bits      of  the  SSPSTAT     are

                         (I2C MODE)                                 read-only.     The  upper    two      bits  of  the  SSPSTAT     are

                                                                    read/write.

                                                  Internal          SSPSR is the shift register used for shifting data in or

                                                  Data Bus          out. SSPBUF is the buffer register to which data bytes

                  Read                       Write                  are written to or read from.

                                                                    SSPADD        register  holds     the       slave    device   address

   RC3/SCK/SCL                SSPBUF reg                            when the SSP is configured in I2C Slave mode. When

                                                                    the  SSP      is  configured      in  Master       mode,  the    lower

                  Shift                                             seven bits of SSPADD act as the baud rate generator

                  Clock                                             reload value.

                              SSPSR reg                             In receive operations, SSPSR and SSPBUF together

   RC4/SDI/              MSb                 LSb                    create     a   double-buffered        receiver.      When     SSPSR

        SDA

                                                                    receives a complete byte, it is transferred to SSPBUF

                              Match Detect          Addr Match      and the SSPIF interrupt is set.

                                                                    During     transmission,     the      SSPBUF         is  not  double-

                              SSPADD reg                            buffered. A write to SSPBUF will write to both SSPBUF

                                                                    and SSPSR.

                              Start and             Set, Reset

                         Stop bit Detect            S, P bits

                                                    (SSPSTAT reg)

DS39582C-page 80                                                                             2001-2013 Microchip Technology Inc.
                                                                                  PIC16F87XA

REGISTER 9-3:  SSPSTAT: MSSP STATUS REGISTER (I2C MODE) (ADDRESS 94h)

               R/W-0                   R/W-0          R-0  R-0          R-0       R-0           R-0                       R-0

               SMP                     CKE            D/A  P            S         R/W           UA                        BF

               bit 7                                                                                                      bit 0

bit 7          SMP: Slew Rate Control bit

               In Master or Slave mode:

               1 = Slew rate control disabled for standard speed mode (100 kHz and 1 MHz)

               0 = Slew rate control enabled for high-speed mode (400 kHz)

bit 6          CKE: SMBus Select bit

               In Master or Slave mode:

               1 = Enable SMBus specific inputs

               0 = Disable SMBus specific inputs

bit 5          D/A: Data/Address bit

               In Master mode:

               Reserved.

               In Slave mode:

               1 = Indicates that the last byte received or transmitted was data

               0 = Indicates that the last byte received or transmitted was address

bit  4         P: Stop bit

               1 = Indicates that a Stop bit has been detected last

               0 = Stop bit was not detected last

               Note:                   This bit is cleared on Reset and when SSPEN is cleared.

bit  3         S: Start bit

               1 = Indicates that a Start bit has been detected last

               0 = Start bit was not detected last

               Note:                   This bit is cleared on Reset and when SSPEN is cleared.

bit  2         R/W: Read/Write bit information (I2C mode only)

               In Slave mode:

               1 = Read

               0 = Write

               Note:                   This bit holds the R/W bit information following the last address match. This bit       is

                                       only valid from the address match to the next Start bit, Stop bit or not ACK bit.

               In Master mode:

               1 = Transmit is in progress

               0 = Transmit is not in progress

               Note:                   ORing this bit with SEN, RSEN, PEN, RCEN or ACKEN will indicate if the MSSP             is

                                       in Idle mode.

bit 1          UA: Update Address (10-bit Slave mode only)

               1 = Indicates that the user needs to update the address in the SSPADD register

               0 = Address does not need to be updated

bit 0          BF: Buffer Full Status bit

               In Transmit mode:

               1 = Receive complete, SSPBUF is full

               0 = Receive not complete, SSPBUF is empty

               In Receive mode:

               1 = Data Transmit in progress (does not include the ACK and Stop bits), SSPBUF is full

               0 = Data Transmit complete (does not include the ACK and Stop bits), SSPBUF is empty

               Legend:

               R = Readable bit                       W = Writable bit  U = Unimplemented bit, read as ‘0’

               - n = Value at POR                     ‘1’ = Bit is set  ‘0’ = Bit is cleared    x = Bit is unknown

 2001-2013 Microchip Technology Inc.                                                           DS39582C-page 81
PIC16F87XA

REGISTER 9-4:     SSPCON1: MSSP CONTROL REGISTER 1 (I2C MODE) (ADDRESS 14h)

                  R/W-0       R/W-0             R/W-0    R/W-0             R/W-0       R/W-0         R/W-0           R/W-0

                  WCOL        SSPOV             SSPEN    CKP               SSPM3       SSPM2         SSPM1           SSPM0

                  bit 7                                                                                                  bit 0

bit 7             WCOL: Write Collision Detect bit

                  In Master Transmit mode:

                  1=     A write to the SSPBUF register was attempted while the I2C conditions were not valid               for

                         a transmission to be started. (Must be cleared in software.)

                  0=     No collision

                  In Slave Transmit mode:

                  1=     The  SSPBUF   register  is  written while it  is  still  transmitting  the  previous word.  (Must  be

                         cleared in software.)

                  0=     No collision

                  In Receive mode (Master or Slave modes):

                  This is a “don’t care” bit.

bit  6            SSPOV: Receive Overflow Indicator bit

                  In Receive mode:

                  1=     A byte is received while the SSPBUF register is still holding the previous byte. (Must be

                         cleared in software.)

                  0=     No overflow

                  In Transmit mode:

                  This is a “don’t care” bit in Transmit mode.

bit  5            SSPEN: Synchronous Serial Port Enable bit

                  1 = Enables the serial port and configures the SDA and SCL pins as the serial port pins

                  0 = Disables the serial port and configures these pins as I/O port pins

                  Note:       When enabled, the SDA and SCL pins must be properly configured as input or output.

bit  4            CKP: SCK Release Control bit

                  In Slave mode:

                  1 = Release clock

                  0 = Holds clock low (clock stretch). (Used to ensure data setup time.)

                  In Master mode:

                  Unused in this mode.

bit  3-0          SSPM3:SSPM0: Synchronous Serial Port Mode Select bits

                  1111 = I2C Slave mode, 10-bit address with Start and Stop bit interrupts enabled

                  1110 = I2C Slave mode, 7-bit address with Start and Stop bit interrupts enabled

                  1011 = I2C Firmware Controlled Master mode (Slave Idle)

                  1000 = I2C Master mode, clock = FOSC/(4 * (SSPADD + 1))

                  0111 = I2C Slave mode, 10-bit address

                  0110 = I2C Slave mode, 7-bit address

                  Note:       Bit combinations not specifically listed here are either reserved or implemented              in

                              SPI mode only.

                  Legend:

                  R = Readable bit               W = Writable bit          U = Unimplemented bit, read as ‘0’

                  - n = Value at POR             ‘1’ = Bit is set          ‘0’ = Bit is cleared      x = Bit is unknown

DS39582C-page 82                                                                   2001-2013 Microchip Technology Inc.
                                                                                            PIC16F87XA

REGISTER 9-5:  SSPCON2: MSSP CONTROL REGISTER 2 (I2C MODE) (ADDRESS 91h)

               R/W-0                   R/W-0    R/W-0                R/W-0       R/W-0      R/W-0  R/W-0          R/W-0

               GCEN                    ACKSTAT  ACKDT         ACKEN              RCEN       PEN    RSEN           SEN

               bit 7                                                                                              bit 0

bit 7          GCEN: General Call Enable bit (Slave mode only)

               1 = Enable interrupt when a general call address (0000h) is received in the SSPSR

               0 = General call address disabled

bit 6          ACKSTAT: Acknowledge Status bit (Master Transmit mode only)

               1 = Acknowledge was not received from slave

               0 = Acknowledge was received from slave

bit 5          ACKDT: Acknowledge Data bit (Master Receive mode only)

               1 = Not Acknowledge

               0 = Acknowledge

               Note:                   Value that will be transmitted when the user initiates an Acknowledge sequence at

                                       the end of a receive.

bit 4          ACKEN: Acknowledge Sequence Enable bit (Master Receive mode only)

               1=     Initiate Acknowledge sequence on               SDA    and  SCL  pins  and  transmit  ACKDT  data     bit.

                      Automatically cleared by hardware.

               0=     Acknowledge sequence Idle

bit 3          RCEN: Receive Enable bit (Master mode only)

               1 = Enables Receive mode for I2C

               0 = Receive Idle

bit 2          PEN: Stop Condition Enable bit (Master mode only)

               1 = Initiate Stop condition on SDA and SCL pins. Automatically cleared by hardware.

               0 = Stop condition Idle

bit 1          RSEN: Repeated Start Condition Enabled bit (Master mode only)

               1 = Initiate Repeated Start condition on SDA and SCL pins. Automatically cleared by hardware.

               0 = Repeated Start condition Idle

bit 0          SEN: Start Condition Enabled/Stretch Enabled bit

               In Master mode:

               1 = Initiate Start condition on SDA and SCL pins. Automatically cleared by hardware.

               0 = Start condition Idle

               In Slave mode:

               1 = Clock stretching is enabled for both slave transmit and slave receive (stretch enabled)

               0 = Clock stretching is enabled for slave transmit only (PIC16F87X compatibility)

               Legend:

               R = Readable bit                 W = Writable bit            U = Unimplemented bit, read as ‘0’

               - n = Value at POR               ‘1’ = Bit is set            ‘0’ = Bit is cleared   x = Bit is unknown

               Note:                   For bits ACKEN, RCEN, PEN, RSEN, SEN: If the I2C module is not in the Idle mode,

                                       this bit may not be set (no spooling) and the SSPBUF may not be written (or writes

                                       to the SSPBUF are disabled).

 2001-2013 Microchip Technology Inc.                                                                      DS39582C-page 83
PIC16F87XA

9.4.2       OPERATION                                             9.4.3.1          Addressing

The MSSP module functions are enabled by setting                  Once the MSSP module has been enabled, it waits for

MSSP Enable bit, SSPEN (SSPCON<5>).                               a Start condition to occur. Following the Start condition,

The SSPCON register allows control of the I2C opera-              the 8 bits are shifted into the SSPSR register. All incom-

tion. Four mode selection bits (SSPCON<3:0>) allow                ing bits are sampled with the rising edge of the clock

one of the following I2C modes to be selected:                    (SCL) line. The value of register SSPSR<7:1> is com-

    I2C Master mode, clock = OSC/4 (SSPADD + 1)                   pared   to  the  value   of  the  SSPADD      register.     The

•                                                                 address is compared on the falling edge of the eighth

•   I2C Slave mode (7-bit address)                                clock (SCL) pulse. If the addresses match, and the BF

•   I2C Slave mode (10-bit address)                               and SSPOV bits are clear, the following events occur:

•   I2C Slave mode (7-bit address) with Start and                 1.  The SSPSR register value is loaded into the

    Stop bit interrupts enabled                                       SSPBUF register.

•   I2C Slave mode (10-bit address) with Start and                2.  The Buffer Full bit, BF, is set.

    Stop bit interrupts enabled                                   3.  An ACK pulse is generated.

•   I2C Firmware Controlled Master mode, slave is                 4.  MSSP Interrupt Flag bit, SSPIF (PIR1<3>), is

    Idle                                                              set  (interrupt  is  generated    if  enabled)  on   the

Selection of any I2C mode, with the SSPEN bit set,                    falling edge of the ninth SCL pulse.

forces the SCL and SDA pins to be open-drain, pro-                In 10-bit Address mode, two address bytes need to be

vided these pins are programmed to inputs by setting              received by the slave. The five Most Significant bits

the appropriate TRISC bits. To ensure proper operation            (MSbs) of the first address byte specify if this is a 10-bit

of   the  module,     pull-up  resistors  must  be  provided      address. Bit R/W (SSPSTAT<2>) must specify a write

externally to the SCL and SDA pins.                               so the slave device will receive the second address

9.4.3       SLAVE MODE                                            byte. For a 10-bit address, the first byte would equal

                                                                  ‘11110      A9   A8  0’, where ‘A9’ and ‘A8’ are the two

In Slave mode, the SCL and SDA pins must be config-               MSbs    of  the  address.    The  sequence    of    events    for

ured as inputs (TRISC<4:3> set). The MSSP module                  10-bit address is as follows, with steps 7 through 9 for

will override the input state with the output data when           the slave-transmitter:

required (slave-transmitter).                                     1.  Receive first (high) byte of address (bits SSPIF,

The I2C Slave mode hardware will always generate an                   BF and bit UA (SSPSTAT<1>) are set).

interrupt   on  an    address   match.    Through   the  mode     2.  Update the SSPADD register with second (low)

select bits, the user can also choose to interrupt on                 byte of address (clears bit UA and releases the

Start and Stop bits                                                   SCL line).

When an address is matched, or the data transfer after            3.  Read the SSPBUF register (clears bit BF) and

an address match is received, the hardware automati-                  clear flag bit SSPIF.

cally will generate the Acknowledge (ACK) pulse and               4.  Receive      second    (low)  byte    of  address   (bits

load   the  SSPBUF    register   with     the  received  value        SSPIF, BF and UA are set).

currently in the SSPSR register.                                  5.  Update the SSPADD register with the first (high)

Any combination of the following conditions will cause                byte of address. If match releases SCL line, this

the MSSP module not to give this ACK pulse:                           will clear bit UA.

•   The buffer full bit, BF (SSPSTAT<0>), was set                 6.  Read the SSPBUF register (clears bit BF) and

    before the transfer was received.                                 clear flag bit SSPIF.

•   The overflow bit, SSPOV (SSPCON<6>), was set                  7.  Receive Repeated Start condition.

    before the transfer was received.                             8.  Receive first (high) byte of address (bits SSPIF

In this case, the SSPSR register value is not loaded                  and BF are set).

into the SSPBUF, but bit SSPIF (PIR1<3>) is set. The              9.  Read the SSPBUF register (clears bit BF) and

BF bit is cleared by reading the SSPBUF register, while               clear flag bit SSPIF.

bit SSPOV is cleared through software.

The SCL clock input must have a minimum high and

low for proper operation. The high and low times of the

I2C   specification,  as  well  as  the   requirement    of  the

MSSP module, are shown in timing parameter #100

and parameter #101.

DS39582C-page 84                                                                        2001-2013 Microchip Technology Inc.
                                                                                         PIC16F87XA

9.4.3.2       Reception                                         9.4.3.3     Transmission

When the R/W bit of the address byte is clear and an            When the R/W bit of the incoming address byte is set

address match occurs, the R/W bit of the SSPSTAT                and    an  address  match  occurs,        the   R/W  bit  of  the

register is cleared. The received address is loaded into        SSPSTAT register is set. The received address is loaded

the   SSPBUF      register  and  the  SDA  line  is  held  low  into the SSPBUF register. The ACK pulse will be sent on

(ACK).                                                          the ninth bit and pin RC3/SCK/SCL is held low regard-

When the address byte overflow condition exists, then           less of SEN (see Section 9.4.4 “Clock Stretching” for

the No Acknowledge (ACK) pulse is given. An overflow            more detail). By stretching the clock, the master will be

condition is defined as either bit BF (SSPSTAT<0>) is           unable to assert another clock pulse until the slave is

set or bit SSPOV (SSPCON<6>) is set.                            done   preparing    the  transmit   data.  The  transmit      data

                                                                must be loaded into the SSPBUF register, which also

An MSSP interrupt is generated for each data transfer           loads  the  SSPSR        register.  Then   pin  RC3/SCK/SCL

byte. Flag bit SSPIF (PIR1<3>) must be cleared in soft-         should be enabled by setting bit CKP (SSPCON<4>).

ware. The SSPSTAT register is used to determine the             The eight data bits are shifted out on the falling edge of

status of the byte.                                             the SCL input. This ensures that the SDA signal is valid

If SEN is enabled (SSPCON<0> = 1), RC3/SCK/SCL                  during the SCL high time (Figure 9-9).

will be held low (clock stretch) following each data trans-     The ACK pulse from the master-receiver is latched on

fer.  The  clock  must  be  released   by  setting   bit   CKP  the rising edge of the ninth SCL input pulse. If the SDA

(SSPCON<4>). See Section 9.4.4 “Clock Stretching”               line is high (not ACK), then the data transfer is com-

for more detail.                                                plete. In this case, when the ACK is latched by the

                                                                slave, the slave logic is reset (resets SSPSTAT regis-

                                                                ter) and the slave monitors for another occurrence of

                                                                the Start bit. If the SDA line was low (ACK), the next

                                                                transmit data must be loaded into the SSPBUF register.

                                                                Again, pin RC3/SCK/SCL must be enabled by setting

                                                                bit CKP.

                                                                An MSSP interrupt is generated for each data transfer

                                                                byte. The SSPIF bit must be cleared in software and

                                                                the SSPSTAT register is used to determine the status

                                                                of the byte. The SSPIF bit is set on the falling edge of

                                                                the ninth clock pulse.

 2001-2013 Microchip Technology Inc.                                                                      DS39582C-page 85
DS39582C-page 86                                                                                                                                                                                                            FIGURE 9-8:                 PIC16F87XA

                                                                                                                                                                                                                            I2C SLAVE

                                                            Receiving Address                R/W = 0             Receiving Data                   ACK             Receiving Data              ACK                           MODE

                                  SDA              A7  A6   A5  A4  A3             A2    A1     ACK      D7  D6  D5  D4           D3  D2  D1  D0       D7  D6  D5  D4  D3         D2  D1  D0

                                  SCL    S         1   2    3   4   5              6     7   8        9  1   2   3   4            5   6   7   8   9    1   2   3   4   5          6   7   8   9             P               TIMING

                                  SSPIF                                                                                                                                                            Bus master               WITH

                                  (PIR1<3>)                                                                                                                                                        terminates

                                                                                                                                                                                                   transfer

                                  BF (SSPSTAT<0>)                                                                                                                                                                           SEN

                                                                                                             Cleared in software                                                                                            =

                                                                                                             SSPBUF is read                                                                                                 0

                                  SSPOV (SSPCON<6>)                                                                                                                                                                         (RECEPTION, 7-BIT ADDRESS)

                                                                                                                                                                                              SSPOV is set

                                                                                                                                                                                              because SSPBUF is

 2001-2013 Microchip Technology                                                                                                                                                              still full. ACK is not sent.

                                  CKP        (CKP does not  reset to ‘0’ when SEN  = 0)

Inc.
 2001-2013 Microchip                                                                                                                                                                                                     FIGURE 9-9:

Technology Inc.                                     Receiving Address      R/W =  1                                  Transmitting Data               ACK                        Transmitting        Data      ACK         I2C SLAVE

                       SDA              A7  A6      A5  A4  A3  A2     A1            ACK                D7   D6  D5  D4              D3  D2  D1  D0             D7  D6  D5  D4              D3  D2  D1    D0

                       SCL              1        2  3   4   5   6      7   8         9                  1    2   3   4               5   6   7   8   9          1   2   3   4               5   6   7     8   9           MODE

                            S

                                        Data in                                           SCL held low                                                                                                                 P  TIMING

                                        sampled                                           while CPU

                                                                                          responds to SSPIF

                       SSPIF (PIR1<3>)

                       BF (SSPSTAT<0>)                                                                                                                                                                                    (TRANSMISSION,

                                                                                                                Cleared in software                                     Cleared in software

                                                                                                                                                From SSPIF ISR                                         From SSPIF ISR

                                                                                                             SSPBUF is written in software                          SSPBUF is written in software

                       CKP                                                                                                                                                                                                7-BIT

                                                                                                                                                                                                                          ADDRESS)        PIC16F87XA

                                                                                                             CKP is set in software                                 CKP is set in software

DS39582C-page 87
DS39582C-page 88                                                                                                                                                                                                                                                                    FIGURE 9-10:                 PIC16F87XA

                                                                                               Clock is held low until                            Clock is held low until

                                                                                               update of SSPADD has                               update of SSPADD has

                                                                                               taken place                                        taken place

                                             Receive First Byte of Address                         Receive Second           Byte  of Address                               Receive Data Byte                        Receive Data Byte              ACK                              I2C SLAVE

                                                                               R/W = 0

                                  SDA        1       1  1  1     0   A9     A8          ACK    A7           A6  A5      A4  A3    A2  A1      A0  ACK          D7  D6      D5  D4   D3  D2      D1  D0  ACK  D7  D6  D5  D4  D3        D2  D1  D0

                                  SCL    S   1       2  3  4     5   6      7        8     9       1        2   3       4   5     6   7       8   9            1   2       3   4    5   6       7   8   9    1   2   3   4   5         6   7   8   9    P                           MODE

                                                                                                                                                                                                                                                           Bus master

                                  SSPIF                                                                                                                                                                                                                    terminates               TIMING

                                                                                                                                                                                                                                                           transfer

                                  (PIR1<3>)

                                                Cleared in software                                             Cleared in software                                        Cleared in software                       Cleared in software

                                  BF (SSPSTAT<0>)                                                                                                                                                                                                                                   WITH

                                                        SSPBUF is written with                     Dummy read of SSPBUF

                                                        contents of SSPSR                          to clear BF flag

                                  SSPOV (SSPCON<6>)                                                                                                                                                                                                                                 SEN

                                                                                                                                                                                                                                                      SSPOV is set

                                                                                                                                                                                                                                                      because SSPBUF is             =

                                                                                                                                                                                                                                                      still full. ACK is not sent.  0

                                  UA   (SSPSTAT<1>)                                                                                                                                                                                                                                 (RECEPTION, 10-BIT ADDRESS)

                                                        UA is set indicating that                           Cleared by hardware                                    Cleared by hardware when

                                                        the SSPADD needs to be                              when SSPADD is updated                                 SSPADD is updated with high

                                                        updated                                             with low byte of address                               byte of address

 2001-2013 Microchip Technology                                                                                UA is set indicating that

                                                                                                                SSPADD needs to be

                                                                                                                updated

                                  CKP        (CKP    does not reset to ‘0’ when SEN     =  0)

Inc.
 2001-2013 Microchip                                                                                                                                                                                                                                              FIGURE 9-11:

Technology Inc.                                                                                                                                                                                                                                        Bus master  I2C SLAVE

                                                                                                                                                                                                                                                       terminates

                                                                               Clock is held low until                           Clock is held low until                                                                                               transfer

                                                                               update of SSPADD has                              update of SSPADD has                                         Clock is held low until

                                                                               taken place                                       taken place                                                  CKP is set to ‘1’

                                                                      R/W = 0

                                  Receive  First  Byte  of  Address                Receive Second            Byte of Address                      Receive    First  Byte  of  Address  R/W=1              Transmitting        Data  Byte          ACK

                       SDA        1     1  1      1     0   A9  A8       ACK   A7           A6  A5      A4   A3  A2  A1    A0    ACK              1       1    1    1     0   A9  A8      ACK        D7   D6     D5    D4     D3    D2    D1  D0                   MODE

                       SCL    S   1     2  3      4     5   6   7     8  9         1        2   3       4    5   6    7       8  9                1       2    3    4     5   6   7    8  9          1    2      3     4      5     6     7   8   9    P           TIMING

                                                                                                                                              Sr

                       SSPIF                                                                                                                                                                                                                                       (TRANSMISSION,

                       (PIR1<3>)

                                                                                            Cleared in software                                   Cleared in software                                            Cleared in software

                       BF (SSPSTAT<0>)

                                           SSPBUF is written with              Dummy read of SSPBUF                                   Dummy read of SSPBUF                                                Write of SSPBUF                     Completion of

                                           contents of SSPSR                   to clear BF flag                                       to clear BF flag                            BF flag is clear        initiates transmit

                                                                                                                                                                                  at the end of the                                           data transmission

                       UA (SSPSTAT<1>)                                                                                                                                            third address sequence                                      clears BF flag

                                           UA is set indicating that                        Cleared by hardware when                          Cleared by hardware when                                                                                             10-BIT

                                           the SSPADD needs to be                           SSPADD is updated with low                        SSPADD is updated with high

                                           updated                                          byte of address                                   byte of address

                                                                                                UA is set indicating that

                                                                                                SSPADD needs to be                                                                                                                                                 ADDRESS)

                       CKP (SSPCON<4>)                                                          updated                                                                                                                                                                            PIC16F87XA

                                                                                                                                                                                               &nbs