Error de display en mikroc

Buen dia a todos!!

Tengo un pequeño problema en mi programa, bueno es el siguiete:

Consiste en una serie de menus y sub menus que se van presentando dependiendo de la seleccion de teclas en un keyboard, el problema es que cuando trabajo hasta cierta ramificacion del menu solo me aparacen algunas no opciones (no todas las esperadas lo que he visto que es si le quitas la funcion nivel todo funciona bien pero incluyendola en el programa vienen lo problemas. Les pido por favor revisen mi programa y si encuentran el error u otros mas se los agradeceria mucho, pues aun soy novato en esto de la programacion de pic en MIKROC


este es mi programa:

Código:
  // Lcd pinout settings
sbit LCD_RS at RC4_bit;
sbit LCD_EN at RC5_bit;
sbit LCD_D7 at RC3_bit;
sbit LCD_D6 at RC2_bit;
sbit LCD_D5 at RC1_bit;
sbit LCD_D4 at RC0_bit;

// Pin direction
sbit LCD_RS_Direction at TRISC4_bit;
sbit LCD_EN_Direction at TRISC5_bit;
sbit LCD_D7_Direction at TRISC3_bit;
sbit LCD_D6_Direction at TRISC2_bit;
sbit LCD_D5_Direction at TRISC1_bit;
sbit LCD_D4_Direction at TRISC0_bit;

unsigned int temp_amb = 0;
float        temp_amb2;
unsigned int short columna = 0;
unsigned int short columna1 = 0;
char voltageTxt[15];
void menu();
void temperatura();
void nivel();
void inicio();


void main()
{

 TRISA  = 0X01;                         // Configuracion como entrada RA0 (como analogica)
 PORTA  = 0X00;                         // Apagado de puerto A
 TRISB  = 0X0F;                         // Entradas RB0-RB3 y Salidas RB4-RB7
 PORTB  = 0X00;                         // Apagado del puerto B
 TRISC  = 0X00;                         // Puerto C como salida para LCD
 PORTC  = 0X00;                         // Apagado de puerto C
 WPUB   = 0X00;                         // Actvado de pull-ups puerto B
 ANSEL  = 0X01;                         // Activacion del canal AN0
 ANSELH = 0X00;



  lcd_init();                                // Inicio de LCD
   lcd_out_cp("SISTEMA MONITOREO");          // Mostrar en pantalla
   lcd_out(2,1,"DE GAS Y AGUA");             // idem
   delay_ms(1000);
   columna=0x00;
   inicio();
}
  
 void inicio()
 {                   
    while(1)
   { 
                                          // Demora 3 segundos
    lcd_Cmd(_LCD_CLEAR);                      // Apagado de LCD
    lcd_Cmd(_LCD_CURSOR_OFF);
    lcd_out_cp("TEMPERATURA=");               // Mostrar en pantalla
    lcd_out(2,1,"MENU=ON/C");                 // idem


     while(1)                                                // Bucle infinito
     { 
        if(columna==0X7D)
         {
          columna=0x00;
          break;
         }
         if(columna1==0X7E)
         {
          columna1=0x00;
          columna=0x7E;
          menu();
          break;
         }

       temp_amb = ADC_read(0);                 // Toma de valor en AN0
       temp_amb2 =((Temp_Amb-305.5)*(55.0)/(113.0))-(55.0); // Calculo de valor digital
       FloatToStr(temp_amb2,voltageTxt);                    // Convert voltage to string
       voltageTxt[10] = 0;
       lcd_out(1,14,voltageTxt);
       PORTB = 0XEF;
       delay_ms(50);
       PORTB = 0XDF;
       delay_ms(50);
       PORTB = 0XBF;
       delay_ms(50);
       PORTB = 0X7F;
       delay_ms(50);
       
          if (Button(&PORTB,0,1,0))
             columna = PORTB;
              if (columna == 0x7E)
              {
               menu();
              }

     }
   }
}


void menu()
{
  while(1)
   {
     if(columna==0X7D)
       {
         break;
       }
    lcd_Cmd(_LCD_CLEAR);
    lcd_out_CP("1=TEMPERATURA");          // Mostrar en pantalla
    lcd_out(1,15,"0=ATRAS");             // idem
    lcd_out(2,1,"2=NIVEL AGUA");


     do
      {
         PORTB = 0XBF;
         delay_ms(50);
            if (Button(&PORTB,0,1,0) | Button(&PORTB,1,1,0) | Button(&PORTB,2,1,0) | Button(&PORTB,3,1,0))

                 columna = PORTB;

                   switch (columna)
                    {
                     case 0XBE:
                     temperatura();
                     break;

                     case 0XBD:
                     nivel();
                     break;
                    }


         PORTB = 0X7F;
         delay_ms(50);

            if (Button(&PORTB,0,1,0) | Button(&PORTB,1,1,0) | Button(&PORTB,2,1,0) | Button(&PORTB,3,1,0))

                 columna = PORTB;

                    switch (columna)
                     {
                      case 0X7D:
                      break;

                     }


        }
         while(columna==0X7E);
    }
}


void temperatura()
{
  while(1)
  {
     if(columna1==0X7E)
       {

         break;
       }
   lcd_Cmd(_LCD_CLEAR);
   lcd_out_cp("1=TEMP. PROGRAMADA");          // Mostrar en pantalla
   lcd_out(2,1,"0=ATRAS");                   // idem

  do
   {
      PORTB = 0XBF;
      delay_ms(50);
        if (Button(&PORTB,0,1,0) | Button(&PORTB,1,1,0) | Button(&PORTB,2,1,0) | Button(&PORTB,3,1,0))

                 columna = PORTB;

                   switch (columna)
                    {
                     case 0XBE:
                     PORTA = 0X7E;

                    }
                    
         PORTB = 0X7F;
         delay_ms(50);
         if (Button(&PORTB,0,1,0) | Button(&PORTB,1,1,0) | Button(&PORTB,2,1,0) | Button(&PORTB,3,1,0))

                 columna = PORTB;
                 
                   switch(columna)
                    {
                     case 0X7D:
                     columna1=0x7E;
                     Lcd_Cmd(_LCD_CLEAR);
                     
                     break;

                    }
    } while(columna==0XBE);
  }

}

void nivel()
{
  while(1)
  {
   lcd_Cmd(_LCD_CLEAR);
      lcd_out_cp("1=NVL. CISTERNA");          // Mostrar en pantalla
      lcd_out(2,1,"2=NVL TINACO");
      lcd_out(2,14,"0=ATRAS");                 // idem
  
  
  
  }




}


Gracias y saludos a todos ...



tambien les dejo el archivo en proteus y el .hex
 

Adjuntos

  • INTERRUPCIONES.rar
    19.4 KB · Visitas: 3
  • PANEL PRINCIPAL.rar
    4.9 KB · Visitas: 3
Última edición:
Atrás
Arriba