Monday, January 21, 2019

1 How to make(build) a Calculator using Pic16f877 microcontroller

Calculator with Pic 16f877 microcontroller is a comprehensive project. Comprehensive in the way that code is lengthy and logical. It will be hard for newbies to understand the code and circuit components interface with pic microcontroller. I will try to explain each and every thing about code and circuit thoroughly. The project covers all the aspects of programming and interfacing of 16x2 character lcd and 4x4 numeric keypad and pic16f877 microcontroller. One should already know about 16x2 lcd working and 4x4 numeric keypad interface with microcontroller before beginning with the project. I have a good tutorial on 16x2 lcd pin out and working. You must first go with this tutorial if you don't know about 16x2 lcd pin out, working principle and interface with microcontrollers.

What pic microcontroller calculator offers?

I am going to build a 2-Digit calculator with pic microcontroller. Four functions addition, subtraction, multiplication and division(+,-,/,*) can be performed on single digit numbers using the calculator made with pic microcontroller. User Inputs the numbers and operator using 4x4 numeric keypad and pic microcontroller after manipulating the numbers displays result on 16x2 lcd.

Calculator with pic microcontroller - Working

When you turn on/power the system. A message will be displayed on the 16x2 lcd first row "Enter First No = ". You enter the number. As soon as you enter number it will be displayed on the 16x2 lcd screen. Then a second message will appear on 16x2 lcd first row asking to "Enter Operator = ". You entered the operator. Then a third message will prompt up saying "Enter Second No= ". You entered the second number. When you are done with entering the second number. Result will be displayed on 16x2 lcd. Calculator arithmetic operation result is shown below.
Calculator with pic16f877 microcontroller output
Calculator with pic16f877 microcontroller output

Pic16f877 microcontroller calculator - Project requirements

  • Pic16f877 Microcontroller
  • 16x2 lcd 
  • 4x4 keypad
  • Crystal 20 MHz
  • Potentiometer/variable resistor (For setting Lcd Contrast)
  • Bread board or PCB for Circuit Designing
  • Power Supply

Two digit calculator with pic microcontroller - Circuit diagram

Lcd data pins are connected to Port-B of PIC16f877 Microcontroller. Lcd Controlling pins RS(Register Select) and EN(Enable) are connected to Port-D Pin# 6 & 7. Keypad is interfaced with Port-C of pic microcontroller. Rows of keypad are connected to lower nibble of Port-C. Coulombs are connected to upper nibble of Port-C. Apply 5 volts at VDD & VCC Pins of microcontroller and 16x2 lcd display. Ground VSS Pins of pic microcontroller and lcd display. Crystal is connected to Pin# 13 & 14 of PIC16f877 microcontroller. Circuit diagram of pic microcontroller calculator project is given below.
Calculator build Using Pic16f877a microcontroller - Circuit Diagram
Calculator build Using Pic16f877a microcontroller - Circuit Diagram

Calculator using pic microcontroller - Project code

Code portion is little bit difficult. But if you are familiar with syntax of C++ language and did some good work in c++ then the code below is easy for you to understand and to modify. First htc.h header file is included in the project. This header file must be included in every project that is using HIGH-TECH C compiler for compiling the code. Since i am using HIGH-TECH C compiler so i included it. Then the statement _XTAL_FREQ 20e6 is defining our crystal frequency. Which is 20 MHz. Next i defined Port-C & D pins for 16x2 lcd and keypad interface. Each port pin is also given a meaning full name. After that some functions are defined. Then some strings are defined. These strings are displayed on 16x2 lcd display. The strings are used to communicate with the user.

Functions which are part of pic microcontroller calculator code

void main()
Main Function the heart of the code. Main function executes first. All other functions executes after it.
void lcdcmd  (unsigned char)
This function sends commands and controls lcds registers to execute the command properly.  
void lcddata (unsigned char)
This function sends data to lcd display and controls lcds registers to display data on 16x2 lcd.
void disp_num(float num)
This function displays calculated value or output result on 16x2 lcd display efficiently. 
int get_num  (char ch)
This function converts character value to integer. To display integer value on 16x2 lcd it must first be converted in to character format. On 16x2 lcd we can display a character 8-bit value.
void lcdinit ()
This function initializes the character lcd display. 16x2 lcd, font-size 7x5, cursor blinking etc.
char scan_key(void)
This functions checks which keypad key is pressed by the user.


Each and every Statement of the code is well commented. Go through the code and if you feel any problem in any statement just leave your queries in the comments section below.

Project Code


Download the project code from the links given at the bottom of the Post.



#include< htc.h>
#define _XTAL_FREQ 20e6
#define rs RD6
#define en RD7
#define r0 RC0
#define r1 RC1
#define r2 RC2
#define r3 RC3
#define c0 RC4
#define c1 RC5
#define c2 RC6
#define c3 RC7

void lcdcmd  (unsigned char);
void lcddata (unsigned char);
void disp_num(float num);
int get_num  (char ch);
void lcdinit ();
char scan_key(void);

unsigned char  s[]={"ENTER 1 NO= "};
unsigned char s1[]={"ENTER 2 NO= "};
unsigned char s2[]={"OPERATOR = "};
unsigned char s3[]={"***RESULT***"};

void lcdinit(){
 __delay_ms(400); lcdcmd(0x30); __delay_ms(400); lcdcmd(0x30);
__delay_ms(400); lcdcmd(0x30); __delay_ms(400); lcdcmd(0x38);
    lcdcmd(0x0F); lcdcmd(0x01); lcdcmd(0x06); lcdcmd(0x80);
}

void main (void)
  {
    TRISC=0xF0;        //Rows Output, Coulombs Input
    TRISB=0x00;        //Port-B as Output
    TRISD6=0;          //Port-D PIN-6 as Output
    TRISD7=0;          //Port-D PIN-7 as Output
    __delay_ms(400);
  
   unsigned int count=0;
   int k2,k1; 
   char ke,key,key1;
   lcdinit();        //Initializing Lcd

 while(1){   
      while(s[count]!='\0')     //Displaying String s on LCD
      {
        lcddata(s[count]);
        count++;
      }

ke=scan_key();   //Scan the First Digit
k2=get_num(ke);  //Converting Char into number
lcdcmd(0x01);    //Clear Lcd
count=0;

while(s2[count]!='\0')    //Displaying String s2 on LCD
{
lcddata(s2[count]);
count++;
}

key=scan_key();  //Scaning operator
lcdcmd(0x01);    //Cleat Lcd
count=0;

while(s1[count]!='\0')  //Displaying String s1 on LCD
{
lcddata(s1[count]);
count++;
}

key1=scan_key();  //Scan Second digit
k1=get_num(key1); //Converting Char into number
lcdcmd(0x01);     //Clear Lcd
lcdcmd(0x82);     //Start displying data on lcd at position Row=1 Coulomb=3
count=0;

while(s3[count]!='\0')  //Displaying String s3 on LCD
{
lcddata(s3[count]);
count++;
}
count=0;
lcdcmd(0xC0);   //Jump to second Line of Lcd
lcddata(ke);
lcddata(key);
lcddata(key1);
lcddata(' ');
lcddata('=');

switch(key)
{
case '+':
disp_num(k1+k2);
break;
case '-':
disp_num(k2-k1);
break;
case '*':
disp_num(k2*k1);
break;
case '/':
disp_num((float)k2/k1);
break;
}
}
}

void lcdcmd(unsigned char value)  //Sending Commands to Lcd
  {
    PORTB = value;      
    rs = 0;
    en = 1;            
    __delay_ms(100);
    en = 0;
    __delay_ms(100);    
  }
void lcddata(unsigned char value) //Sending Data to Lcd
  {
    PORTB = value;  
    rs = 1;
    en = 1;          
    __delay_ms(100);
    en = 0;
    __delay_ms(100);
  }
  


char scan_key()      //Scan the Pressed Key by user 
{
unsigned char c='s';
while(c!='a')
{
r0=0;r1=1;r2=1;r3=1;
if(c0==1 && r0==0){ lcddata('7');__delay_ms(500);return '7';c='a';}
if(c1==1 && r0==0){ lcddata('8');__delay_ms(500);return '8';c='a';}
if(c2==1 && r0==0){ lcddata('9');__delay_ms(500);return '9';c='a';}
if(c3==1 && r0==0){ lcddata('/');__delay_ms(500);return '/';c='a';}
r0=1;r1=0;r2=1;r3=1;
if(c0==1 && r1==0){ lcddata('4');__delay_ms(500);return '4';c='a';}
if(c1==1 && r1==0){ lcddata('5');__delay_ms(500);return '5';c='a';}
if(c2==1 && r1==0){ lcddata('6');__delay_ms(500);return '6';c='a';}
if(c3==1 && r1==0){ lcddata('*');__delay_ms(500);return '*';c='a';}
r0=1;r1=1;r2=0;r3=1;
if(c0==1 && r2==0){ lcddata('1');__delay_ms(500);return '1';c='a';}
if(c1==1 && r2==0){ lcddata('2');__delay_ms(500);return '2';c='a';}
if(c2==1 && r2==0){ lcddata('3');__delay_ms(500);return '3';c='a';}
if(c3==1 && r2==0){ lcddata('-');__delay_ms(500);return '-';c='a';}
r0=1;r1=1;r2=1;r3=0;
if(c1==1 && r3==0){ lcddata('0');__delay_ms(500);return '0';c='a';}
if(c3==1 && r3==0){ lcddata('+');__delay_ms(500);return '+';c='a';}
}
return 0;
}

int get_num(char ch)         //converting character into integer
{
switch(ch)
{
case '0': return 0; break;
case '1': return 1; break;
case '2': return 2; break;
case '3': return 3; break;
case '4': return 4; break;
case '5': return 5; break;
case '6': return 6; break;
case '7': return 7; break;
case '8': return 8; break;
case '9': return 9; break;
}
return 0;
}

void disp_num(float num)            //Displays calculated value on LCD
{
unsigned char UnitDigit  = 0;  //Contains unit digit of calculated value
unsigned char TenthDigit = 0;  //contains 10th digit of calculated value
unsigned char decimal = 0;
int j,numb;

j=(int)(num*10);
numb=(int)num;

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

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

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

UnitDigit = numb - (TenthDigit*10);

lcddata(UnitDigit+0x30); // Make Char of UnitDigit and then display it on LCD
lcddata('.');
decimal=(j%10)+0x30;             //Display If any value after Decimal Point
lcddata(decimal);
__delay_ms(3000);
lcdcmd(0x01);
}
C-like
More projects about calculators involving different other microcontrollers. Each project is made with 16x2 lcd display, 4x4 keypad and an intelligent unit, the microcontroller. Every project is open source. One can modify and use code according to his/her needs.  

No comments:

Post a Comment

สรุปงานที่ 5 Internet of Things (IoT)

Internet of Things (IoT) คืออะไร           Internet of Things (IoT) คือ  "อินเตอร์เน็ตในทุกสิ่ง" หมายถึง การที่อุปกรณ์ต่างๆ ส...