PIC16f877 based simple calculator project

Summary of PIC16f877 based simple calculator project


This article describes a simple one-digit calculator implemented on a PIC16F877 using a keypad and LCD. Written in C (HI-TECH C) and developed in MPLAB, it supports addition, subtraction, multiplication, and division, with error handling and a clear/reset button. The project includes Proteus simulation and downloadable code.

Parts used in the PIC16F877 Calculator:

  • PIC16F877 microcontroller
  • Keypad (matrix keypad for digits and function keys)
  • 16x2 LCD display
  • Proteus simulation software (for circuit diagram and simulation)
  • MPLAB IDE (used for compiling)
  • HI-TECH C compiler (v9.83)
  • Power supply (regulated for PIC16F877)
  • Wiring and prototyping components (connectors, resistors as needed)

This PIC microcontroller tutorial provides a simple calculator implementation for PIC16F877 microcontroller. This is a simple one digit[1] calculator which implements only 4 functions addition(+), subtraction(-), multiplication(x) and division(/). The code for PIC16F877 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.

PIC16f877 based simple calculator

In this post, it is assumed that you know,

  • How to interface keypad with PIC16F877 microcontroller. If you don’t then please read this page.
  • How to interface LCD with PIC16F877 microcontroller. If you don’t then please read this page.

The following diagram (made in Proteus) shows the PIC microcontroller circuit diagram.

PIC16f877 based simple calculator schematic

Figure 1.   Circuit diagram for implementing calculator on PIC16F877

In the above figure, we can see that a result of “2+2=4” is shown on the screen. To achieve this result, first press ‘2’ from the keypad. Then press ‘+’ and then press ‘2’ again. After that, on pressing ‘=’ from the keypad the result ‘4’ is automatically displayed on the screen.

Features of this calculator

  • You can give any single digit input from 0 to 9.
  • You can press ‘ON/C‘ button at any time to reset the calculator.
  • 4 functions are implemented i-e addition, subtraction, multiplication and division.
  • Error messages are displayed if wrong input is detected. For example, if calculator is expecting a number, but a function key is pressed then ‘Wrong Input‘ message is displayed. Similarly, ‘Wrong Function‘ message is displayed if wrong key is pressed instead of a function key.

Main function code

The code for the main function is shown below.

 

/*  Name     : main.c
 *  Purpose  : Main file for calculator code for PIC16F877.
 *  Date     : 25-11-12
 *  *  Revision : None
 */
#include "Includes.h"

// Configuration word for PIC16F877
__CONFIG( FOSC_HS & WDTE_OFF & PWRTE_ON & CP_OFF & BOREN_ON 
		& LVP_OFF & CPD_OFF & WRT_ON & DEBUG_OFF);

// Main function
void main(void)
{	
	char key;           // Key char for keeping record of pressed key
	int num1 = 0;       // First number
	char func = '+';    // Function to be performed among two numbers
	int num2 = 0;       // Second number

	InitKeypad();       // Initialize Keypad
	InitLCD();			// Initialize LCD

   while(1)
   { 
     //get numb1
     key = GetKey();
     ClearLCDScreen();	    	// Clear LCD screen 
	 WriteDataToLCD(key);       // Echo the key pressed to LCD
	 num1 = get_num(key);       // Get int number from char value, it checks for wrong input as well

	 if(num1!=Error)            // If correct input then proceed, num1==Error means wrong input
	 {
		 //get function
		 key = GetKey();
		 WriteDataToLCD(key);             //Echo the key pressed to LCD
		 func = get_func(key);            //it checks for wrong func

		 if(func!='e')                    //if correct input then proceed, func=='e' means wrong input
		 {
			 //get numb2
			 key = GetKey();
			 WriteDataToLCD(key);         //Echo the key pressed to LCD
			 num2 = get_num(key);         //Get int number from char value, it checks for wrong input as well

			 if(num2!=Error)              //if correct input then proceed, num2==Error means wrong input
			 {
				 //get equal sign
				 key = GetKey();
				 WriteDataToLCD(key);     //Echo the key pressed to LCD

				 if(key == '=')           //if = is pressed then proceed
				 {
					 switch(func)         //switch on function
					 {
					 case '+': disp_num(num1+num2); break;
					 case '-': disp_num(num1-num2); break;
					 case 'x': disp_num(num1*num2); break;
					 case '/': disp_num(num1/num2); break;
					 }
				 }
				 else				      //key other then = here means error wrong input
				 { 
					 if(key == 'C')       //if clear screen is pressed then clear screen and reset
						ClearLCDScreen(); // Clear LCD screen 
					 else
						DispError(0); 	  //Display wrong input error
				 }                                 
			 }
		 }
     }
   }
}

/*
 * Functions used inside main for 
 * making calculator are shown below
 */

int get_num(char ch)         //convert char into int
{
	int num = 0;

	switch(ch)
	{
		case '0': num = 0; break;
		case '1': num = 1; break;
		case '2': num = 2; break;
		case '3': num = 3; break;
		case '4': num = 4; break;
		case '5': num = 5; break;
		case '6': num = 6; break;
		case '7': num = 7; break;
		case '8': num = 8; break;
		case '9': num = 9; break;
		case 'C': ClearLCDScreen(); num = Error; break;  //this is used as a clear screen and then reset by setting error
		default: DispError(0); num = Error; break;       //it means wrong input
	}

	return num;
}

char get_func(char chf)            //detects the errors in inputted function
{
	if(chf=='C')                   //if clear screen then clear the LCD and reset
	{ 
		ClearLCDScreen();          //clear display
		return 'e'; 
	}

	if( chf!='+' && chf!='-' && chf!='x' && chf!='/' )  //if input is not from allowed funtions then show error
	{ 
		DispError(1); 
		return 'e'; 
	}

	return chf;                        //function is correct so return the correct function
}

void DispError(int numb)           //displays differet error messages
{
	ClearLCDScreen();              //clear display

	switch(numb)
	{
	case 0: 	WriteStringToLCD("Wrong Input");      break;
	case 1: 	WriteStringToLCD("Wrong Function");   break;
	default:    WriteStringToLCD("Wrong Input");      break;
	}
}

void disp_num(int numb)            //displays number on LCD
{	
	unsigned char UnitDigit  = 0;  //It will contain unit digit of numb
	unsigned char TenthDigit = 0;  //It will contain 10th position digit of numb

	if(numb<0)
	{
		numb = -1*numb;          // Make number positive
		WriteDataToLCD('-');	 // Display a negative sign on LCD
	}

	TenthDigit = (numb/10);	                  // Findout Tenth Digit

	if( TenthDigit != 0)	                  // If it is zero, then don't display
		WriteDataToLCD(TenthDigit+0x30);	  // Make Char of TenthDigit and then display it on LCD

	UnitDigit = numb - TenthDigit*10;

	WriteDataToLCD(UnitDigit+0x30);	  // Make Char of UnitDigit and then display it on LCD
}

 

 

In the main code, firstly keypad and LCD are initialized. Then the code waits for the first number[1] from the keypad. After getting this number LCD screen is cleared. And this number is displayed on the LCD. After that, code waits for the function key[2] from the user. After getting the function key, code waits for the second number[1] and then the equal sign. After getting the equal sign, according to the desired function the result is calculated and displayed on the screen.

You can leave your comments in the comment section below.

Notes and References

[1]  You can give any single digit input from 0 to 9.
[2]  You can select any function i-e ‘+’ or ‘-‘ or ‘x’ or ‘/’.

Downloads

The calculator code for PIC16F877 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.

Quick Solutions to Questions related to PIC16F877 Calculator:

  • What operations does the calculator support?
    The calculator supports addition, subtraction, multiplication, and division.
  • How many digits can I input?
    You can input any single digit from 0 to 9.
  • How do I reset the calculator?
    Press the ON/C button at any time to clear the LCD and reset the calculator.
  • What happens if I press a function key when a number is expected?
    The calculator displays Wrong Input error.
  • What happens if I press a non-function key when a function is expected?
    The calculator displays Wrong Function error.
  • Which tools and compilers were used to develop and simulate the project?
    The code was compiled in MPLAB v8.85 with HI-TECH C v9.83 and simulated in Proteus v7.10.
  • In what language is the PIC code written?
    The code is written in C language using HI-TECH C compiler.
  • How is the result displayed after entering inputs?
    After entering number, function, second number, and pressing = the result is calculated and displayed on the LCD.

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:
LinkedinTwitter