Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
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
printf(lcd_putc,"%f",num2);
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 ();
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{
lcd_gotoxy(1,2); }while(k==0);
printf(lcd_putc,"%f+%f=%f",num1,num2,res); cont1=1;}
delay_ms(100); num2=num2*(-1);
res=num1-(num2);
} delay_ms(100);
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) }
while(TRUE)//ciclo infinito }
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{
lcd_gotoxy(1,2); }while(k==0);
printf(lcd_putc,"%f-%f=%f",num1,num2,res); cont1=1;}
delay_ms(100); num2=num2*(-1);
res=num1*(num2);
} delay_ms(100);
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) }
while(TRUE)//ciclo infinito }
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
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);
delay_ms(100);
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) }
while(TRUE)//ciclo infinito }
{lcd_putc("\f");
while((k!='*')&&(k!='X')&&(k!='/')&&(k!='=')&&(k!='-
')&&(k!='+')) multi(); }
num2=(num2*cont1*10)+y; {lcd_putc("\f");
printf(lcd_putc,"%f",num2); else
delay_ms(100); lcd_putc("\f");
k=0; divi();} } }
do{
lcd_gotoxy(1,2); delay_ms(500);
printf(lcd_putc,"%f/%f=%f",num1,num2,res); lcd_gotoxy(1,1);
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
{ 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
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