Você está na página 1de 9

Objetivo: Disear una calculadora por medio del pic 16f877a adems de comprender y usar el lcd y el teclado matricial

los cuales sern utilizados en la misma practica. Introduccin: En el desarrollo de la calculadora se podr observar el uso del teclado matricial el cual sea el medio fsico para meter valores en el microcontrolador, adems de que este igual desplegara los valores introducidos como el resultado en una lcd (pantalla de cristal liquido).

Marco terico: Un teclado matricial es un simple arreglo de botones conectados en filas y colmnas, de modo que se pueden leer varios botones con el mnimo nmero de pines requeridos. Un teclado matricial 44 solamente ocupa 4 lineas de un puerto para las filas y otras 4 lineas para las colmnas, de este modo se pueden leer 16 teclas utilizando solamente 8 lneas de un microcontrolador. Si asumimos que todas las columnas y filas inicialmente estn en alto (1 lgico), la pulsacin de un botn se puede detectar al poner cada fila a en bajo (0 lgico) y checar cada columna en busca de un cero, si ninguna columna est en bajo entonces el 0 de las filas se recorre hacia la siguiente y as secuencialmente. Un modo simple de detectar la tecla presionada es incrementar una variable con la cuenta de las teclas revisadas, de este modo al detectaruna pulsacin el valor de la cuenta ser el valor de la tecla presionada. Si al final no se presion ninguna tecla la variable se pone a cero y la cuenta vuelve a comenzar. El puerto B del microcontrolador 16f628 (as como en el 16f877)viene preparado especialmente para el control de un teclado matricial 44. Para tener siempre un valor de 1 lgico en las colmnas del teclado (parte alta del puerto B del pic) es necesario conectar resistencias de pull-up, sin embargo el puerto B cuenta con resistencias de pull-up integradas, de ese modo es posible trabajar con un teclado matricial sin necesidad de ningn componente externo.

Figura 1.- Funcionamiento del teclado matricial.

Una pantalla de cristal lquido o LCD (sigla del ingls liquid crystal display) es una pantalla delgada y plana formada por un nmero de pxeles en color o monocromos colocados delante de una fuente de luz o reflectora. A menudo se utiliza en dispositivos electrnicos de pilas, ya que utiliza cantidades muy pequeas de energa elctrica.

Figura 2.- LCD

Desarrollo: Para el desarrollo de una calculadora se tuvo que realizar un programa el cual concatenara los nmeros introducidos ya que lo que el microcontrolador detecta del teclado matricial son solo caracteres adems de que solo almacena un carcter lo cual en el caso de una calculadora no sirve porque se introducen ms de 2 nmeros. Para poder realizar esta concatenacin se le asignaba a cada carcter un espacio en un vector asi logrando almacenar todos los caracteres en el pic; pero a un obstante de tener guardados los caracteres todava se tuvo que convertir a numero ya que los caracteres introducidos estn en cdigo ASCII, por lo cual al valor introducido se le restaba 48 ya que el 0 en cdigo ASCII es igual a 48 y as van en incrementos para cada uno de los dems nmeros. En el caso de la concatenacin se realizo un cdigo para que si se introducan 3 numero por ejemplo 123 se realizara una suma de los 3 numero pero multiplicando las unidades por uno, las decenas por 10, las centenas por 100 y as con mltiplos de 10 dependiendo el tamao de la cadena introducido. Igual se tuvo que modificar la librera del kbd debido a que el teclado empleado era diferente al que el programa de CCS tiene precargado.

Codigo:
#include <16f877a.h> #fuses XT,NOWDT,PUT,NOPROTECT,NOLVP #use delay (clock=4000000) #use standard_io(b) #include <lcd.c> #include <kbd2.c> #include <stdlib.h> #include <math.h> void main(){ float32 x[10],x1,s,r[10],x2,sum; int32 y,y1; char k[10],u[10];

char temp, temp1; int i, j,m; lcd_init(); kbd_init(); port_b_pullups(TRUE); printf(lcd_putc,"Bienvenido"); delay_ms(3000); printf(lcd_putc,"\f"); while(true){ i=0; j=0; m=0; temp1=0; temp=0; ////////////////////////////////////Primer valor//////////////////////////////// //Lectura del primer valor while(j<=0){ temp=kbd_getc(); if(temp=='?'){ printf(lcd_putc,"\f"); temp=0;} if(temp!=0){ k[i]=temp; x[i]=k[i]-48; printf(lcd_putc,"%c",temp); i++; //Condicion por si se aprieta alguna condicion if(temp=='+'){ printf(lcd_putc,"\f"); j++;} else if(temp=='-'){

printf(lcd_putc,"\f"); j++;} else if(temp=='X'){ printf(lcd_putc,"\f"); j++;} else if(temp=='/'){ printf(lcd_putc,"\f"); j++;} } } y=1; x1=0; i=i-1; //Concatenacion de los numeros del primer valor while(i!=0){ i--; s=x[i]*y; x1=x1+s; y=y*10; } ///////////////////////////////////Segundo valor//////////////////////////////// //Introduccion del segundo valor while(temp1!='='){ temp1=kbd_getc(); if(temp1!=0){ u[m]=temp1; r[m]=u[m]-48; printf(lcd_putc,"%c",temp1); m++;} } y1=1;

x2=0; m=m-1; //Concatenacion de los numeros del segundo valor while(m!=0){ m--; s=r[m]*y1; x2=x2+s; y1=y1*10; } //////////////////Operaciones a realizar/////////////////////////////////////// switch (temp){ case '+': sum=x1+x2; lcd_gotoxy(1,2); printf(lcd_putc,"\f%f",sum); break; case '-': sum=x1-x2; lcd_gotoxy(1,2); printf(lcd_putc,"\f%f",sum); break; case 'X': sum=x1*x2; lcd_gotoxy(1,2); printf(lcd_putc,"\f%f",sum); break; case '/': sum=x1/x2; lcd_gotoxy(1,2); printf(lcd_putc,"\f%f",sum); default: break; } } }

Simulacin y Resultados:

Pantalla de inicio

Primer valor introducido (10)

Segundo valor introducido (8)

Resultado de la suma (18)

Figura 3.- Simulacin en ISIS

Figura 4.- Armado de la calculadora y demostracin.

Conclusin: Se logro desarrollar una calculadora a la cual se le puede introducir cualquier cantidad que se desee adems de poder hacer las operaciones bsicas de manera satisfactorias como lo fueron suma, resta, multiplicacin y divisin.

Você também pode gostar