Digital Voltmeter using PIC16F877a

This is a simple project showing you how to make a digital voltmeter of range 0-20V using microcontroller PIC16F877A and a Liquid Crystal Display 16×4 HD44780 LCD in Proteus ISIS.

The microcontroller PIC 16F877A has 8 analog input channels for the in-built 10-bit ADC. In this project AN2 channel of pic16F877A microcontroller is used. ADC module of pic microcontroller converts analog signal into binary numbers. PIC16F877A microcontroller have 10 bit ADC. So it converts analog signal to 10 bit digital number which can be back converted into voltage and displayed on LCD.

Digital Voltmeter using PIC16F877a 2
block diagram of pic based ADC module

ou cannot feed 20V directly to a PIC I/O pin, you need a resistor divider network that converts 0-20V range into 0-5 V. A 5.1V Zener diode in the figure is to prevent V3 (V in) to rise above 5.1V if the input voltage goes much above 20V. This will protect the microcontroller.

Digital Voltmeter using PIC16F877a 3
voltage converter

PIC16F877A  microcontroller built in ADC (analog to digital converter) is used to measure analog voltage. The analog to digital conversion isdone by the PIC ADC module. In the code, I’ve used the mikro C library function for ADC. You can view the library file in this link

Code Designing in MikroC Pro For PIC :

So, here’s the programming code you need to use for Displaying voltage value on LCD using PIC Microcontroller in Proteus ISIS:

* Project name:
Digital Voltmeter (Voltage measurement)
* Copyright:
(c) LET'S THINk BINARY, 2017.
* Revision History:
* Description:
This digital voltmeter using PIC16F877A can read voltage only between 0-20 volt.
Voltage is displayed on LCD.
* Test configuration:
MCU: PIC16f877a
Oscillator: 8.0000 MHz Crystal
SW: mikroC PRO for PIC
- This Our Group (thanks to join and participate) :
- Facebook page (thanks to like and share) :
- Youtube Channel (thanks to subscribe) :
// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections
char *text;
unsigned int v,vp;
char *volt = "00.00 VOLTS";
//char *volt = "00.000 VOLTS"; // format 00.000
void main()
CMCON = 0x07; // Comparators OFF
TRISA = 0x04; // Configure RA2 as Inpu
ADCON1 = 0x80; // Configure PORTA & PORTE as analog
Lcd_Init(); // LCD display initialization
Lcd_Cmd(_LCD_CURSOR_OFF); // LCD command (cursor off)
Lcd_Cmd(_LCD_CLEAR); // LCD command (clear LCD)
text = "LET'S THINK BINARY"; // Define the first message
Lcd_Out(1,2,text); // Write the first message in the first line
text = ""; // Define the second message
Lcd_Out(2,1,text); // Write the message in the second line
text = "DIGITAL Voltmeter"; // Define the third message
Lcd_Out(3,2,text); //Write the message in the third line
v = ADC_Read(2); // Read analog value from channel 2
v = ((v*4.89)/5)*20; // V GOES FROM 0 TO 20 volts
// Resolution 10 bits ( 0......1023)
if(v!=vp )
vp = v;
volt[0] = (v/10000)+ 48; // Extract volts (thousands of millivolts) from result
// Write result in ASCII format
volt[1] = (v/1000)%10+48; // Extract thousands of mv
volt[3] = (v/100)%10+48; // Extract hundreds of mv
volt[4] = (v/10)%10+48; // Extract tens of millivolts if you want the format 00.000
Lcd_Out(4,1,"Voltage= ");
} while(1);

Digital Voltmeter using PIC16F877a (Schematic Diagram)

Digital Voltmeter using PIC16F877a schematic diagram
digital voltmeter upto 20 volt range animated circuit diagram

Results :

Compile the PIC code and generate the hex file from it. For simulating with PROTEUS ISIS hit run button and then you will get above output.

So, now we can see the LCD is displaying exactly the same values as are shown in the voltmeter. Now if you change the value of variable resistor RV3 then the value of voltage will change in LCD.

This digital voltmeter using PIC16F877A can read voltage only between 0-20 volt.
Resource :

You can download the MikroC Source Code and Proteus files etc from this link :
zip file of complete project digital voltmeter using pic16f677A
This Our Group (thanks to join and participate) :this link
Facebook page : this link
Youtube Channel (thanks to subscribe) : this link

For another similar project visit here: Digital Voltmeter using PIC16F877a

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.