Sei sulla pagina 1di 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, an LCD display and a keypad matrix was used. Microcontroller programming was done in C language from program PIC C.

calculadora fueron un PIC18F4550, un teclado matricial y una pantalla LCD. En la pantalla LCD es posible visualizar las instrucciones para el usuario y el resultado de las operaciones, y por medio del teclado matricial el usuario ingresa los valores que desea operar y la operacin que desea realizar. I. PROCEDIMIENTO

I. Objetivo General

OBJETIVOS

Elaborar una calculadora de operaciones bsicas mediante la programacin del PIC18F4550.

Objetivos Especficos Realizar un algoritmo en lenguaje C, donde se puedan utilizar herramientas como teclado matricial, LCD y microcontrolador para observar el funcionamiento de una calculadora Utilizar los programas PIC C y PROTEUS para compilar y realizar la simulacin del proyecto. Elaborar el circuito en una protoboard donde sea posible evidenciar las operaciones bsicas de la calculadora satisfactoriamente. II. INTRODUCCIN

Como ya se ha mencionado el fin de este proyecto es crear una calculadora que realice operaciones bsicas que se puedan visualizar en una pantalla LCD y los datos se puedan ingresar por medio de un teclado matricial, el algoritmo empieza cuando el usuario ingresa el primer nmero, luego ingresa la operacin que desea realizar y por ltimo puede digitar el segundo nmero, cada nmero se visualiza en la LCD despus de ser digitado y finalmente se observa la operacin con su respectivo resultado. Inicialmente se elabor el cdigo fuente para poder compilarlo exitosamente en PIC C, posteriormente se realiz la simulacin correspondiente en el programa PROTEUS, y despus de observar su funcionamiento se procede a quemar el microcontrolador con el archivo .hex generado por PIC C para realizar el montaje adecuado en la protoboard. A. Cdigo En la figura 1 se puede observar el procedimiento utilizado en el cdigo mediante un diagrama de flujo, principalmente es necesario incluir la librera del PIC18F4550 para contar con todos sus recursos durante la ejecucin del programa, la inclusin de los fuses se hace para que el watchdog este desactivado y el oscilador este dado por un cristal de cuarzo de 4 MHz, el puerto para usar la lcd ser el puerto d y se incluye la librera lcd.c para contar con todos los recursos de la pantalla lcd, se define el puerto b para el uso del teclado matricial y

En esta prctica de laboratorio se desarroll un proyecto en lenguaje C, el programa se fundamenta en una serie de instrucciones que ocasionan que el microcontrolador realice una terea particular, en este caso se utilizaron los programas PIC C y Proteus para el diseo y construccin del proyecto. El cdigo fuente est compuesto por una sucesin de lneas de texto que se van a encargar de dar la instruccin al microcontrolador, en esta oportunidad se realiz un algoritmo capaz de originar una calculadora que realiza operaciones como suma, resta, multiplicacin y divisin, las herramientas utilizadas para el funcionamiento correcto de la

tambin es necesario incluir la librera kbd_lib. c, esta es una librera para teclado 4*4. Las variables char se refieren a que estas van a ser de tipo caracter y las tipo float se usan para manejar nmero enteros, nmeros decimales y variables signed es decir que incluyan el signo del 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 variables que sern utilizadas como operandos, contadores y el resultado de las operaciones. El cdigo ejecuta primero el void main que es la funcin principal de programa, en esta funcin se inicializan el teclado matricial y la lcd, se activan las resistencias de pullups del puerto b, estas resistencias sern resistencias de polarizacin cuyo fin es proporcionar baja impedancia de salida sin usar un gran consumo de energa, se usan instrucciones como lcd_gotoxy( ) que le indica a la 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 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 procedimiento hasta que el usuario presione una tecla que contenga algn smbolo, bsicamente esto quiere decir que la calculadora puede operar nmeros de ms de un digito. Cuando se presiona un caracter diferente a un nmero, la pantalla le pedir al usuario que ingrese la operacin que desea hacer y en la funcin void oper se indicar que si el signo es + se vaya a void suma, si es -a void resta, si es X void multi, si es / void divi, se cre una funcin para que al presionar ON dado por la tecla * del teclado el cdigo vuelva a empezar desde el main, esto se hizo por medio de un ciclo infinito con la instruccin

reset_cpu ( ), cuando el cdigo ya sabe que operacin realizar el usuario puede ingresar el nmero 2 que se adquiere de la misma manera que el nmero 1, al presionar la tecla = en la pantalla lcd se podr visualizar el resultado de la operacin. B. Simulacin La simulacin es realizada en el programa Proteus, se utiliza el PIC18F4550, es necesario tener como base el Datasheet del microcontrolador correspondiente para poder identificar las conexiones del PIC, se conecta a Vcc a travs de MCLR, la pantalla LCD es conectada al puerto D y el teclado matricial se conecta al puerto B, para observar el funcionamiento se importa desde el PIC del circuito el archivo .hex, este archivo es el que genera PIC C luego de haber compilado el cdigo, finalmente es necesario configurar la frecuencia con la que va a trabajar el cristal de cuarzo, en la figura 2 se observa el resultado de la simulacin.

Fig.2 Simulacin del proyecto de Proteus

C. Montaje Para realizar el montaje se utilizan materiales como un PIC18F4550, un cristal de 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 mediante el programa MPLAB con ayuda del PICSTART plus, en la configuracin de bits se modifica el uso del cristal y se desactiva el watch dog y el LVP luego de se procede a realizar las conexiones del PIC de acuerdo al datasheet. Finalmente en las figuras 3, 4, 5 y 6 se puede observar el correcto funcionamiento del proyecto.

Fig.1 Diagrama de flujo del funcionamiento de la calculadora

Fig.3 Montaje y funcionamiento de la calculadora

II.

CONCLUSIONES

A partir del programa elaborado fue posible 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]

[3] LCD Module, Xiamen Amotec, Disponible en: [https://www.sparkfun.com/datasheets/LCD/ADM1602KNSW-FBS-3.3v.pdf]

CDIGO EN PIC C
#include <18f4550.h> //se nombra libreria del pic18f4550 para contar con todos sus recursos #fuses NOWDT,NOPROTECT,XT guardian, no preoteccion,cristal #use delay(clock=4000000) de 40 mhz #define lcd_data_port getenv("sfr:portd") //se define el puerto d para usar el lcd #include <lcd.c> lcd para contar con todos sus recursos //se nombra libreria del //no perro

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 { k=kbd_getc(); }while(k==0);

//se utiliza un reloj

#include <kbd_lib.c> //se nombra libreria del keypad 4x4 para contar con todos sus recursos #use standard_io(b) registro tris en #use standard_io(d) mediante la directiva "standard" //se puede modificar el

while((k!='*')&&(k!='X')&&(k!='/')&&(k!='=')&&(k!='')&&(k!='+')) { y=k-48;// conversion numerica num2=(num2*cont1*10)+y;

//cualquier momento lcd_putc("\f"); printf(lcd_putc,"%f",num2);

char k;

//variable k tipo char //variables

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

float num1,cont,cont1, x,num2,y, sig, res; tipo flotante

void limpiar () {while(true) { k=kbd_getc(); en k num2=k-48; guardar en num2 if(k!=0) { if(k=='*') reset_cpu(); memoria del PIC } }}

//funcin de reset }while(k==0); //bucle infinito cont1=1;} //Obtener variable y guardar num2=num2*(-1); //conversin ASCII de k y printf(lcd_putc,"%f",num2); res=num1+(num2); //se presiono una tecla //si es igual a k=* //instruccin que borra la 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"); lcd_gotoxy(1,2); printf(lcd_putc,"%f+%f=%f",num1,num2,res);

void suma()

//Operacin suma

delay_ms(100); 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"); usuario que ingrese el segundo nmero while(TRUE) //ciclo infinito //Se pide al

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

{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 {if(k=='-')//si k el nmero ingresado es negativo {

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

while(TRUE)//ciclo infinito {num2=0;//vaciar variables cont1=0;//vaciar variables

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

do//ciclo que adquiere el nmero ciclicamente siempr y cuando no se presiones ningn smbolo {

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); 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) printf(lcd_putc, "\f Su resultado es"); lcd_gotoxy(1,2); printf(lcd_putc,"%f+%f=%f",num1,num2,res); delay_ms(100); limpiar (); } do{ k=kbd_getc();//Obtener variable y guardar en k }while(k==0); cont1=1;} num2=num2*(-1); printf(lcd_putc,"%f",num2); res=num1-(num2); } } 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 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 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 } else if(k=='+')//si k el nmero ingresado es positivo {while(TRUE)//ciclo infinito {num2=0;//vaciar variables } delay_ms(100); lcd_gotoxy(1,1); //Se le indica a la lcd donde se va a comenzar a escribir (columna y fila) while((k!='*')&&(k!='X')&&(k!='/')&&(k!='=')&&(k!='')&&(k!='+'))

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

while(TRUE)//ciclo infinito {num2=0;//vaciar variables cont1=0;//vaciar variables

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

do//ciclo que adquiere el nmero ciclicamente siempr y cuando no se presiones ningn smbolo {

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); 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) printf(lcd_putc, "\f Su resultado es"); lcd_gotoxy(1,2); printf(lcd_putc,"%f-%f=%f",num1,num2,res); delay_ms(100); limpiar (); } do{ k=kbd_getc();//Obtener variable y guardar en k }while(k==0); cont1=1;} num2=num2*(-1); printf(lcd_putc,"%f",num2); res=num1*(num2); } } 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 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 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 } else if(k=='+')//si k el nmero ingresado es positivo {while(TRUE)//ciclo infinito {num2=0;//vaciar variables } delay_ms(100); lcd_gotoxy(1,1); //Se le indica a la lcd donde se va a comenzar a escribir (columna y fila) while((k!='*')&&(k!='X')&&(k!='/')&&(k!='=')&&(k!='')&&(k!='+'))

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

{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!='*')&&(k!='X')&&(k!='/')&&(k!='=')&&(k!='')&&(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); 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) printf(lcd_putc, "\f Su resultado es"); lcd_gotoxy(1,2); printf(lcd_putc,"%f*%f=%f",num1,num2,res); delay_ms(100); limpiar (); } k=kbd_getc();//Obtener variable y guardar en k }while(k==0); cont1=1;} num2=num2*(-1); printf(lcd_putc,"%f",num2); res=num1/(num2); delay_ms(100); } } 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 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 cont1=0;//vaciar variables {if(k=='-')//si k el nmero ingresado es negativo { while(TRUE)//ciclo infinito do//ciclo que adquiere el nmero ciclicamente siempr y cuando no se presiones ningn smbolo { k=kbd_getc();//Obtener variable y guardar en k } else if(k=='+')//si k el nmero ingresado es positivo {while(TRUE)//ciclo infinito {num2=0;//vaciar variables } lcd_gotoxy(1,1); //Se le indica a la lcd donde se va a comenzar a escribir (columna y fila) while((k!='*')&&(k!='X')&&(k!='/')&&(k!='=')&&(k!='')&&(k!='+'))

}while(k==0);

else if(k=='X') {lcd_putc("\f");

while((k!='*')&&(k!='X')&&(k!='/')&&(k!='=')&&(k!='')&&(k!='+')) {y=k-48;// conversion numerica num2=(num2*cont1*10)+y; lcd_putc("\f"); printf(lcd_putc,"%f",num2); delay_ms(100); k=0; do{ k=kbd_getc();//Obtener variable y guardar en k }while(k==0); cont1=1; res=num1/(num2); delay_ms(100); de puerto b 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"); lcd_gotoxy(1,2); printf(lcd_putc,"%f/%f=%f",num1,num2,res); delay_ms(100); limpiar (); }

multi(); } else if(k=='*') {lcd_putc("\f"); limpiar ();} else lcd_putc("\f"); divi();} } }

void main() { lcd_init(); kbd_init(); //se inicializa lcd //se inicializa keypad

port_b_pullups (true); //se activan resistencias pullups

lcd_gotoxy(1,1); printf(lcd_putc,"calculadora"); delay_ms(500); lcd_gotoxy(1,1); printf(lcd_putc,"\f Ingrese num 1"); 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) printf(lcd_putc, "\fOperacion"); 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"); suma(); } { else if(k=='-') x=k-48;// conversion numerica {lcd_putc("\f"); num1=(num1*cont*10)+x; resta(); } while((k!='*')&&(k!='X')&&(k!='/')&&(k!='=')&&(k!='')&&(k!='+')) cont=0;//vaciar variables do//ciclo que adquiere el nmero ciclicamente siempr y cuando no se presiones ningn smbolo

lcd_putc("\f"); printf(lcd_putc,"%f",num1); delay_ms(100); k=0; do{ k=kbd_getc();//Obtener variable y guardar en k }while(k==0); cont=1;} num1=num1*(-1); printf(lcd_putc,"%f",num1); oper();} } else if(k=='+')//si k el nmero ingresado es positivo {while(TRUE)//ciclo infinito {num1=0; cont=0; 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(k==0);

while((k!='*')&&(k!='X')&&(k!='/')&&(k!='=')&&(k!='')&&(k!='+')) {x=k-48;// conversion numerica num1=(num1*cont*10)+x; lcd_putc("\f"); printf(lcd_putc,"%f",num1); delay_ms(100); k=0; do{ k=kbd_getc();//Obtener variable y guardar en k }while(k==0); cont=1; } oper();} } else printf(lcd_putc,"error");} } }

Potrebbero piacerti anche