**PIC16F84** adalah mikrokontroler keluarga mid range yang dikeluarkan oleh Microchip Corporation. PIC16F84 dibangun dengan arsitektur RISC atau dikenal juga sebagai Arsitektur Harvard. PIC16F84 memiliki 35 buah set instruksi sehingga mudah dipelajari bagi pemula. Semua instruksi PIC16F84 menggunakan satu siklus operasi, kecuali instruksi percabangan. Satu siklus instruksi terdiri dari 4 siklus kristal, artinya PIC16F84 dapat mencapai kecepatan 1 MIPS (Million Instruction per Second) hanya dengan kristal 4 MHz. PIC16F84 dapat dipacu hingga frekuensi kerja 20 MHz dan tegangan kerja nya bervariasi dari 2,0 Volt hingga 5,5 Volt. PIC16F84 hadir dalam kemasan 18 pin PDIP (Plastic Dual In Line Package), 18 pin SOIC (Small Outline Integrated Circuit) dan 20 pin SSOP (Shrink Small Outline). PIC16F84 dapat dapat diprogram dengan mudah melalui ICSP™ (In-Circuit Serial Programming™) tanpa harus membuat rangkaian programmer yang rumit dan mahal.

PIC16F84 memiliki memori program sebesar 1024 word, RAM sebesar 68 byte dan EEPROM sebesar 64 byte. Setiap word memori program lebarnya 14 bit, digunakan untuk menyimpan opcode dan operand sedangkan setiap byte RAM dan EEPROM lebarnya 8 bit. Perbedaan ukuran RAM dan memori program disebabkan oleh Arsitektur Harvard yang memisahkan memori program dan memori data, hal ini meningkatkan efisiensi memori program. Memori program PIC16F84 berjenis memori flash, secara teoretis dapat dihapus dan diprogram ulang hingga 10 ribu kali dan EEPROM nya dapat dihapus dan ditulis ulang hingga 10 juta kali. Hal ini membuat PIC16F84 cocok untuk penelitian, pengembangan program maupun aplikasi terapan.

RAM PIC16F84 terbagi menjadi 2 bagian yaitu SFR (Special Function Register) dan GPR (General Purpose Register). GPR dapat digunakan secara bebas untuk keperluan umum dan dapat dialamati secara langsung (direct addressing) ataupun tidak langsung (indirect addressing). PIC16F84 memiliki 15 buah SFR dengan fungsi spesifik seperti konfigurasi port, flag dan sebagainya. Sayangnya PIC16F84 mampu menangani pemanggilan subrutin hingga kedalaman 8 tingkat sehingga diperlukan trik khusus untuk melakukan pemanggilan subrutin yang memiliki kedalaman lebih dari 8 tingkat.

Sebagaimana umumnya mikrokontroler, PIC16F84 pun menangani interupsi, tepatnya dari pin RB0/INT, overflow pencacah TMR0, perubahan pada PORTB pin 7 hingga pin 4 dan indikator selesainya penulisan EEPROM. PIC16F84 juga memiliki fitur reset otomatis ketika catu daya dinyalakan, fitur ini lebih dikenal dengan sebutan POR (Power on Reset). Fitur lainnya adalah Power-up Timer (PWRT), Oscillator Start-up Timer (OST) dan Watchdog Timer (WDT), pengamanan kode program, penghematan daya (modus SLEEP), .

Dari sisi perangkat, PIC16F84 dilengkapi 13 buah pin masukan/keluaran (I/O) yang dapat dikendalikan secara individual. Setiap pin tersebut mampu menyuplai dan menyerap arus hingga 25 mA, sehingga dapat digunakan secara langsung untuk mengendalikan LED (Light Emitting Diode). Selain itu PIC16F84 dilengkapi *pencacah* 8 bit yang tersambung dengan preskalar untuk membagi frekuensi masukan pencacah dengan faktor tertentu.

**Ringkasan Fitur:**

* Memori program 1024 byte, masing masing selebar 14 bit.
* 68 byte RAM, masing-masing selebar 8 bit.
* 64 byte EEPROM, masing-masing selebar 8 bit.
* 15 buah register fungsi khusus (SFR)
* Stack 8 tingkat.
* Interupsi Eksternal
* 13 buah pin I/O yang dapat dikendalikan secara individual.
* Pencacah 8 bit.
* Watchdog Timer.
* Proteksi Kode
* Modus penghematan daya.

Pemetaan Pin
------------

Mikrokontroler PIC16F84 hadir dalam kemasan 18 pin SOIC dan DIP juga dalam kemasan 20 pin SSOP.

* PIC16F84 dalam kemasan DIP dan SOICPIC16F84 dalam kemasan DIP dan SOIC
* PIC16F84 dalam kemasan SSOPPIC16F84 dalam kemasan SSOP

**Pemetaan pin PIC16F84 dalam kemasan DIP san SOIC (18 Pin)**

| No. | Nama | Jenis | I/O/P | Penjelasan |
| --- | --- | --- | --- | --- |
| 1 | RA2 | TTL | I/O (masukan/keluaran) | Port A, Pin 2 |
| 2 | RA3 | TTL | I/O (masukan/keluaran) | Port A, pin 3 |
| 3 | RA4/T0CKI | ST | I/O (masukan/keluaran) | Port A, pin 4 / masukan detak pencacah TMR0 |
| 4 | MCLR | ST | I/P (masukan dan catu daya) | Master Reset dan masukan tegangan pemrogramman |
| 5 | Vss | - | P (catu daya) | Masukan Catu Daya (ground) |
| 6 | RB0/INT | TTL/ST | I/O (masukan/Keluaran) | Port B, pin 0 / masukan interupsi eksternal |
| 7 | RB1 | TTL | I/O | Port B, pin 1 |
| 8 | RB2 | TTL | I/O (masukan/keluaran) | Port B, pin 2 |
| 9 | RB3 | TTL | I/O | Port B, pin 3 |
| 10 | RB4 | TTL | I/O (masukan/keluaran) | Port B, pin 4 |
| 11 | RB5 | TTL | I/O (masukan/keluaran) | Port B, pin 5 |
| 12 | RB6 | TTL/ST | I/O (masukan/keluaran) | Port B, pin 6 / Masukan clock ICSP |
| 13 | RB7 | TTL/ST | I/O (masukan/keluaran) | Port B, pin 7 / Masukan data ICSP |
| 14 | VDD | - | P (catu daya) | Masukan catu positif |
| 15 | OSC2/CLKOUT | - | O (hanya keluaran) | Keluaran osilator kristal |
| 16 | OSC1/CLKIN | - | I (Hanya masukan) | Masukan osilator kristal atau detak eksternal |
| 17 | RA0 | TTL | I/O (masukan/keluaran) | Port A, pin 0 |
| 18 | RA1 | TTL | I/O (masukan/keluaran) | Port A, pin 1 |

**Pemetaan pin PIC16F84 dalam kemasan SSOP**

| No. | Nama | Jenis | I/O/P | Penjelasan |
| --- | --- | --- | --- | --- |
| 1 | RA2 | TTL | I/O (masukan/keluaran) | Port A, Pin 2 |
| 2 | RA3 | TTL | I/O (masukan/keluaran) | Port A, pin 3 |
| 3 | RA4/T0CKI | ST | I/O (masukan/keluaran) | Port A, pin 4 / masukan detak pencacah TMR0 |
| 4 | MCLR | ST | I/P (masukan dan catu daya) | Master Reset dan masukan tegangan pemrogramman |
| 5 | Vss | - | P (catu daya) | Masukan Catu Daya (ground) |
| 6 | Vss | - | P (catu daya) | Masukan Catu Daya (ground) |
| 7 | RB0/INT | TTL/ST | I/O (masukan/Keluaran) | Port B, pin 0 / masukan interupsi eksternal |
| 8 | RB1 | TTL | I/O | Port B, pin 1 |
| 9 | RB2 | TTL | I/O (masukan/keluaran) | Port B, pin 2 |
| 10 | RB3 | TTL | I/O | Port B, pin 3 |
| 11 | RB4 | TTL | I/O (masukan/keluaran) | Port B, pin 4 |
| 12 | RB5 | TTL | I/O (masukan/keluaran) | Port B, pin 5 |
| 13 | RB6 | TTL/ST | I/O (masukan/keluaran) | Port B, pin 6 / Masukan clock ICSP |
| 14 | RB7 | TTL/ST | I/O (masukan/keluaran) | Port B, pin 7 / Masukan data ICSP |
| 15 | VDD | - | P (catu daya) | Masukan catu positif |
| 16 | VDD | - | P (catu daya) | Masukan catu positif |
| 17 | OSC2/CLKOUT | - | O (hanya keluaran) | Keluaran osilator kristal |
| 18 | OSC1/CLKIN | - | I (Hanya masukan) | Masukan osilator kristal atau detak eksternal |
| 19 | RA0 | TTL | I/O (masukan/keluaran) | Port A, pin 0 |
| 20 | RA1 | TTL | I/O (masukan/keluaran) | Port A, pin 1 |

Memori
------

Memori program PIC16F84 berukuran 1024 word, dari alamat 0x00 hingga alamat 0x3ff,
masing-masing selebar 14 bit. Vektor interupsi PIC16F84 terletak di alamat 0x04 dan
vektor resetnya terletak di alamat 0x00. RAM PIC16F84 dibagi menjadi 2 dua bank (semacam halaman), yaitu bank 0 dan bank 1. Bank 0 berkisar dari alamat 0x00 hingga 0x4f dan Bank 1 berkisar antara alamat 0x80 hingga 0xcf, sementara RAM dari 0x50 hingga 0x7f dan dari 0xd0 hingga 0xff tidak dapat digunakan. Pemilihan Bank memori aktif ditentukan oleh bit RP1 dan RP0 pada register STATUS. 12 Byte pertama RAM pada masing-masing bank digunakan sebagai SFR, jelasnya dari 0x00 hingga 0x0b dan 0x80 hingga 0x8b. Daerah pada RAM selain FSR dinamakan GPR.

**Pemetaan RAM**

| Alamat | Nama |  | Alamat | Nama |
| --- | --- | --- | --- | --- |
| 0x00 | INDF |  | 0x80 | INDF |
| 0x01 | TMR0 |  | 0x81 | OPTION\_REG |
| 0x02 | PCL |  | 0x82 | PCL |
| 0x03 | STATUS |  | 0x83 | STATUS |
| 0x04 | FSR |  | 0x84 | FSR |
| 0x05 | PORTA |  | 0x85 | TRISA |
| 0x06 | PORTB |  | 0x86 | TRISB |
| 0x07 | - |  | 0x87 | - |
| 0x08 | EEDATA |  | 0x88 | EECON1 |
| 0x09 | EEADR |  | 0x89 | EECON2 |
| 0x0a | PCLATH |  | 0x8a | PCLATH |
| 0x0b | INTCON |  | 0x8b | INTCON |
| 0x0c | GPR |  | 0x8c | GPR |
| ... | ... |  | ... | ... |
| ... | ... |  | ... | ... |
| 0x50 | Tidak digunakan |  | 0xD0 | Tidak digunakan |
| ... | ... |  | ... | ... |
| ... | ... |  | ... | ... |
| 0x7f | Tidak digunakan |  | 0xff | Tidak digunakan |

SFR (Special Function Register)
-------------------------------

**INDF**

Register INDF digunakan untuk membaca data yang tersimpan pada register lain yang ditunjuk oleh register FSR. Register INDF menempati dua lokasi, yaitu 0x00 (bank 0) dan 0x80 (bank 1). Register ini dapat dibaca dibaca dan ditulisi.

**TMR0**

Register TMR0 menyimpan hasil cacahan pencacah TMR0, dapat dibaca dan ditulisi dan alamatnya adalah 0x01. Karena pencacah TMR0 hanya memiliki lebar 8 bit maka nilai register TMR0 berkisar dari 0x00 hingga 0xff.

**PCL**

Register PCL menyimpan 8 bit terbawah Counter Program. Register PCL beralamat di 0x02 (bank 0) dan 0x82 (bank 1). Register PCL bernilai 0x00 setelah reset atu setelah catu daya dinyalakan.

**STATUS**

Register status menyimpan kondisi flag dan indikator pengendali. Register status beralamat di 0x03 (bank 0) dan 0x83 (bank 1). Setelah reset atau catu daya dinyalakan, nilai register STATUS berkisar antara 0x18 and 0x1f, hal tersebut terjadi karena bit flag tidak dapat ditentukan secara pasti setelah proses reset.

| BIT | bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| NAMA | IRP | RP1 | RP0 | TO | PD | Z | DC | C |
| JENIS | R/W | R/W | R/W | R | R | R/W | R/W | R/W |
| DEFAULT | 0 | 0 | 0 | 1 | 1 | x | x | x |

**FSR**

register FSR digunakan untuk menunjuk register lain yang akan dialamati secara tidak langsung. Register FSR dapat dibaca dan ditulisi. Register FSR menempati alamat 0x04 dan 0x84. Misalnya, jika FSR berisi 0x10 maka INDF akan berisi nilai dari register yang beralamat di 0x10. Register ini menempati alamat 0x04.

**PORTA**

register PORTA merupakan buffer PORTA, baik untuk penulisan maupun pembacaan. Setelah reset atau setelah catu daya dinyalakan, nilai PORTA tidak dapat ditentukan secara pasti. Register ini menempati alamat 0x05.

**PORTB**

register PORTB merupakan buffer PORTB, baik untuk penulisan maupun pembacaan. Setelah reset atau setelah catu daya dinyalakan, nilai PORTB tidak dapat ditentukan secara pasti.Register ini menempati alamat 0x06.

**EEDATA**

Register EEDATA digunakan sebagai buffer membaca dan menulis ke EEPROM, karena pembacaan dan penulisan EEPROM dilakukan secara tidak langsung.

**EEADR**

register EEADR digunakan untuk menunjuk alamat EEPROm yang akan dibaca atau ditulisi. EEADR dapat dibaca dan ditulisi.

**PCLATH**

Register PCLATH digunakan untuk menuliskan 5 bit teratas Program COunter. Registr ini hanya dapat ditulisi saja.

**INTCON**

Register INTCOn digunakan untuk mengendalikan interupsi terhadap mikrokontroler, baik flag interupsi, aktivasi interupsi secara individual maupun aktivasi interupsi secara global.

**OPTION\_REG**

OPTION\_REG digunakan untuk menyimpan pengagaturan perangkat mikronkontroler PIC16F84 secara umum.

**TRISA**

TRISA digunakan untuk mengendalikan arah PORTA secara individual, apakah itu sebagai masukan atau keluaran. Jika suatu bit a REGISTER TRISA bernilai 1 maka bit a PORTA akan bertindak sebagai input, begitu pula sebaliknay jika bit tersebut bernilai 0, maka bit yang bersangkutan akan bertindak sebagai keluaran. Defaultnya, setelah reset semua bit TRISA bernilai 1 atau PORTA defaultnya adalah masukan.

**TRISB**

TRISB bekerja mirip dengan TRISA, hanya saja port yang dikendalikan yaitu PORTB.

**EECON1**

EECON1 dan EECON2 digunakan dalam proses penulisan EEPROM.

Set Instruksi
-------------

Mikrokontroler PIC16F84 termasuk mikrokontroler mid-range yang menggunakan set instruksi 14-bit. Set instruksi 14-bit terdiri dari 35 buah.

* Lihat set instruksi 14-bit

Pranala luar
------------