Autor Tema: Problema con Teclado para boton de retorno  (Leído 1961 veces)

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

Desconectado tuxtankamon

  • PIC10
  • *
  • Mensajes: 10
Problema con Teclado para boton de retorno
« en: 19 de Diciembre de 2013, 15:45:55 »
Hola amigos, estoy aqui de nuevo con una nueva consulta, tengo un programa en CCS, ya casi lo tengo terminado, la idea del programa es mostrarme la potencia de consumo de ciertas lineas electricas, estas lineas las tengo simuladas con un logic state cada linea me dira que consumo tiene, por ejemplo 50W, 100W, etc, ademas de que podre ingresar el numero de horas de consumo y lo que cuesta. Todo el codigo me da bien, el unico problema que tengo es como volver a solicitar la cantidad de horas y el precio usando el mismo teclado, es decir un boton de retorno donde yo pueda volver a pedir esos parametros sin necesidad de reiniciar la simulacion. Lo intente con una tecla del teclado y hasta con un boton externo pero nada siempre se me queda imprimiendo los datos actuales. Ayudenme a resolver eso por favor.


PD: Les dejo el codigo, la simulacion (Proteus 7.10) y las librerias que usé para que me ayuden.

Desconectado tuxtankamon

  • PIC10
  • *
  • Mensajes: 10
Re: Problema con Teclado para boton de retorno
« Respuesta #1 en: 20 de Diciembre de 2013, 23:38:59 »
Ayudenme porfa!!!!

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re: Problema con Teclado para boton de retorno
« Respuesta #2 en: 21 de Diciembre de 2013, 21:31:11 »
Acabo de bajarme tu archivo, ahora es muy tarde asi que mañana lo miro y veo si te puedo ayudar. Quizas alguien te responda antes que yo.

Saludos.

Desconectado tuxtankamon

  • PIC10
  • *
  • Mensajes: 10
Re: Problema con Teclado para boton de retorno
« Respuesta #3 en: 21 de Diciembre de 2013, 21:55:14 »
Sos el primero en responderme, yo soy novato en la programacion por eso pido esa pequeña ayuda, si tenes dudas de como funciona la simulacion, te puedo decir. gracias por bajar el archivo, espero con ansias de que me ayudes.

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re: Problema con Teclado para boton de retorno
« Respuesta #4 en: 21 de Diciembre de 2013, 22:36:17 »
Estuve echando un vistazo al codigo y creo que el problema que tienes es que cuando pasa por el punto de lectura de la tecla de retorno, no realiza correctamente lo que tu quieres, aparte que tampoco borras las variables y continua el bucle.
La mejor solucion es utilizar la interrupcion externa y en su rutina resetear las variables, de modo que rompa el bucle y vuelva a inicio.
De memoria no recuerdo exactamente como hacerlo, pero tengo algun programa que lo hace, mañana lo busco y te lo comento.
De todas formas si sabes como manejar las interrupciones, intentalo. Se trataria de: 1- al producirse la interrupcion, desactivar futuras interrupciones, 2- atender la rutina de interrupcion, donde se resetean las variables y activa una bandera, 3- reactivar las interrupciones y finalizar. En el lugar de retorno de la rutina de interrupcion un if que te lleve a inicio si bandera==1.
Basicamente creo que era asi. Mañana te pongo el codigo completo.

Saludos.

Desconectado tuxtankamon

  • PIC10
  • *
  • Mensajes: 10
Re: Problema con Teclado para boton de retorno
« Respuesta #5 en: 21 de Diciembre de 2013, 23:33:31 »
Gracias por responderme, entiendo lo que me decis, estuve probando las interrupciones en el puerto B pero como ahi tengo el teclado me da problemas, lo que quiero es un retorno para que me vuelva a pedir los datos sin necesidad de reinicializar todo, esto lo quiero por si alguien se equivoca ingresando el numero de horas o el precio. probe con una etiqueta pero no me da como yo quiero. jejejejeje no se que hacer ni como hacerlo en ese caso. Seria de gran ayuda si me brindas otro consejo de como hacerlo bien.

Desconectado Darkman_A

  • PIC18
  • ****
  • Mensajes: 288
Re: Problema con Teclado para boton de retorno
« Respuesta #6 en: 22 de Diciembre de 2013, 15:00:37 »
Hola.
¿ Si haces
Código: [Seleccionar]
potencia = codigo *25 ; , he imprimis potecia , no es lo mismo ?; y te ahorras todos los case y breaks, etc...
Estaria bueno que la presentacion ( escuela, etc, etc,) la pusieras en una funcion y la pones a bajo de todo, porque no aporta nada al programa. Solo dificulta la lectura.
Para hacer lo que queres tenes que utilizar interrupciones. Podrias utilizar los botones no numericos del teclado (A,B,C,D o como los llames), de modo que sean ENTER, CANCELAR, BORRAR, etc (lo que necesites o se te ocurra).
¿Vos decis que asi como esta el codigo hace algo, ademas de poner la presentacion?. Para mi que tiene varios errores. Voy a probarlo y luego escribo de nuevo.

Saludos.

Desconectado tuxtankamon

  • PIC10
  • *
  • Mensajes: 10
Re: Problema con Teclado para boton de retorno
« Respuesta #7 en: 23 de Diciembre de 2013, 04:02:53 »
Gracias por la ayuda compañeros, con respecto a tu comentario Darman_A esa multiplicacion no me origina todas las potencias que me solicitaron en los requirimientos de esta tarea, por eso tuve que hacer el monton de casos  :( . Estoy aprendiendo a programar en micro por eso soy un poco malo jejejejeje comprendanme.

Asi me quedo el codigo en su segunda version, logré poner limitacion de digitos ingresados, un boton OK (tecla #) en caso de que el digito ingresado sea menor a la cantidad maxima de digitos y pude poner el boton de retorno para solicitar de nuevo los datos (hora y precio), el problema esta en que no pude hacerlo con el mismo teclado, lo hice con un boton. Me podrian ayudar ahi, para hacerlo con el teclado???
Ahi les dejo mi codigo y el archivo de simulacion en el adjunto de este comentario

Código: [Seleccionar]
#include<16f877A.h>
#fuses XT, NOWDT
#use delay (clock=4M)
#include <stdlib.h>
#include<math.h>
#include<Flex_LCD420.c>
#include<kbd2.c>

#byte portc = 0x07

int i,j,m,boton;
long potencia;
float horas;
float precio;
float pago;
int codigo,l,l2;
char k,k2,k3,hrs[1],cant[2];

void imprimir(void);
void presentacion();

void main()
{
   set_tris_c(0xFF);
   lcd_init();
   kbd_init();
   port_b_pullups(true);   
   presentacion();                                //Funcion de la Presentacion del Proyecto
   
   Inicio:
   boton = 0;
   m = 0;
   lcd_gotoxy(3,1);
   lcd_putc("Ingrese el numero");                  //Ingreso del numero de Horas a traves del teclado 4x4
   lcd_gotoxy(7,2);
   lcd_putc("de Horas");
      while(i<2)                                   //Con esto limito que la cantidad de horas se limite a dos digitos
      {
      k=kbd_getc();
      l=k-48;
      if(k!=0)
         {
         hrs[i]=k;
         i++;
         if(k!='#')                                //Si no se presiona el # (boton OK) va imprimiendo el valor de las teclas seleccionadas
         {
         lcd_gotoxy(i+10,3);
         printf(lcd_putc,"%u",k-48);
         delay_ms(500);
         }
         if(k=='#')                                //Aqui se finaliza el ingreso de digitos por parte de las horas     
         break;         
         }
        horas = atoi(hrs);                         //Conversion de la cantidad de horas ingresadas por el teclado a un numero entero
      }
   
   lcd_putc("\f");
   lcd_gotoxy(3,1);
   lcd_putc("Ingrese el precio");                  //Ingreso del Precio en cordobas usando el teclado 4x4
   lcd_gotoxy(5,2);
   lcd_putc("en Cordobas");
      while(j<4)
      {     
      k2=kbd_getc();
      l2=k2-48;
      if(k2!=0)
         {
         cant[j]=k2;
         j++;
         if(k2!='#')
         {
         lcd_gotoxy(j+10,3);
         printf(lcd_putc,"%c",k2);
         delay_ms(500);
         }
         if(k2=='#')
         break;         
         }
       precio = atof(cant);                     //Conversion del precio ingresado por el teclado a un numero
      }
   
   while(true)                                  //Ciclo Infinito
   {
      codigo = portc;
      lcd_putc("\f");                                       
     
      switch (codigo)                           //Seleccion de Potencia segun el codigo binario que se origina en el puerto C
      {
      case 0b00000001:     //caso 1    Potencia de 25W   
      potencia = 25;
      imprimir();     
      break;
     
      case 0b00000010:     //caso 2    Potencia de 50W
      potencia = 50;
      imprimir();
      break;
     
      case 0b00000011:     //caso 3    Potencia de 75W
      potencia = 75;     
      imprimir();   
      break;
     
      case 0b00000100:     //caso 4    Potencia de 100W
      potencia = 100;
      imprimir();     
      break;
     
      case 0b00000110:     //caso 6    Potencia de 150W
      potencia = 150;
      imprimir();     
      break;
     
      case 0b00001000:     //caso 8    Potencia de 200W
      potencia = 200;
      imprimir();     
      break;
     
      case 0b00001100:     //caso 12   Potencia de 300W
      potencia = 300;
      imprimir();     
      break;
     
      case 0b00010000:     //caso 16   Potencia de 400W
      potencia = 400;
      imprimir();     
      break;
     
      case 0b00010100:     //caso 20   Potencia de 500W
      potencia = 500;
      imprimir();     
      break;
     
      case 0b00011000:     //caso 24   Potencia de 600W
      potencia = 600;
      imprimir();     
      break;
     
      case 0b00011100:     //caso 28   Potencia de 700W
      potencia = 700;
      imprimir();     
      break;
     
      case 0b00100000:     //caso 32   Potencia de 800W
      potencia = 800;
      imprimir();     
      break;
     
      case 0b00100100:     //caso 36      Potencia de 900W
      potencia = 900;
      imprimir();     
      break;
     
      case 0b00101000:     //caso 40      Potencia de 1000W
      potencia = 1000;
      imprimir();     
      break;
     
      case 0b00110000:     //caso 48      Potencia de 1200W
      potencia = 1200;
      imprimir();     
      break;
     
      case 0b00111100:     //caso 60      Potencia de 1500W
      potencia = 1500;
      imprimir();     
      break;
     
      case 0b01000000:     //caso 64      Potencia de 2000W
      potencia = 2000;
      imprimir();     
      break;
     
      case 0b01010100:     //caso 84      Potencia de 2500W
      potencia = 2500;
      imprimir();     
      break;
     
      case 0b01101000:     //caso 104     Potencia de 3000W
      potencia = 3000;
      imprimir();     
      break;
     
      case 0b10000000:     //caso 128     Potencia de 3500W
      potencia = 3500;
      imprimir();     
      break;
           
      default:             //Caso contrario la Potencia equivale a 0W
      potencia=0;
      imprimir();     
      break;
      }     

     
//!      k3=kbd_getc();
//!      if(k3=='A')                      //Esto es lo que quiero hacer, utilizar la tecla A del teclado para que el usuario pueda ingresar de nuevo desde
//!      {                                //cero los valores de hora y de precio, pero no me lo hace :'(
//!         potencia = 0;
//!         horas = 0;
//!         precio = 0;
//!         j=0;
//!         i=0;
//!         k=0;
//!         k2=0;
//!         lcd_putc("\f");
//!         goto Inicio;
//!      }

      if(input(PIN_A4)==0)                      //Con este boton (PIN A4) se vuelve a solicitar los datos de hora y de precio
      {
         potencia = 0;
         precio = 0;
         j=0;
         i=0;
         lcd_putc("\f");
         goto Inicio;
      }

   }   
}

void presentacion (void)
{
   lcd_gotoxy(6,1);
   lcd_putc("UNIVERSIDAD");
   lcd_gotoxy(6,2);
   lcd_putc("TECNOLOGICA");
   lcd_gotoxy(5,3);
   lcd_putc("NICARAGUENSE");
   lcd_gotoxy(9,4);
   lcd_putc("(UTN)");
   delay_ms(1000);
   lcd_putc("\f");
}

void imprimir (void)
{
   pago = (potencia*horas*precio);
   lcd_gotoxy(1,1);
   printf(lcd_putc,"Potencia = %Lu", potencia);
   lcd_gotoxy(1,2);
   printf(lcd_putc,"Numero Horas = %f", horas);
   lcd_gotoxy(1,3);
   printf(lcd_putc,"Precio = %f", precio);
   lcd_gotoxy(1,4);
   printf(lcd_putc,"Pago = C$%f", pago);
   delay_ms(500);
   break;
}

Desconectado sirias52

  • PIC10
  • *
  • Mensajes: 40
Re: Problema con Teclado para boton de retorno
« Respuesta #8 en: 31 de Diciembre de 2013, 18:58:05 »
Te pudieron ayuda tuxtankamon?  :mrgreen: