PIC16F877A – DC Motor Interfacing

This article is a continuation of the series of tutorials on the PIC16F877A Microcontroller. The aim of this series is to provide easy and practical examples that anyone can understand. In the previous tutorial, we have used that LCD in 4-bit mode. In this tutorial, we are going to learn DC Motor Interfacing with PIC16F877A. Let’s run….



When we talk about controlling the robot, the first thing that comes into mind is controlling DC motors. Interfacing DC motor to the microcontroller is a very important concept in Robotic applications. By interfacing the DC motor to the microcontroller, we can do many things like controlling the direction of the motor, controlling the speed of the motor. This article describes how to control the DC motor using the PIC16F877A controller.

A DC motor in simple words is a device that converts electrical energy (direct current system) into mechanical energy. It is of vital importance for the industry today.

The maximum output current of the microcontroller pin is 15mA at 3.3V. But the power requirements of most DC motors are out of reach of the microcontroller and even the back emf (electromotive force) which is produced by the motor may damage the microcontroller. Hence it is not good to interface the DC motor directly to the controller. So use a motor driver circuit in between of DC motor and controller.

Here, we are using an L293D motor driver IC to drive DC motors. Using this IC, we can drive 2 DC motors at a time. For this IC motor supply is variable 4.5 to 36V and it provides a maximum current of 600mA. Just refer here for the L293d Driver’s operation.

DC Motor Interfacing with PIC16F877A

Circuit Diagram

  • Input 1 – Port B.0 (RB0)
  • Input 2 – Port B.1 (RB1)
  • Enable 1 – Directly giving 5v
  • Button – Port B.2 (RB2)

Working Algorithm


  • EN Pin High  (En1 = 1 or En2 = 1)
  • Input 1 or Input 3 Pin High (In1 = 1 or In3=1)
  • Input 2 or Input 4 Pin Low (In2 = 0 or In4 = 0)


  • EN Pin High  (En1 = 1 or En2 = 1)
  • Input 1 or Input 3 Pin Low (In1 = 0 or In3=0)
  • Input 2 or Input 4 Pin Low (In2 = 1 or In4 = 1)


In this code, the motor will rotate forward when we press the button. Here I’ve connected buttons one end into +5v. So in the if function I’m checking with 1 if(sw==1). But if you connect that end into the ground, you should check with 0 if(sw==0).


#define in1 RB0
#define in2 RB1
#define sw RB2

void main()
    while(1) {
        if(sw==1) {
        } else {


DC Motor Interfacing with PIC16F877A[ Please find the output image Here ]


  • The maximum current capacity of L293 is 600mA/channel. So do not use a motor that consumes more than that.
  • The supply voltage range of L293 is between 4.5 and 36V DC. So you can use a motor falling in that range.
  • Mostly in Robotic application, we will use DC gear Motor. So the same logic is used for that Gear motor also.

In our next tutorial, we will see how to interface the Relay with PIC16F877A.

You can also read the below tutorials.

Linux Device Driver TutorialsC Programming Tutorials
FreeRTOS TutorialsNuttX RTOS Tutorials
RTX RTOS TutorialsInterrupts Basics
I2C Protocol – Part 1 (Basics)I2C Protocol – Part 2 (Advanced Topics)
STM32 TutorialsLPC2148 (ARM7) Tutorials
PIC16F877A Tutorials8051 Tutorials
Unit Testing in C TutorialsESP32-IDF Tutorials
Raspberry Pi TutorialsEmbedded Interview Topics
Reset Sequence in ARM Cortex-M4BLE Basics
VIC and NVIC in ARMSPI – Serial Peripheral Interface Protocol
STM32F7 Bootloader TutorialsRaspberry PI Pico Tutorials
STM32F103 Bootloader TutorialsRT-Thread RTOS Tutorials
Zephyr RTOS Tutorials - STM32Zephyr RTOS Tutorials - ESP32
AUTOSAR TutorialsUDS Protocol Tutorials
Product ReviewsSTM32 MikroC Bootloader Tutorial
VHDL Tutorials
Notify of

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

Newest Most Voted
Inline Feedbacks
View all comments
Table of Contents