Autor Tema: Ayuda, realizar menu en CCS  (Leído 21381 veces)

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

Desconectado Lord_Duran

  • PIC12
  • **
  • Mensajes: 76
Re: Ayuda, realizar menu en CCS
« Respuesta #30 en: 16 de Septiembre de 2010, 20:35:01 »
Saludos Cryn

bueno, ahora si lo pongo todo lo necesario para la simulacion:


Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Ayuda, realizar menu en CCS
« Respuesta #31 en: 16 de Septiembre de 2010, 20:58:05 »
Hola, he simulado tu codigo y el lcd se refresca a cada momento, debes utilizar un flag o bandera o indicador, el cual te diga que existe modificacion de las variables a mostrar en lcd. Si es necesario refrescas, sino pues no lo hagas.

Saludos
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado Lord_Duran

  • PIC12
  • **
  • Mensajes: 76
Re: Ayuda, realizar menu en CCS
« Respuesta #32 en: 17 de Septiembre de 2010, 18:22:53 »


Bueno, luego de tanto  :shock: :shock: :? :? , ahora me puse a hacer funcionar este cerebrito. :D :D :D

Realice una parte inicial del menu, podran ver en los videos que subo como funciona, en si, son dos códigos

El primer código es:
Código: [Seleccionar]
#include <16F877A.h>
#device adc = 10
#FUSES XT, NOWDT, NOPROTECT, NOPUT, NOBROWNOUT
#use delay(clock=4000000)

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#bit enter = 6.0
#bit arriba = 8.6
#bit abajo = 8.7

#include <LCD4x20.C>

void vDibujaPuntero(int puntero);


#zero_ram
void main()
{
   int puntero = 0;
   lcd_init();
   
   while (true)
   {
     
      delay_ms(300);
      lcd_putc("\f");
      lcd_putc("Prueva menu");
      lcd_gotoxy(1,2);
      lcd_putc("Inicialmente solo");
      lcd_gotoxy(1,3);
      lcd_putc("control movimiento");
      lcd_gotoxy(1,4);
      lcd_putc("del puntero");
     
      if (abajo == 1)
      {
         delay_ms(300);
         puntero++;
         vDibujaPuntero(puntero);
      }
      if (arriba == 1)
      {
         delay_ms(300);
         puntero--;
         vDibujaPuntero(puntero);
      }
   }
}

void vDibujaPuntero (int puntero)
{
   lcd_putc("\f");
   lcd_gotoxy(3,1);
   lcd_putc("1 opcion uno");
   lcd_gotoxy(3,2);
   lcd_putc("2 opcion dos");
   lcd_gotoxy(3,3);
   lcd_putc("3 opcion tres");
   lcd_gotoxy(3,4);
   lcd_putc("4 opcion cuatro");
   lcd_gotoxy(1,puntero);
   lcd_putc("->");
}

el video correspondiente:


el segundo código, con una pequeña variante: le quite la introduccion:


el código correspondiente es el siguiente:
Código: [Seleccionar]
#include <16F877A.h>
#device adc = 10
#FUSES XT, NOWDT, NOPROTECT, NOPUT, NOBROWNOUT
#use delay(clock=4000000)

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#bit enter = 6.0
#bit arriba = 8.6
#bit abajo = 8.7

#include <LCD4x20.C>

void vDibujaPuntero(int puntero);


#zero_ram
void main()
{
   int puntero = 0;
   lcd_init();
   
   while (true)
   {
      if (abajo == 1)
      {
         delay_ms(300);
         puntero++;
         vDibujaPuntero(puntero);
      }
      if (arriba == 1)
      {
         delay_ms(300);
         puntero--;
         vDibujaPuntero(puntero);
      }
   }
}

void vDibujaPuntero (int puntero)
{
   lcd_putc("\f");
   lcd_gotoxy(3,1);
   lcd_putc("1 opcion uno");
   lcd_gotoxy(3,2);
   lcd_putc("2 opcion dos");
   lcd_gotoxy(3,3);
   lcd_putc("3 opcion tres");
   lcd_gotoxy(3,4);
   lcd_putc("4 opcion cuatro");
   lcd_gotoxy(1,puntero);
   lcd_putc("->");
}

Bueno, como podran observar, en el primer video regresa automáticamente a la introduccion, pudiendo notarse por muy poco tiempo el cambio del puntero (->) que hace en el menu, supongo que ello tengo que controlarlo con una interrupcion, pues, estoy en ello, voy a controlar mediante el boton "ok" que va a estar conectado al pin de interrucion externa (rb0), bueno, que me vaya bien.

Tambien me falta controlar cuando el puntero(->) llega a los extremos del menu, además de aumentarle más opciones, por que necesito que sean como 7 opciones.

Bueno, es un avance, y haber que tal... :undecided: :undecided: :undecided:

Saludos y Muchas gracias.

Desconectado Lord_Duran

  • PIC12
  • **
  • Mensajes: 76
Re: Ayuda, realizar menu en CCS
« Respuesta #33 en: 17 de Septiembre de 2010, 22:15:24 »
Saludos.

Estoy queriendo hacer lo siguiente:

1    2    3    4   
2    3    4    5   
3    4    5    6
4    5    6    7   

p1  p2  p3  p4 -->pantallas

pues bueno, lo hice con switch y sale un código muy largo, con varias funciones, tambien es largo.

Suky decia por ahí que tambien un menu se puede hacer con punteros, como se declara los punteros???

Muchas gracias.

Desconectado Lord_Duran

  • PIC12
  • **
  • Mensajes: 76
Re: Ayuda, realizar menu en CCS
« Respuesta #34 en: 17 de Septiembre de 2010, 23:22:50 »
Saludos.

Ya logre hacer algo del menu, en si, hasta ahí funciona a la perfección, lo que no me doy cuenta es cómo hacer para la tecla "ok", se que tengo que manejar la variable "puntero", que ese valor va a tener que mandarse cada vez que se presione "ok", peroo....., no se cómo hacer eso.

Bueno, logre controlar los extremos del menu, pero solamente para 4 opciones, ya que tengo problemas cuando quiero 7 u 8 opciones, osea:

1 opcion
2 opcion
3 opcion
4 opcion

hasta ahi muestra bien, la flecha "->" se mueve bien, pero, cuando quiero mostrar

5 opcion
6 opcion
7 opcion
8 opcion

puess......., eso ya no se como hacerlo, le puse otra funcion que me dibuje todo eso, perooo nada.

El código es este:
Código: [Seleccionar]
#include <16F877A.h>
#device adc = 10
#FUSES XT, NOWDT, NOPROTECT, NOPUT, NOBROWNOUT
#use delay(clock=4000000)

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#bit enter = 6.0
#bit arriba = 8.6
#bit abajo = 8.7

#include <LCD4x20.C>

void vDibujaPuntero(int puntero);
void vDibujaPuntero2(int puntero);


#zero_ram
void main()
{
   int puntero = 0;
   lcd_init();
   
   while (true)
   {
      if (abajo == 1)
      {
         delay_ms(300);
         puntero++;
         if (puntero == 5)
         {
            puntero = 1;
         }
         vDibujaPuntero(puntero);
      }
      if (arriba == 1)
      {
         delay_ms(300);
         puntero--;
         if (puntero == 0)
         {
            puntero = 4;
         }
         vDibujaPuntero(puntero);
      }
   }
}

void vDibujaPuntero (int puntero)
{
   lcd_putc("\f");
   lcd_gotoxy(3,1);
   lcd_putc("1 opcion uno");
   lcd_gotoxy(3,2);
   lcd_putc("2 opcion dos");
   lcd_gotoxy(3,3);
   lcd_putc("3 opcion tres");
   lcd_gotoxy(3,4);
   lcd_putc("4 opcion cuatro");
   lcd_gotoxy(1,puntero);
   lcd_putc("->");
}

De todas formas, mando los archivos de simulacion.

Desconectado Lord_Duran

  • PIC12
  • **
  • Mensajes: 76
Re: Ayuda, realizar menu en CCS
« Respuesta #35 en: 25 de Septiembre de 2010, 19:30:32 »
otraves yo... :) :) luego de algun tiempo.

ya tengo un poco avanzado el menu
El problema es que no se como hacerle para que luego de seleccionar alguna opcion, pues regrese al codigo principal, osea, si se selecciona por ejemplo la opcion 3, luego de un rato necesito que regrese a mostrar lo que estava al inicio del programa, osea, volver al programa principal.

Otro problema, es el momento de la simulacion, como podran ver en el esquematico en proteus, en el pin RB1 puse un LOGICSTATE, por que con el boton (pull down) que entra a ese pin, pues sale error, no se por que, no entiendo nada de ese problema, ya que lo revise y esta armado como los otros dos botones.

aqui pongo el código:
Código: [Seleccionar]
#include <16F877A.h>
#device adc = 10
#FUSES XT, NOWDT, NOPROTECT, NOPUT, NOBROWNOUT
#use delay(clock=4000000)

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#bit enter = 6.1
#bit arriba = 8.6
#bit abajo = 8.7

#include <LCD4x20.C>

#use fast_io(B)
#use fast_io(D)

void vDibujaPuntero(int puntero);
void OpcionSelect(int puntero);
void testeo(void);

int puntero = 0;
#zero_ram
void main()
{
   //int puntero = 0;
   set_tris_b(0x03);
   set_tris_d(0xC0);
   lcd_init();
   
   while(true)
   {
      lcd_putc("\f");
      lcd_putc(" Este es una");
      lcd_gotoxy(1,2);
      lcd_putc("prueva del menu");
      lcd_gotoxy(1,3);
      lcd_putc("espero salga");
      lcd_gotoxy(1,4);
      lcd_putc("bien....!");
      if (enter == 1)
      {
         lcd_putc("\f");
         lcd_gotoxy(1,2);
         lcd_putc("SELECCIONE");
         lcd_gotoxy(1,3);
         lcd_putc("PLANTACION");
         delay_ms(2000);
         //lcd_putc("\f");
         testeo();
      }
      delay_ms(300);
   }
   //delay_ms(300);
}

void testeo()
{
   puntero = 1;
   vDibujaPuntero(puntero);
   while (true)
   {
      if (abajo == 1)
      {
         delay_ms(300);
         puntero++;
         if (puntero == 5)
         {
            puntero = 1;
         }
         vDibujaPuntero(puntero);
      }
      if (arriba == 1)
      {
         delay_ms(300);
         puntero--;
         if (puntero == 0)
         {
            puntero = 4;
         }
         vDibujaPuntero(puntero);
      }
      if (enter == 1)
      {
         OpcionSelect(puntero);
      }
   }
}

void vDibujaPuntero (int puntero)
{
   lcd_putc("\f");
   lcd_gotoxy(3,1);
   lcd_putc("1 opcion uno");
   lcd_gotoxy(3,2);
   lcd_putc("2 opcion dos");
   lcd_gotoxy(3,3);
   lcd_putc("3 opcion tres");
   lcd_gotoxy(3,4);
   lcd_putc("4 opcion cuatro");
   lcd_gotoxy(1,puntero);
   lcd_putc("->");
}

void OpcionSelect(int puntero)
{
   switch(puntero)
   {
      case 1:lcd_putc("\f");
             lcd_putc("opcion 1");
             lcd_gotoxy(1,2);
             lcd_putc("seleccionada");
             delay_ms(300);
             break;
      case 2:lcd_putc("\f");
             lcd_putc("opcion 2");
             lcd_gotoxy(1,2);
             lcd_putc("seleccionada");
             delay_ms(300);
             break;
      case 3:lcd_putc("\f");
             lcd_putc("opcion 3");
             lcd_gotoxy(1,2);
             lcd_putc("seleccionada");
             delay_ms(300);
             break;
      case 4:lcd_putc("\f");
             lcd_putc("opcion 4");
             lcd_gotoxy(1,2);
             lcd_putc("seleccionada");
             delay_ms(300);
             break;
   }
}


tambien pongo los archivos de proteus y la libreria del lcd 4x20

Saludos y muchas gracias.

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Ayuda, realizar menu en CCS
« Respuesta #36 en: 28 de Septiembre de 2010, 19:46:22 »
Hola Lord_Duran,

El problema que tienes con el pulsador en RB1 es por tu librería del LCD, ya que ésta configura el TRISB a salidas, por más que hayas declarado bien tu TRIS al principio, cada vez que uses tu LCD se configura todo el puerto B como salida. La solución, puede ser que quites los tris de la librería, o busques otra librería si es que borrando los tris no funcione, o edites tu librería para que funcione adecuadamente.

Tu menu se queda colgado en tu función testeo:
void testeo(){
   puntero = 1;
   vDibujaPuntero(puntero);
   while (true){
      if (abajo == 1){
         delay_ms(300);
         puntero++;
         if (puntero == 5){
            puntero = 1;
         }
         vDibujaPuntero(puntero);
      }
      if (arriba == 1){
         delay_ms(300);
         puntero--;
         if (puntero == 0){
            puntero = 4;
         }
         vDibujaPuntero(puntero);
      }
      if (enter == 1){
         OpcionSelect(puntero);
      }
   }
}
Por eso no sale al programa principal, la solución quita el while(true) colocando una condición para que salga de este ciclo infinito. También podrías usar un if, preguntando por una condición que haga que salga:

while(true){
   ...
   ...
   if(condicion)
      break;
}

Espero que tengas buenos resultados, saludos.
.


 

anything