You are on page 1of 10

Calculadora

Juan Manuel Laiseca, Mara Alejandra Pez, Carol Quiroga, Carlos Romero
Facultad de ingeniera biomdica, Universidad Manuela Beltrn
Bogot, Colombia
manuelacho94@hotmail.com
alejandra.paez_25@hotmail.com
cayuquipi@hotmail.com
cafemtb_@hotmail.com

Abstract this project is based on developing a calculator


with basic functions, where a PIC18F4550 microcontroller,


En la pantalla LCD es posible visualizar las
an LCD display and a keypad matrix was used. instrucciones para el usuario y el resultado de las
Microcontroller programming was done in C language from operaciones, y por medio del teclado matricial el
program PIC C. usuario ingresa los valores que desea operar y la
I. OBJETIVOS operacin que desea realizar.

Objetivo General I. PROCEDIMIENTO

Como ya se ha mencionado el fin de este


Elaborar una calculadora de operaciones proyecto es crear una calculadora que realice
bsicas mediante la programacin del operaciones bsicas que se puedan visualizar en una
PIC18F4550. pantalla LCD y los datos se puedan ingresar por
medio de un teclado matricial, el algoritmo empieza
Objetivos Especficos cuando el usuario ingresa el primer nmero, luego
ingresa la operacin que desea realizar y por ltimo
Realizar un algoritmo en lenguaje C, donde puede digitar el segundo nmero, cada nmero se
se puedan utilizar herramientas como visualiza en la LCD despus de ser digitado y
teclado matricial, LCD y microcontrolador finalmente se observa la operacin con su respectivo
para observar el funcionamiento de una resultado. Inicialmente se elabor el cdigo fuente
calculadora para poder compilarlo exitosamente en PIC C,
p o s t er i o r m e n t e s e r e a l i z l a s i m u l a c i n
Utilizar los programas PIC C y PROTEUS correspondiente en el programa PROTEUS, y
para compilar y realizar la simulacin del despus de observar su funcionamiento se procede a
proyecto. quemar el microcontrolador con el archivo .hex
Elaborar el circuito en una protoboard donde generado por PIC C para realizar el montaje
adecuado en la protoboard.
sea posible evidenciar las operaciones
bsicas de la calculadora satisfactoriamente.
A. Cdigo
II. INTRODUCCIN

En esta prctica de laboratorio se desarroll En la figura 1 se puede observar el


un proyecto en lenguaje C, el programa se procedimiento utilizado en el cdigo mediante un
fundamenta en una serie de instrucciones que diagrama de flujo, principalmente es necesario
ocasionan que el microcontrolador realice una terea incluir la librera del PIC18F4550 para contar con
particular, en este caso se utilizaron los programas todos sus recursos durante la ejecucin del programa,
PIC C y Proteus para el diseo y construccin del la inclusin de los fuses se hace para que el watchdog
proyecto. El cdigo fuente est compuesto por una este desactivado y el oscilador este dado por un
sucesin de lneas de texto que se van a encargar de cristal de cuarzo de 4 MHz, el puerto para usar la lcd
dar la instruccin al microcontrolador, en esta ser el puerto d y se incluye la librera lcd.c para
oportunidad se realiz un algoritmo capaz de originar contar con todos los recursos de la pantalla lcd, se
una calculadora que realiza operaciones como suma, define el puerto b para el uso del teclado matricial y
resta, multiplicacin y divisin, las herramientas
utilizadas para el funcionamiento correcto de la
calculadora fueron un PIC18F4550, un teclado
matricial y una pantalla LCD.
tambin es necesario incluir la librera kbd_lib. c, reset_cpu ( ), cuando el cdigo ya sabe que operacin
esta es una librera para teclado 4*4. realizar el usuario puede ingresar el nmero 2 que se
adquiere de la misma manera que el nmero 1, al
Las variables char se refieren a que estas van presionar la tecla = en la pantalla lcd se podr
a ser de tipo caracter y las tipo float se usan para visualizar el resultado de la operacin.
manejar nmero enteros, nmeros decimales y
variables signed es decir que incluyan el signo del B. Simulacin
nmero, entonces k es la variables donde se va a
guardar el valor que el usuario ingrese y las variables
como num1, cont, cont1, x, y, num2 y res son La simulacin es realizada en el programa
variables que sern utilizadas como operandos, Proteus, se utiliza el PIC18F4550, es necesario tener
contadores y el resultado de las operaciones. como base el Datasheet del microcontrolador
correspondiente para poder identificar las
El cdigo ejecuta primero el void main que conexiones del PIC, se conecta a Vcc a travs de
es la funcin principal de programa, en esta funcin MCLR, la pantalla LCD es conectada al puerto D y
se inicializan el teclado matricial y la lcd, se activan el teclado matricial se conecta al puerto B, para
las resistencias de pullups del puerto b, estas observar el funcionamiento se importa desde el PIC
resistencias sern resistencias de polarizacin cuyo del circuito el archivo .hex, este archivo es el que
genera PIC C luego de haber compilado el cdigo,
fin es proporcionar baja impedancia de salida sin
usar un gran consumo de energa, se usan finalmente es necesario configurar la frecuencia con
instrucciones como lcd_gotoxy( ) que le indica a la la que va a trabajar el cristal de cuarzo, en la figura 2
pantalla en que posicin tiene que imprimir, se usa se observa el resultado de la simulacin.
printf( lcd_putc, ) para mostrar el pantalla lo que
se desea que el usuario pueda ver y el delay_ms( ) es
usado para generar un retardo.

Las variables num1 y cont se inicializan en


0, se pide al usuario que ingrese el nmero 1 y se crea
un ciclo do- while, mientras el carcter adquirido sea
diferente de cualquier smbolo el cdigo va a guardar
en k el digito ingresado por el usuario, se realiza una
conversin de la variable k a ASCII restndole 48,
esta conversin se guarda en la variable x, luego se

genera una instruccin para que num1 sea


igual a (num1*cont*10)+x, esta instruccin va a Fig.2 Simulacin del proyecto de Proteus
indicar cuales son las centenas, decenas, unidades,
etc. del nmero ingresado por el usuario, cuando se
muestra en pantalla num1, el usuario vuelve a
ingresar otro nmero y se realiza el mismo C. Montaje
procedimiento hasta que el usuario presione una tecla
que contenga algn smbolo, bsicamente esto quiere Para realizar el montaje se utilizan
decir que la calculadora puede operar nmeros de materiales como un PIC18F4550, un cristal de
ms de un digito. cuarzo de 4 MHz, un teclado matricial 4*4, una
pantalla LCD 16x2, un potencimetro, resistencia de
1 K y cables. Inicialmente se quema el PIC
Cuando se presiona un caracter diferente a mediante el programa MPLAB con ayuda del
un nmero, la pantalla le pedir al usuario que PICSTART plus, en la configuracin de bits se
ingrese la operacin que desea hacer y en la funcin modifica el uso del cristal y se desactiva el watch dog
void oper se indicar que si el signo es + se vaya a y el LVP luego de se procede a realizar las
void suma, si es -a void resta, si es X void conexiones del PIC de acuerdo al datasheet.
multi, si es / void divi, se cre una funcin para Finalmente en las figuras 3, 4, 5 y 6 se puede
que al presionar ON dado por la tecla * del observar el correcto funcionamiento del proyecto.
teclado el cdigo vuelva a empezar desde el main,
esto se hizo por medio de un ciclo infinito con la
instruccin
Fig.1 Diagrama de flujo del funcionamiento de la calculadora
Fig.3 Montaje y funcionamiento de la calculadora

II. CONCLUSIONES
[1] LCD Module, Xiamen Amotec, Disponible en:
A partir del programa elaborado fue posible [https://www.sparkfun.com/datasheets/LCD/ADM1602K-
NSW-FBS-3.3v.pdf]
visualizar una calculadora de operaciones bsicas
capaz de reconocer nmeros negativos, generar
nmeros decimales y adquirir nmeros de ms de un
digito, lo ms importante fue tener los conceptos
muy claros respecto al lenguaje c, las conexiones del
teclado matricial y la LCD al microcontrolador, la
manipulacin de PIC C y el simulador Proteus. Para
el cdigo elaborado se utilizaron instrucciones
bsicas que se encargaban de adquirir y guardar
nmeros y caracteres en una variable para
posteriormente escoger una operacin y adquirir el
siguiente nmero que se desea operar y finalmente
observar los resultados de las operaciones en la LCD.
Tal vez el mayor inconveniente fue lograr adquirir
nmeros de ms de un digito y reconocer si el signo
del nmero era positivo o negativo, pero esto se
solucion por medio de un ciclo do-while y un bucle
infinito al momento de adquirir el nmero para
reconocer si el nmero ingresado era positivo o
negativo, pero esto genero un cdigo demasiado
extenso. Finalmente se obtuvo satisfactoriamente el
programa deseado, es decir una calculadora que
puede realizar operaciones bsicas y cumplir
prcticamente todas las funciones de las que se
encarga una calculadora normal.

REFERENCIAS
[1] DataSheet 28/40/44-Pin Enhanced Flash Microcontrollers,
(PIC18F4550), Microchip, Disponible en:
[http://ww1.microchip.com/downloads/en/devicedoc/39582b.pd
f]
[2] Teclado matricial, Galia Microcontroladores, Disponible
en:
[http://galia.fc.uaslp.mx/~cantocar/microcontroladores/SLIDES
_8051_PDF/20_MATRI.PDF]
CDIGO EN PIC C while(TRUE)//ciclo infinito
#include <18f4550.h> //se nombra libreria {num2=0;//vaciar variables
del pic18f4550 para contar con todos sus recursos
cont1=0;//vaciar variables
#fuses NOWDT,NOPROTECT,XT //no perro
do//ciclo que adquiere el nmero ciclicamente siempr y
guardian, no preoteccion,cristal
cuando no se presiones ningn smbolo
#use delay(clock=4000000) //se utiliza un reloj
de 40 mhz {

#define lcd_data_port getenv("sfr:portd") //se define el k=kbd_getc;


puerto d para usar el lcd }while(k==0);
#include <lcd.c> //se nombra libreria del
lcd para contar con todos sus recursos while((k!='*')&&(k!='X')&&(k!='/')&&(k!='=')&&(k!='-
')&&(k!='+'))
#include <kbd_lib.c> //se nombra libreria
del keypad 4x4 para contar con todos sus recursos {
#use standard_io(b) //se puede modificar el
registro tris en y=k-48;// conversion numerica
num2=(num2*cont1*10)+y;
#use standard_io(d) //cualquier momento
mediante la directiva "standard" lcd_putc("\f");

printf(lcd_putc,"%f",num2);
char k; //variable k tipo char
delay_ms(100);
float num1,cont,cont1, x,num2,y, sig, res; //variables
tipo flotante k=0;
do{
void limpiar //funcin de reset
k=kbd_getc; //Obtener variable y guardar en k
{while(true) { //bucle infinito
}while(k==0);
k=kbd_getc; //Obtener variable y guardar
en k cont1=1;}

num2=k-48; //conversin ASCII de k y num2=num2*(-1);


guardar en num2
printf(lcd_putc,"%f",num2);
if(k!=0) //se presiono una tecla
res=num1+(num2);
{ if(k=='*') //si es igual a k=*
delay_ms(100);
reset_cpu; //instruccin que borra la
memoria del PIC lcd_gotoxy(1,1); //Se le indica a la lcd donde se va a
comenzar a escribir (columna y fila)
} }}
printf(lcd_putc, "\f Su resultado es");

void suma //Operacin suma lcd_gotoxy(1,2);


{lcd_gotoxy(1,1); //Se le indica a la lcd donde se va a printf(lcd_putc,"%f+%f=%f",num1,num2,res);
comenzar a escribir (columna y fila)
delay_ms(100);
printf(lcd_putc, "\f Ingrese num 2"); //Se pide al
usuario que ingrese el segundo nmero limpiar ;

while(TRUE) //ciclo infinito }

{k=kbd_getc; //Obtener variable y guardar en k


}
sig=k-48; //se obtiene el dato de la tecla pulsada y se
guarda en la varible k } else if(k=='+')//si k el nmero ingresado es positivo
if(k!=0)//se presiono una tecla {while(TRUE)//ciclo infinito

{if(k=='-')//si k el nmero ingresado es {num2=0;//vaciar variables


negativo { cont1=0;//vaciar variables

do//ciclo que adquiere el nmero ciclicamente siempr y


cuando no se presiones ningn smbolo
{ k=kbd_getc;//Obtener variable y guardar en k while(TRUE)//ciclo infinito
}while(k==0); {num2=0;//vaciar variables

while((k!='*')&&(k!='X')&&(k!='/')&&(k!='=')&&(k!='- cont1=0;//vaciar variables


')&&(k!='+')) do//ciclo que adquiere el nmero ciclicamente siempr y
cuando no se presiones ningn smbolo
{y=k-48;// conversion numerica
{
num2=(num2*cont1*10)+y;
k=kbd_getc;//Obtener variable y guardar en k
lcd_putc("\f");
}while(k==0);
printf(lcd_putc,"%f",num2);

delay_ms(100); while((k!='*')&&(k!='X')&&(k!='/')&&(k!='=')&&(k!='-
')&&(k!='+'))
k=0;
{
do{
y=k-48;// conversion numerica
k=kbd_getc;//Obtener variable y guardar en k
num2=(num2*cont1*10)+y;
}while(k==0);
lcd_putc("\f");
cont1=1;
res=num1+(num2); printf(lcd_putc,"%f",num2);
delay_ms(100);
delay_ms(100);
lcd_gotoxy(1,1); //Se le indica a la lcd donde se va a k=0;
comenzar a escribir (columna y fila) do{
printf(lcd_putc, "\f Su resultado es");
k=kbd_getc;//Obtener variable y guardar en k
lcd_gotoxy(1,2); }while(k==0);

printf(lcd_putc,"%f+%f=%f",num1,num2,res); cont1=1;}

delay_ms(100); num2=num2*(-1);
limpiar ; } printf(lcd_putc,"%f",num2);
res=num1-(num2);
} } delay_ms(100);
else
lcd_gotoxy(1,1); //Se le indica a la lcd donde se va a
printf(lcd_putc,"error");} } } comenzar a escribir (columna y fila)
printf(lcd_putc, "\f Su resultado es");

lcd_gotoxy(1,2); printf(lcd_putc,"%f-
void resta//Operacin resta
%f=%f",num1,num2,res); delay_ms(100);
{lcd_gotoxy(1,1); //Se le indica a la lcd donde se va a
comenzar a escribir (columna y fila) limpiar ;

printf(lcd_putc, "\f Ingrese num 2"); }


while(TRUE)//ciclo infinito
}
{k=kbd_getc;//Obtener variable y guardar en k
sig=k-48; //se obtiene el dato de la tecla pulsada y se else if(k=='+')//si k el nmero ingresado es positivo
guarda en la varible k } {while(TRUE)//ciclo infinito
if(k!=0)//se presiono una tecla
{num2=0;//vaciar variables
{if(k=='-')//si k el nmero ingresado es cont1=0;//vaciar variables
negativo { do//ciclo que adquiere el nmero ciclicamente siempr y
cuando no se presiones ningn smbolo
{ k=kbd_getc;//Obtener variable y guardar en k do//ciclo que adquiere el nmero ciclicamente siempr y
cuando no se presiones ningn smbolo
}while(k==0);
{
while((k!='*')&&(k!='X')&&(k!='/')&&(k!='=')&&(k!='-
')&&(k!='+')) k=kbd_getc;//Obtener variable y guardar en k
}while(k==0);
{y=k-48;// conversion numerica
num2=(num2*cont1*10)+y; while((k!='*')&&(k!='X')&&(k!='/')&&(k!='=')&&(k!='-
')&&(k!='+'))
lcd_putc("\f");
{
printf(lcd_putc,"%f",num2);
y=k-48;// conversion numerica
delay_ms(100);
num2=(num2*cont1*10)+y;
k=0;
lcd_putc("\f");
do{
printf(lcd_putc,"%f",num2);
k=kbd_getc;//Obtener variable y guardar en k
delay_ms(100);
}while(k==0);
k=0;
cont1=1;
do{
res=num1-(num2);

delay_ms(100); k=kbd_getc;//Obtener variable y guardar en k


}while(k==0);
lcd_gotoxy(1,1); //Se le indica a la lcd donde se va a
comenzar a escribir (columna y fila) cont1=1;}
printf(lcd_putc, "\f Su resultado es"); num2=num2*(-1);

lcd_gotoxy(1,2); printf(lcd_putc,"%f- printf(lcd_putc,"%f",num2);

%f=%f",num1,num2,res); delay_ms(100); res=num1*(num2);

limpiar ; } delay_ms(100);

lcd_gotoxy(1,1); //Se le indica a la lcd donde se va a


comenzar a escribir (columna y fila)
} }
printf(lcd_putc, "\f Su resultado es");
else

printf(lcd_putc,"error");} } } lcd_gotoxy(1,2);
printf(lcd_putc,"%f*%f=%f",num1,num2,res);
delay_ms(100);
void multi//Operacin multiplicacin
limpiar ;
{lcd_gotoxy(1,1); //Se le indica a la lcd donde se va a
comenzar a escribir (columna y fila) }

printf(lcd_putc, "\f Ingrese num 2"); }


while(TRUE)//ciclo infinito
else if(k=='+')//si k el nmero ingresado es positivo
{k=kbd_getc;//Obtener variable y guardar en k
{while(TRUE)//ciclo infinito
sig=k-48; //se obtiene el dato de la tecla pulsada y se
guarda en la varible k } {num2=0;//vaciar variables
if(k!=0)//se presiono una tecla cont1=0;//vaciar variables

do//ciclo que adquiere el nmero ciclicamente siempr y


{if(k=='-')//si k el nmero ingresado es
cuando no se presiones ningn smbolo
negativo {

while(TRUE)//ciclo infinito
{num2=0;//vaciar variables
cont1=0;//vaciar variables
{ k=kbd_getc;//Obtener variable y guardar en k {

}while(k==0); k=kbd_getc;//Obtener variable y guardar en k


}while(k==0);
while((k!='*')&&(k!='X')&&(k!='/')&&(k!='=')&&(k!='-
')&&(k!='+'))
while((k!='*')&&(k!='X')&&(k!='/')&&(k!='=')&&(k!='-
{y=k-48;// conversion numerica ')&&(k!='+'))

num2=(num2*cont1*10)+y; {

lcd_putc("\f"); y=k-48;// conversion numerica


printf(lcd_putc,"%f",num2); num2=(num2*cont1*10)+y;
lcd_putc("\f");
delay_ms(100);
k=0; printf(lcd_putc,"%f",num2);
do{ delay_ms(100);

k=kbd_getc;//Obtener variable y guardar en k k=0;


}while(k==0); do{

cont1=1; k=kbd_getc;//Obtener variable y guardar en k


res=num1*(num2); }while(k==0);
delay_ms(100); cont1=1;}
lcd_gotoxy(1,1); //Se le indica a la lcd donde se va a num2=num2*(-1);
comenzar a escribir (columna y fila)
printf(lcd_putc,"%f",num2);
printf(lcd_putc, "\f Su resultado es");
res=num1/(num2);
lcd_gotoxy(1,2); delay_ms(100);
printf(lcd_putc,"%f*%f=%f",num1,num2,res);
lcd_gotoxy(1,1); //Se le indica a la lcd donde se va a
delay_ms(100); comenzar a escribir (columna y fila)

limpiar ; } printf(lcd_putc, "\f Su resultado es");

lcd_gotoxy(1,2);
} } printf(lcd_putc,"%f/%f=%f",num1,num2,res);
else delay_ms(100);
printf(lcd_putc,"error");} } } limpiar ;

}
void divi//Operacin divisin

{lcd_gotoxy(1,1); //Se le indica a la lcd donde se va a }


comenzar a escribir (columna y fila)
else if(k=='+')//si k el nmero ingresado es positivo
printf(lcd_putc, "\f Ingrese num 2");
{while(TRUE)//ciclo infinito
while(TRUE)//ciclo infinito

{k=kbd_getc;//Obtener variable y guardar en k {num2=0;//vaciar variables


cont1=0;//vaciar variables
sig=k-48; //se obtiene el dato de la tecla pulsada y se
guarda en la varible k } do//ciclo que adquiere el nmero ciclicamente siempr y
cuando no se presiones ningn smbolo
if(k!=0)//se presiono una tecla
{ k=kbd_getc;//Obtener variable y guardar en k
{if(k=='-')//si k el nmero ingresado es
negativo {
while(TRUE)//ciclo infinito {num2=0;//vaciar variables
cont1=0;//vaciar variables

do//ciclo que adquiere el nmero ciclicamente siempr y


cuando no se presiones ningn smbolo
}while(k==0); {lcd_putc("\f");

while((k!='*')&&(k!='X')&&(k!='/')&&(k!='=')&&(k!='- multi; }
')&&(k!='+'))
else if(k=='*')
{y=k-48;// conversion numerica {lcd_putc("\f");
num2=(num2*cont1*10)+y;
limpiar ;}
lcd_putc("\f");
else
printf(lcd_putc,"%f",num2);

delay_ms(100); lcd_putc("\f");
k=0; divi;} } }

do{

k=kbd_getc;//Obtener variable y guardar en k


}while(k==0); void main()
cont1=1; { lcd_init; //se inicializa lcd
res=num1/(num2); kbd_init; //se inicializa keypad
delay_ms(100); else if(k=='X')
port_b_pullups (true); //se activan resistencias pullups

de puerto b
lcd_gotoxy(1,1); //Se le indica a la lcd donde se va a
comenzar a escribir (columna y fila) lcd_gotoxy(1,1);
printf(lcd_putc, "\f Su resultado es"); printf(lcd_putc,"calculadora");

lcd_gotoxy(1,2); delay_ms(500);

printf(lcd_putc,"%f/%f=%f",num1,num2,res); lcd_gotoxy(1,1);

delay_ms(100); printf(lcd_putc,"\f Ingrese num 1");

limpiar ; } while(TRUE)//ciclo infinito

{k=kbd_getc;//Obtener variable y guardar en k

} sig=k-48; //se obtiene el dato de la tecla pulsada y se


guarda en la varible k }
}
if(k!=0)//se presiono una tecla
else
{if(k=='-')//si k el nmero ingresado es negativo
printf(lcd_putc,"error");} } }
{

while(TRUE)//ciclo infinito
void oper()
{num1=0;//vaciar variables
{lcd_gotoxy(1,1); //Se le indica a la lcd donde se va a
comenzar a escribir (columna y fila) cont=0;//vaciar variables
printf(lcd_putc, "\fOperacion"); do//ciclo que adquiere el nmero ciclicamente siempr y
cuando no se presiones ningn smbolo
while(true)//ciclo infinito
{
{ k=kbd_getc;//Obtener variable y guardar en k
k=kbd_getc;//Obtener variable y guardar en k
if(k!=0)//se presiono una tecla
}while(k==0);
{ if(k=='+')
{ lcd_putc("\f"); while((k!='*')&&(k!='X')&&(k!='/')&&(k!='=')&&(k!='-
')&&(k!='+'))
suma; }
{
else if(k=='-')
x=k-48;// conversion numerica
{lcd_putc("\f");
num1=(num1*cont*10)+x;
resta; }
lcd_putc("\f"); { k=kbd_getc;//Obtener variable y guardar en k
printf(lcd_putc,"%f",num1); }while(k==0);
delay_ms(100);
while((k!='*')&&(k!='X')&&(k!='/')&&(k!='=')&&(k!='-
k=0; ')&&(k!='+'))

do{ {x=k-48;// conversion numerica


k=kbd_getc;//Obtener variable y guardar en k num1=(num1*cont*10)+x;
}while(k==0); lcd_putc("\f");
cont=1;} printf(lcd_putc,"%f",num1);
num1=num1*(-1); delay_ms(100);

printf(lcd_putc,"%f",num1); k=0;

oper;} do{

} k=kbd_getc;//Obtener variable y guardar en k


}while(k==0);
else if(k=='+')//si k el nmero ingresado es positivo
{while(TRUE)//ciclo infinito cont=1; }
{num1=0; oper;} }
cont=0; else
do//ciclo que adquiere el nmero ciclicamente siempr y printf(lcd_putc,"error");} } }
cuando no se presiones ningn smbolo

You might also like