Autor Tema: Menu LCD  (Leído 2349 veces)

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

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Menu LCD
« en: 10 de Diciembre de 2008, 13:54:30 »
Estoy haciendo un menu para un lcd segun el ejemplo de este thread . Estoy todavia luchando con las ecuaciones ya que son 22 estados diferentes, entonces uso de q0 a q4 y tengo 3 entradas (Entrar, salir y siguiente). Suponiendo que estaria bien la logica, el problema es que estoy haciendo todo mediante una interrupcion del TIMER0 cada 1ms para detectar cual de los 3 botones se aprieta.....para eso estoy haciendo lo siguiente:

Código: [Seleccionar]
int i=0,o=0,n=0; //i:In o:Out n:Next b:Back.
int t[5]={0,0,0,0,0};
void menu_principal(void);
void posicion(void);
#int_TIMER0
void Timer0_isr(void)
{
if(!input(PIN_D0)) //Ver si se apreto el boton ENTRAR.
{
delay_ms(151);
i=1;
menu_principal();
i=0;
posicion();
}

if(!input(PIN_D1)) //Ver si se apreto el boton SALIR.
{
delay_ms(151);
o=1;
menu_principal();
o=0;
posicion();
}

if(!input(PIN_D2)) //Ver si se apreto el boton SIGUIENTE.
{
delay_ms(151);
n=1;
menu_principal();
n=0;
posicion();
}


set_timer0(252);
}

void menu_principal(void)
{
t[0]=(t[0]&(!t[3])&t[4]) | (t[0]&t[3]&(!t[4])) | (t[0]&t[2]) | (t[1]&t[2]&t[3]&t[4]&i) | (t[0]&(!o));

t[1]=(t[1]&(!t[3])&t[4]) | (t[1]&t[3]&(!t[4])) | ((!t[0])&(!t[1])&(!t[2])&(!t[3])&(!t[4])&n) | (t[1]&t[2]&(!i)) | (t[0]&(!t[2])&(!t[3])&(!t[4])&o) | (t[0]&t[3]&t[4]&o) | (t[1]&(!t[3])&i);
t[1]=t[1] | (t[1]&(!t[2])&t[4]&(!o));

t[2]=((!t[1])&t[2]&t[3]) | (t[1]&t[2]&(!t[3])&t[4]) | (t[2]&t[3]&(!t[4])) | ((!t[2])&t[3]&t[4]&i) | (t[2]&(!t[3])&(!o)) | (t[2]&n) | (t[0]&(!t[2])&(!t[3])&(!t[4])&o) | (t[0]&t[3]&t[4]&(!n));

t[3]=((!t[2])&(!t[3])&n)| (t[3]&(!t[4])&i) | (t[1]&t[2]&t[3]&(!o)) | (t[1]&(!t[3])&n) | (t[1]&t[2]&t[3]&t[4]&o) | (t[0]&t[3]&t[4]&o) | (t[2]&(!t[3])&(!t[4])&o) | (t[0]&(!t[3])&(!t[4])&o);
t[3]=t[3] | ((!t[1])&t[2]&(!t[3])&o) | ((!t[0])&(!t[1])&(!t[2])&t[4]&i);

t[4]=(t[0]&t[2]&t[4])| ((!t[2])&(!t[3])&i) | ((!t[1])&t[2]&o) | ((!t[1])&t[2]&t[3]&t[4]&(!n)) | (t[1]&(!t[3])&i) | (t[2]&t[3]&t[4]&o) | (t[0]&t[3]&t[4]&o) | (t[0]&(!t[2])&(!t[3])&(!t[4]));
t[4]=t[4] | ((!t[0])&(!t[4])&n) | (t[1]&t[2]&(!t[3])&(!t[4])) | ((!t[2])&(!t[4])&n);


}

void posicion(void)
{
if((t[0]==0)&(t[1]==0)&(t[2]==0)&(t[3]==0)&(t[4]==0))
{
lcd_putc('\f');
lcd_putc("Hora");
delay_ms(5);
}
if((t[0]==0)&(t[1]==0)&(t[2]==0)&(t[3]==0)&(t[4]==1))
{
lcd_putc('\f');
lcd_putc("Mostrar Hora");
}
if((t[0]==0)&(t[1]==0)&(t[2]==0)&(t[3]==1)&(t[4]==0))
{
lcd_putc('\f');
lcd_putc("Configurar Hora");
}
if((t[0]==0)&(t[1]==0)&(t[2]==0)&(t[3]==1)&(t[4]==1))
{
lcd_putc('\f');
lcd_putc("Temperatura");
}
if((t[0]==0)&(t[1]==0)&(t[2]==1)&(t[3]==0)&(t[4]==0))
{
lcd_putc('\f');
lcd_putc("Mostrar Temp");
}
if((t[0]==0)&(t[1]==0)&(t[2]==1)&(t[3]==0)&(t[4]==1))
{
lcd_putc('\f');
lcd_putc("Config Temp");
}
if((t[0]==0)&(t[1]==0)&(t[2]==1)&(t[3]==1)&(t[4]==0))
{
lcd_putc('\f');
lcd_putc("Temp Minima");
}
if((t[0]==0)&(t[1]==0)&(t[2]==1)&(t[3]==1)&(t[4]==1))
{
lcd_putc('\f');
lcd_putc("Temp Maxima");
}
if((t[0]==0)&(t[1]==1)&(t[2]==0)&(t[3]==0)&(t[4]==0))
{
lcd_putc('\f');
lcd_putc("Alarma");
}
if((t[0]==0)&(t[1]==1)&(t[2]==0)&(t[3]==0)&(t[4]==1))
{
lcd_putc('\f');
lcd_putc("Activada");
}
if((t[0]==0)&(t[1]==1)&(t[2]==0)&(t[3]==1)&(t[4]==0))
{
lcd_putc('\f');
lcd_putc("Desactivada");
}
if((t[0]==0)&(t[1]==1)&(t[2]==0)&(t[3]==1)&(t[4]==1))
{
lcd_putc('\f');
lcd_putc("Luz");
}
if((t[0]==0)&(t[1]==1)&(t[2]==1)&(t[3]==0)&(t[4]==0))
{
lcd_putc('\f');
lcd_putc("Programar Hora");
}
if((t[0]==0)&(t[1]==1)&(t[2]==1)&(t[3]==0)&(t[4]==1))
{
lcd_putc('\f');
lcd_putc("Hora ON");
}
if((t[0]==0)&(t[1]==1)&(t[2]==1)&(t[3]==1)&(t[4]==0))
{
lcd_putc('\f');
lcd_putc("Hora OFF");
}
if((t[0]==0)&(t[1]==1)&(t[2]==1)&(t[3]==1)&(t[4]==1))
{
lcd_putc('\f');
lcd_putc("Intensidad");
}
if((t[0]==1)&(t[1]==0)&(t[2]==0)&(t[3]==0)&(t[4]==0))
{
lcd_putc('\f');
lcd_putc("Automatico");
}
if((t[0]==1)&(t[1]==0)&(t[2]==0)&(t[3]==0)&(t[4]==1))
{
lcd_putc('\f');
lcd_putc("Activado");
}
if((t[0]==1)&(t[1]==0)&(t[2]==0)&(t[3]==1)&(t[4]==0))
{
lcd_putc('\f');
lcd_putc("Desactivado");
}
if((t[0]==1)&(t[1]==0)&(t[2]==0)&(t[3]==1)&(t[4]==1))
{
lcd_putc('\f');
lcd_putc("Manual");
}
if((t[0]==1)&(t[1]==0)&(t[2]==1)&(t[3]==0)&(t[4]==0))
{
lcd_putc('\f');
lcd_putc("Mas (+)");
}
if((t[0]==1)&(t[1]==0)&(t[2]==1)&(t[3]==0)&(t[4]==1))
{
lcd_putc('\f');
lcd_putc("Menos (-)");
}
}

Es la forma correcta de hacerlo o hay alguna forma de hacer la comprobacion que hace la funcion posicion de forma mas simple y eficiente?

Por las dudas, el menu es:

Código: [Seleccionar]
1: Luz
              1: Programar Hora
        1: Hora de Encendido.
        2: Hora de Apagado.
              2: Intensidad
        1: Automático.
                    1: Activado.
                    2: Desactivado.
        2: Manual.
                    1: Nivel 1.
                    2: Nivel 2.        
                    3: Nivel 3.
                    4: Nivel 4.

2: Alarma
               1: Activado.
               2: Desactivado.

3: Temperatura.
               1: Mostrar.
               2: Configurar.
              1: Temperatura Minima.
              2: Temperatura Maxima.

4: Hora
             1: Mostrar Hora.
             2: Configurar Hora.

D0: Entrar.
D1: Salir.
D2: Siguiente.

« Última modificación: 10 de Diciembre de 2008, 14:04:26 por aripod »

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Menu LCD
« Respuesta #1 en: 10 de Diciembre de 2008, 15:36:46 »
Hola.

No se si te sirva la idea, pero yo uso mejor teclas de direccion(UP,DOWN,LEFT,RIGHT) y dos de control(ACEPTAR, CANCELAR) y con ellas configuro todo.

Saludos
El papel lo aguanta todo

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Menu LCD
« Respuesta #2 en: 10 de Diciembre de 2008, 15:59:36 »
Esa era la idea realmente, pero ya se me esta complicando para hacerlo con 3 teclas. Cual es el metodo que usas para armar el menu? Sera algun problema en como hago las funciones? Estoy haciendo las tablas analogas al link ke puse, pero en vez de hacer los mapas de karnaugh, uso el LOGICAID, donde voy armando la tabla de verdad....

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Menu LCD
« Respuesta #3 en: 13 de Diciembre de 2008, 05:40:00 »
Veo que has declarado la variable "t" como un array de 5 números enteros, pero que luego lo utilizas para almacenar sólo un bit.

Te sugiero que utilices una estructura a nivel de bits, y verás cómo el código compilado disminuirá sensiblemente, además de que quizás te resulte más fácil de entender.

Código: C
  1. typedef union {
  2.     unsigned int8 valor;
  3.     struct {
  4.        unsigned b0:1;
  5.        unsigned b1:1;
  6.        unsigned b2:1;
  7.        unsigned b3:1;
  8.        unsigned b4:1;
  9.        unsigned b5:1;
  10.        unsigned b6:1;
  11.        unsigned b7:1;
  12.     } bits;
  13. } tbyte;
  14.  
  15. tbyte t;

Para asignar un valor puedes hacer:
Código: C
  1. t.bits.b0=(t.bits.b0&(!t.bits.b3)&t.bits.b4) | (t.bits.b0&t.bits.b3&(!t.bits.b4)) | (t.bits.b0&tbyte.bits.b2) | (t.bits.b1&t.bits.b2&t.bits.b3&t.bits.b4&i) | (t.bits.b0&(!o));

Y la gran ventaja es cuando quieras comprobar qué valor tiene. En vez de poner esto:
Código: C
  1. if((t[0]==0)&(t[1]==0)&(t[2]==1)&(t[3]==0)&(t[4]==1))

puedes poner sencillamente esto:
Código: C
  1. if (t.valor==0b10100)

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Menu LCD
« Respuesta #4 en: 13 de Diciembre de 2008, 10:09:30 »
Muchas gracias! Eso va a hacer que ocupee menos memoria tambien. Ya logre moverme dentro del menu tal como lo queria, ahora es el momento de hacer las acciones del menu. Lo que hice fue ahora ir comprobando en que estado estaba, asignando un numero a una variable y de ahi con otra funcion hice lo que habia que hacer, segun el estado en el que haya estado el array. Ahora se me ocurrio hacer un menu mas largo, por ejemplo.....en configurar hora, cuando se apriete ENTER que haya otro estado del menu directamente para hacer la accion,,,,,,,,que convendria?

Una duda con respecto a la sintaxis....cuando hago (valor1&valor2)&valor3 es lo mismo hacer valor1&valor2&valor3 o tiene que ser de a dos valores nada mas?

Desconectado scientist

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 999
Re: Menu LCD
« Respuesta #5 en: 13 de Diciembre de 2008, 13:28:02 »
una pregunta, no es mejor utilizar interrupciones por el puerto b4-b7? y luego habilitar una bandera para los timers, y asi haga un retardo para evitar el antirrebote, saludos
NO le digas a DIOS que tienes un gran problema, dile a tu problema que tienes un GRAN DIOS!!
Alma mia y castillo mio, mi Dios en quien yo confiare....

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Menu LCD
« Respuesta #6 en: 13 de Diciembre de 2008, 13:41:11 »
Una cosa, no confundas "& - AND bit a bit" con "&& - comparador AND". En tu caso no sé cuál de los dos quieres usar, sospecho que el segundo.

En ambos casos, en esta operación puedes eliminar los paréntesis: (valor1&valor2)&valor3

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Menu LCD
« Respuesta #7 en: 14 de Diciembre de 2008, 15:51:01 »
Hay alguna forma de hacer que t0=t.bits.b0? O sea, en el codigo en vez de escribir t.bits.b0 escriba directamente t0???

Hacer esto seria correcto?
Código: [Seleccionar]
typedef union
{
unsigned int8 valor;
struct
{
unsigned b0:1;
unsigned b1:1;
unsigned b2:1;
unsigned b3:1;
unsigned b4:1;
unsigned b5:1;
unsigned i:1;
unsigned o:1;
unsigned n:1;
}bits;
}tbyte;
tbyte t, q;

Uso t y q porque hago lo siguiente dentro de una funcion:
Código: [Seleccionar]
q[0]=((t[0]&(!t[3]))&t[4]) | ((t[0]&t[3])&(!t[4])) | (t[0]&t[2]) | (((t[1]&t[2])&(t[3]&t[4]))&i) | (t[0]&(!o));
t[0]=q[0];
« Última modificación: 14 de Diciembre de 2008, 15:54:52 por aripod »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Menu LCD
« Respuesta #8 en: 14 de Diciembre de 2008, 19:08:25 »
Siempre puedes hacer que el compilador te haga el cambio:

#define t0 t.bits.b0
#define t1 t.bits.b1
#define t2 t.bits.b2
#define t3 t.bits.b3
#define t4 t.bits.b4
#define t5 t.bits.b5
#define t6 t.bits.b6
#define t7 t.bits.b7

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Menu LCD
« Respuesta #9 en: 14 de Diciembre de 2008, 20:16:29 »
Gracias por la respuesta tan rapida. Una nueva duda. Ya esta todo codificado. Por ahora esta andando la muestra del menu. Ahora me resta hacer las acciones del mismo, asi que tendre mas dudas a medida que las vaya haciendo. :)

pd: Mis primeros 100 mensajes  :-/
« Última modificación: 15 de Diciembre de 2008, 01:16:27 por aripod »