Está en la página 1de 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 calculadora fueron un PIC18F4550, un teclado
with basic functions, where a PIC18F4550 microcontroller, matricial y una pantalla LCD.
an LCD display and a keypad matrix was used.
Microcontroller programming was done in C language from En la pantalla LCD es posible visualizar las
program PIC C.
instrucciones para el usuario y el resultado de las
I. OBJETIVOS operaciones, y por medio del teclado matricial el
usuario ingresa los valores que desea operar y la
Objetivo General operacin que desea realizar.

Elaborar una calculadora de operaciones I. PROCEDIMIENTO


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

En esta prctica de laboratorio se desarroll A. Cdigo


un proyecto en lenguaje C, el programa se
fundamenta en una serie de instrucciones que En la figura 1 se puede observar el
ocasionan que el microcontrolador realice una terea procedimiento utilizado en el cdigo mediante un
particular, en este caso se utilizaron los programas diagrama de flujo, principalmente es necesario
PIC C y Proteus para el diseo y construccin del incluir la librera del PIC18F4550 para contar con
proyecto. El cdigo fuente est compuesto por una todos sus recursos durante la ejecucin del programa,
sucesin de lneas de texto que se van a encargar de la inclusin de los fuses se hace para que el watchdog
dar la instruccin al microcontrolador, en esta este desactivado y el oscilador este dado por un
oportunidad se realiz un algoritmo capaz de originar cristal de cuarzo de 4 MHz, el puerto para usar la lcd
una calculadora que realiza operaciones como suma, ser el puerto d y se incluye la librera lcd.c para
resta, multiplicacin y divisin, las herramientas contar con todos los recursos de la pantalla lcd, se
utilizadas para el funcionamiento correcto de la define el puerto b para el uso del teclado matricial y
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 La simulacin es realizada en el programa
como num1, cont, cont1, x, y, num2 y res son Proteus, se utiliza el PIC18F4550, es necesario tener
variables que sern utilizadas como operandos, como base el Datasheet del microcontrolador
contadores y el resultado de las operaciones. correspondiente para poder identificar las
conexiones del PIC, se conecta a Vcc a travs de
El cdigo ejecuta primero el void main que MCLR, la pantalla LCD es conectada al puerto D y
es la funcin principal de programa, en esta funcin el teclado matricial se conecta al puerto B, para
se inicializan el teclado matricial y la lcd, se activan observar el funcionamiento se importa desde el PIC
las resistencias de pullups del puerto b, estas del circuito el archivo .hex, este archivo es el que
resistencias sern resistencias de polarizacin cuyo genera PIC C luego de haber compilado el cdigo,
fin es proporcionar baja impedancia de salida sin finalmente es necesario configurar la frecuencia con
usar un gran consumo de energa, se usan la que va a trabajar el cristal de cuarzo, en la figura 2
instrucciones como lcd_gotoxy( ) que le indica a la se observa el resultado de la simulacin.
pantalla en que posicin tiene que imprimir, se usa
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 C. Montaje
ingresar otro nmero y se realiza el mismo
procedimiento hasta que el usuario presione una tecla Para realizar el montaje se utilizan
que contenga algn smbolo, bsicamente esto quiere materiales como un PIC18F4550, un cristal de
decir que la calculadora puede operar nmeros de cuarzo de 4 MHz, un teclado matricial 4*4, una
ms de un digito. 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 multi, conexiones del PIC de acuerdo al datasheet.
si es / void divi, se cre una funcin para que al Finalmente en las figuras 3, 4, 5 y 6 se puede
presionar ON dado por la tecla * del teclado el observar el correcto funcionamiento del proyecto.
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
[3] LCD Module, Xiamen Amotec, Disponible en:
[https://www.sparkfun.com/datasheets/LCD/ADM1602K-
A partir del programa elaborado fue posible 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
k=kbd_getc();
#define lcd_data_port getenv("sfr:portd") //se define el
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 y=k-48;// conversion numerica
registro tris en
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 k=0;


tipo flotante
do{

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


void limpiar () //funcin de reset
}while(k==0);
{while(true) { //bucle infinito
cont1=1;}
k=kbd_getc(); //Obtener variable y guardar
en k num2=num2*(-1);

num2=k-48; //conversin ASCII de k y printf(lcd_putc,"%f",num2);


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

printf(lcd_putc,"%f+%f=%f",num1,num2,res);
void suma() //Operacin suma
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"); //Se pide al }


usuario que ingrese el segundo nmero

while(TRUE) //ciclo infinito


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

}while(k==0); {num2=0;//vaciar variables

cont1=0;//vaciar variables
while((k!='*')&&(k!='X')&&(k!='/')&&(k!='=')&&(k!='-
')&&(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;
printf(lcd_putc,"%f",num2);
res=num1+(num2);
delay_ms(100);
delay_ms(100);
k=0;
lcd_gotoxy(1,1); //Se le indica a la lcd donde se va a
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);

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


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

printf(lcd_putc,"%f-%f=%f",num1,num2,res);

delay_ms(100);
void resta()//Operacin resta
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 }

{k=kbd_getc();//Obtener variable y guardar en k else if(k=='+')//si k el nmero ingresado es positivo

sig=k-48; //se obtiene el dato de la tecla pulsada y se {while(TRUE)//ciclo infinito


guarda en la varible k }
{num2=0;//vaciar variables
if(k!=0)//se presiono una tecla
cont1=0;//vaciar variables
{if(k=='-')//si k el nmero ingresado es 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 while(TRUE)//ciclo infinito

}while(k==0); {num2=0;//vaciar variables

cont1=0;//vaciar variables
while((k!='*')&&(k!='X')&&(k!='/')&&(k!='=')&&(k!='-
')&&(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;
printf(lcd_putc,"%f",num2);
res=num1-(num2);
delay_ms(100);
delay_ms(100);
k=0;
lcd_gotoxy(1,1); //Se le indica a la lcd donde se va a
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);

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


comenzar a escribir (columna y fila)
else
printf(lcd_putc, "\f Su resultado es");
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 }

{k=kbd_getc();//Obtener variable y guardar en k else if(k=='+')//si k el nmero ingresado es positivo

sig=k-48; //se obtiene el dato de la tecla pulsada y se {while(TRUE)//ciclo infinito


guarda en la varible k }
{num2=0;//vaciar variables
if(k!=0)//se presiono una tecla
cont1=0;//vaciar variables
{if(k=='-')//si k el nmero ingresado es 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 {num2=0;//vaciar variables

}while(k==0); cont1=0;//vaciar variables

do//ciclo que adquiere el nmero ciclicamente siempr y


while((k!='*')&&(k!='X')&&(k!='/')&&(k!='=')&&(k!='- cuando no se presiones ningn smbolo
')&&(k!='+'))
{
{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");

printf(lcd_putc,"%f",num2); while((k!='*')&&(k!='X')&&(k!='/')&&(k!='=')&&(k!='-
')&&(k!='+'))
delay_ms(100);
{
k=0;
y=k-48;// conversion numerica
do{
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);
cont1=1;
delay_ms(100);
res=num1*(num2);
k=0;
delay_ms(100);
do{
lcd_gotoxy(1,1); //Se le indica a la lcd donde se va a
comenzar a escribir (columna y fila) k=kbd_getc();//Obtener variable y guardar en k

printf(lcd_putc, "\f Su resultado es"); }while(k==0);

lcd_gotoxy(1,2); cont1=1;}

printf(lcd_putc,"%f*%f=%f",num1,num2,res); num2=num2*(-1);

delay_ms(100); printf(lcd_putc,"%f",num2);

limpiar (); } res=num1/(num2);

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
lcd_gotoxy(1,2);
printf(lcd_putc,"error");} } }
printf(lcd_putc,"%f/%f=%f",num1,num2,res);

delay_ms(100);
void divi()//Operacin divisin
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 }

{k=kbd_getc();//Obtener variable y guardar en k else if(k=='+')//si k el nmero ingresado es positivo

sig=k-48; //se obtiene el dato de la tecla pulsada y se {while(TRUE)//ciclo infinito


guarda en la varible k }
{num2=0;//vaciar variables
if(k!=0)//se presiono una tecla
cont1=0;//vaciar variables
{if(k=='-')//si k el nmero ingresado es negativo
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


}while(k==0); else if(k=='X')

{lcd_putc("\f");
while((k!='*')&&(k!='X')&&(k!='/')&&(k!='=')&&(k!='-
')&&(k!='+')) multi(); }

{y=k-48;// conversion numerica else if(k=='*')

num2=(num2*cont1*10)+y; {lcd_putc("\f");

lcd_putc("\f"); limpiar ();}

printf(lcd_putc,"%f",num2); else

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); 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
else if(k=='+')//si k el nmero ingresado es positivo }while(k==0);
{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

También podría gustarte