PIC16F84A i2c (bit banging) code and Proteus simulation

This post provides the i2c bit banging code for PIC16F84A microcontroller. As we know[1], PIC16F84A microcontroller doesn’t have any built in i2c modules, so we have to create it in the software. This code is written in C language using MPLAB with HI-TECH C compiler. You can download this code from the ‘Downloads‘ section at the bottom of this page.

PIC16F84A i2c

It is assumed that you know how to blink an LED with PIC16F84A microcontroller. If you don’t then please read this page first, before proceeding with this article. It is also assumed that you know how i2c protocol works, if you don’t then please read this page first.

The result of simulating the code in Proteus is shown below.

In the above circuit[2], RA4 pin is being used as SDA pin and RB0 pin is the SCK pin. Both of these pins are pulled up using 10K resistors as required for i2c protocol. Proteus provides an ‘I2C Debugger Tool‘ which is attached on the SDA and SCK pins in the above circuit. This i2c debugger tool receives all the i2c messages and displays them on the ‘I2C Debug‘ window displayed in above figure. Close up image of this ‘I2C Debug‘ window is shown below in the figure.

In the above figure, ‘I2C Debugger Tool‘ is telling us that first of all it received i2c start bit S. Then a value of 0xA0 was received. After that, there was a NACK bit (named as N in the above figure). After the NACK, a value of 0xFF was there on i2c bus. After that, an ACK was there (named as A) in the above figure, and in the end i2c stop bit (named as P) was received. When this Proteus simulation started then after 54.801usec PIC16F84A started sending this i2c data and stopped at 2.149msec time.

PIC16F84A i2c schematic


The code for the main function is shown below.

In the main function, firstly i2c pins are initialized using InitI2C() function. Then I2C_Start() function sends a start bit S on i2c bus. Then a value of 0xA0 is written on the i2c bus using I2C_Write_Byte(0xA0); statement. After that, I2C_Read_Byte() function reads a byte from the i2c bus, because there is no slave attached on the i2c bus, that is why RxByte will receive a value of 0xFF[3]. After that, an ACK ‘A‘ is transmitted on i2c bus using I2C_Send_ACK() function. And in the end a stop bit ‘P‘ is transmitted on i2c bus using I2C_Stop() function.


I2C code for PIC16F84A was compiled in MPLAB v8.85 with HI-TECH C v9.83 compiler and simulation was made in Proteus v7.10. To download code and Proteus simulation click here.


For more detail: PIC16F84A i2c (bit banging) code and Proteus simulation

About The Author

Ibrar Ayyub

I am an experienced technical writer holding a Master's degree in computer science from BZU Multan, Pakistan University. With a background spanning various industries, particularly in home automation and engineering, I have honed my skills in crafting clear and concise content. Proficient in leveraging infographics and diagrams, I strive to simplify complex concepts for readers. My strength lies in thorough research and presenting information in a structured and logical format.

Follow Us:

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.