NEC remote control decoder with PIC16F887 and mikroC compiler

In this blog I made NEC remote control decoder using Microchip PIC16F887 8-bit microcontroller and CCS C compiler, and this topic shows how to build the same project but using MikroElektronika mikroC PRO for PIC compiler.
Previous project and some information about the NEC protocol:
NEC Protocol decoder with PIC16F887 microcontroller – CCS C

Components Required:

  • PIC16F887 microcontroller   —> datasheet
  • IR Receiver
  • 1602 LCD screen
  • 10k ohm variable resistor
  • 5V Power source
  • Protoboard
  • Jumper wires
  • PIC MCU Programmer (PICkit 3, PICkit 4…)

NEC remote control decoder with PIC16F887 MCU and mikroC compiler circuit:
NEC decoder circuit diagram is shown below.

NEC remote control decoder circuit

In this example the PIC16F887 runs with its internal oscillator and MCLR pin function is disabled (configured in software).

The IR receiver has three pins (from left to right): GND, VCC and OUT where:
GND pin is connected to circuit ground.
VCC pin is positive power supply pin and it is connected to +5V.
OUT pin is the data pin and it is connected to PIC16F887 microcontroller RB0 pin (#33).

The 1602 LCD screen (2 rows and 16 columns) is used to display remote control decoded data, it is connected to the PIC16F887 MCU as follows:
RS —> pin RD0
E   —> pin RD1
D4 —> pin RD2
D5 —> pin RD3
D6 —> pin RD4
D7 —> pin RD5
VSS, RW, D0, D1, D2, D3, and K are connected to circuit ground
VEE to the variable resistor (or potentiometer) output
VDD to +5V and A to +5V through 330 ohm resistor.
VEE pin is used to control the contrast of the LCD. A (anode) and K (cathode) are the back light LED pins.

NEC remote control decoder with PIC16F887 microcontroller mikroC code:
The C code below was tested with mikroC pro for PIC version 7.1.0.
The PIC16F887 is configured to work with its internal oscillator @ 8MHz.

The message of the NEC protocol is 32-bit long: address (16 bits), command (8 bits), and inverted command (8 bits). Before the 32 bits there is 9ms burst and 4.5ms space.
A logic 1 is represented by 562.5µs burst and 562.5µs space (total of 1125µs) and a logic 0 is represented by 562.5µs burst and 1687.5µs space (total of 2250µs).
Keep in mind that the IR receiver output is always inverted.

The interval [ 9500µs, 8500µs ] is used for the 9ms pulse and for the 4.5ms space the interval [ 5000µs, 4000µs ] is used.
The 562.5µs pulse is checked with the interval [ 700µs, 400µs ] .
For the 562.5µs or 1687.5µs space I used the interval [ 1800µs, 400µs ], and to know if its a short or long space I used a length of 1000µs.

The output of the IR receiver is connected to the external interrupt pin RB0 (PORTB change interrupt), every change in the pin status generates an interrupt and Timer1 starts calculating, Timer1 value will be used in the next interrupt, this means Timer1 calculates the time between two interrupts which is pulse time or space time. Also, Timer1 interrupt is used to reset the decoding process in case of very long pulse or very long space.
Timer1 time step is 1µs (Timer1 increments every 1µs). If you use mcu frequency other than 8MHz, make sure to keep Timer1 time step to 1µs, otherwise time intervals have to be changed.
The decoding results are displayed on 1602 LCD screen connected to PORTD.

This project should gives the result shown in the following video:


Discover more from Simple Circuit

Subscribe to get the latest posts sent to your email.

8 thoughts on “NEC remote control decoder with PIC16F887 and mikroC compiler”

  1. Hi
    The start 9ms pulse and 526.5us pulse composed of many small number of carrier pulses, so wouldn’t it trigger interrupt service routine.?

    The diagram of the nec signal can be found in the link: http://simple-circuit.com/wp-content/uploads/2017/11/nec-protocol-modulation.png

    It seems that the code considers the received signal as a continuous pulses instead of modulated carrier wave. Please help me understand why wouldn’t the timer1 be reset when a second high(or low-according to the type of edge detection) of the same pulse comes(according to your code)?

  2. hy
    please can you tell me that if i wouldn’t use Internal oscillator then i what to do?? mean i wan to use this program in PIC16F72. please can you help me??

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Scroll to Top