Autor Tema: Calculadora con Displays  (Leído 3273 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Calculadora con Displays
« en: 02 de Enero de 2007, 01:35:27 »
Hola saludos, pues he posteado ya algunas cosillas aparte, jaja, ahora aca va el junto, pues me he pasado el dia tratando de encontrar una solución y buscando el error que no lo he encontrado. Se tarata de una especie de calculadora, ya qeu despliega el resultado mediante 5 displays, e ingresa los datos mediante un teclado matricial, los displays deben estar multiplexados por el microcontrolador, debo hacerlo en el 16f84a (si se puede, ya he visto, no he acabado el programa ya que debe sumar multiplicar y dividir y reconocer división entre cero y no debe mostrar resultados negativos, ni con punto flotante, y numero maximo a desplegar será 99999, ahh y no debo usar decodificador)

aca parte de mi codigo, digo parte, porque no lo he acabado, falta hacer las operaciones con cualquier dato de ingreso, aca solamente trato de ingresar dos numeros, sumarlos y mostrar el resultado en los displays (sumar directamente sin presionar la tecla de suma, solo por motivos de prueba, despues solucionado el problema que he tenido ya sera mas sencillo, creo). Ahh si he cometido errores garrafales de programación como no usar punteros, es porque no funcionaba, ya que compilaba, pero no funcionaba como cuando lo hice de esta manera:

Código: [Seleccionar]
#include<16F84A.h>
#include<teklado.c>  //esta es mi libreria para manejo del teclado
// devuelve el codigo ascii de la tecla presionada, mediante la función: kbd_getc()
#fuses XT,NOWDT,PUT,NOPROTECT
#use delay(clock=4000000)
#byte port_a=5
#byte port_b=6
#use fast_io(a)
#use fast_io(b)

unsigned int CONST LED [11]={0x00,0x7E,0x0C,0xB6,0x9E,0xCC,0xDA,0xFA,0x0e,0xfe,0xde};
int dato1 [5],dato2 [5],total[5],dig1,dig2,dig_r;
int32 num1=0,num2=0,result=0;
int i,cont,pin=44;   // pin 44 asignado a RA4, 63 a RA3..., 60 a RA0; esto esta en el 16f84a.h
char c,c2;

void entero(int32 num,int dig,int dato[])  // funcion para convertir a entero un dato array
{  // el int obtenido se guarda en num, dig es la cantidad de digitos; y dato es el array a cambiar a int
   num=0;
   cont=1;
   do
   {
      num=num+dato[dig-1]*cont;
      cont=cont*10;
      dig--;
   }while(dig!=0);
}

void array(int32 resultado) // funcion para convertir de int a array
{  // resultado es el numero int que se quiere desea convertir a array
   i=0;
   do
   {
      total[i]=resultado%10;
      resultado/=10;
      i++;
   }while(resultado!=0);
   dig_r=i;   // digitos resultado
}

void mux(int v_mux[])            // función de multiplexación
{
   set_tris_b(0x01); // displays
   pin=44;
   for(i=0;i<5;i++)
   {
      port_b=LED[v_mux[i]+1];    // se despliega dato
// use +1 porque pretendo hacer que no se muestre nada en los displays qeu no tengan datos,
// no lo logre por el momento, si podeis ayudarme con ello
      output_high(pin);      // displays de cátado común, se activa cátodo correspondiente
      delay_ms(50);         // retardo para observación contínua
      output_low(pin);        // apagamos display, para pasar al siguiente
      delay_ms(50);         // retardo para observación continua
      pin--;                 // cambiamos de pin
   }
}

void cargar(int dato[],int dig)  // funcion para cargar datos del teclado a un array
{  // dato sera el que contenga las teclas presionadas, en dig se guardará la cantidad de digitos que se presiono
   i=0;
   set_tris_b(0xf0);   // teclado
   while(true)
   {
      do
      {
         c=kbd_getc();        // se guarda la tecla presionada
      }while(c==0);           // se pide presion de tecla, mientras no se presione niguna
      do
      {
         c2=kbd_getc();       // ya que si usas c de nuevo perderías el valor de la tecla
      }while(c2!=0);          // de acá no sale hasta que no sueltes la tecla
      if(c=='*')              // se presiono *, para terminar?
         break;
      if(c!=0)
      {
         dato[i]=c-'0';       // guardo dato char c a int dato (conversion)
         i++;                 // hasta presionar *
         dig=i;
      }
   }
}

void main()
{
   set_tris_a(0xe0);  // el puerto A como salidas para los transistores de multiplexación (use transistores 2n3904 =npn)
   port_b_pullups(true);         // activa pull up del puerto b, no hará falta conectar resistencias
   port_a=0;  // inicialización puertos
   port_b=0;
   for(i=0;i<5;i++)  // inicialización variables para datos y resultado
   {
      dato1[i]=0;
      dato2[i]=0;
      total[i]=0;
   }
   while(true)   // ciclo de programa
   {
      cargar(dato1,dig1);  // cargo un dato en dato1 (mediante ingreso por teclado), y guardo cantidad de digitos en dig1
      entero(num1,dig1,dato1);  // convierto a entero dato1
      mux(dato1);  // visualizo en displays dato1
      cargar(dato2,dig2);  // cargo otro dato en dato2 (teclado tb), y su cantidad de digitos en dig2
      entero(num2,dig2,dato2);  // convierto a entero dato2
      mux(dato2);   // visualizo en displays dato2
      result=num1+num2;  // realizo la suma
      array(result);  // conviero el resultado de la suma en array
      mux(total);    // visualizo el resultado total en displays
   }
}

este es todo el codigo que he realizado y funciona mas o menos, ya que no me muestra el resultado, talvez he cometido errores muy tontos, disculpen por ello, talvez sea mejor con los punteros, no recuerdo muy bien como manejarlos, me refrescan la memoria? osea para que sirve el * y para que el &

o bueno cualquier ayuda que se pueda para que mi programa funcione correctamente me vendrá de maravilla.

ahh talvez aclararles que usé CCS version 4.013, ya que alguna vez recuerdo que queria usar los numeros de los pines con la version 3.242 y no me compilaba; pero con la 4 nome dio ningun problema al compilar y funciona de maravilla esa parte.

os dejo tb la simulación que hice con el proteus 6.9 sp4

muchas gracias, adios!
.

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Calculadora con Displays
« Respuesta #1 en: 02 de Enero de 2007, 08:48:00 »
Los punteros estaba este 'tuco':
   * : Se puede interpretar como: Apunta al contenido de...
   & : Se puede interpretar como: Apunta a la dirección de...


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Calculadora con Displays
« Respuesta #2 en: 02 de Enero de 2007, 14:13:04 »
sale, gracias por la refrescada, ya se me hacia algo de eso, jeje. Pero mira que no he podido hacerlo con punteros, me sale error a acada rato, mas o menos hice algo asi:

void entero(int32 num,int dig,int*dato)
{
   num=0;
   int cont=1;
   do
   {
      num=num+dato[dig-1]*cont;
      cont=cont*10;
      dig--;
   }while(dig!=0);
}

y llamo con:
entero(num1,dig1,&dato1);

y me sale error, como debo hacerlo?
.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Calculadora con Displays
« Respuesta #3 en: 05 de Enero de 2007, 20:18:44 »
 :cry:
se me olvidaba, la simulacion se vuelve medio lenta pero es porque estoy usando la exploracion del teclado que lentea al proteus, y ademas qeu voy en la programacion dinamica que dice vszener, porque si usaba un 16f877a la simulacion iba mas rapida, al momento de ejecutar la simulacion en el proteus se pide ingreso de datos, presiono cualquier pulsador del teclado menos - + x /, y despues ENTER (*) y tendrian que ver ese numero desplegado desde el display mas a la derecha, despues pide el otro numero, de la misma foram con enter y tb lo muestra, por ultimo deberia mostrar directamente la suma de los numeros presionados, pero no lo hace muestra ceros, la conversion de int a array creo que va mal, weno, espero su ayuda, muchas gracias.
adios.
.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Calculadora con Displays
« Respuesta #4 en: 09 de Enero de 2007, 18:05:48 »
hola saldos, yo se que hay mucho muy buenos programadores por aca, porfavor una ayudita

si quieren podemos platicar por msm para explicaros algunas cosas que hice en el codigo para que sea mas entendible, porfavor, muchas gracias adios.
« Última modificación: 04 de Mayo de 2008, 19:33:50 por Cryn »
.


 

anything