Autor Tema: Scroll Menu en display LCD 2X16 con teclado matricial 4x4  (Leído 1456 veces)

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

Desconectado catatbcd

  • PIC10
  • *
  • Mensajes: 2
Scroll Menu en display LCD 2X16 con teclado matricial 4x4
« en: 29 de Enero de 2020, 20:07:36 »
Hola a todos, ¿como están?. Soy nueva en este foro, estoy intentando hacer un menú para un temporizador con el PIC 16f877a, LCD y teclado, en PIC C. Les agradecería si pueden ayudarme.

Ya plantee el funcionamiento general del programa.

Son 5 vistas: el saludo inicial (Scroll Menu), el menú principal,  rutinas, configuración y conteo.
se usan 5 botones:

  • D abre menú.
  • B y C desplaza el menú arriba y abajo respectivamente.
  • A para acceder al siguiente menú o dar aceptar.
  • # para retroceder.
Este es el teclado que estoy usando.


De entrada parece funcionar pero después de acceder un par de veces empieza a fallar y me manda a la vista que no es, la función atrás no sirve.

Código: [Seleccionar]
#include <16f877A.H> //PIC 16F877A
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //Crystal osc <= 4mhz
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#use delay(clock=20000000) // Oscilador de 20MHz
#include <lcd.c> // Driver para LCD
#DEFINE USE_PORTB_KBD //Teclado conectado al puerto B
#include <KBD4x4.c> // Driver para teclado
//#DEFINE KEYHIT_DELAY 200 //Tiempo(ms) de espera del teclado
#BYTE PORTB =0X06
#BYTE PORTC =0X07
char key=0;
int valor_key,a=0,a0=0,b0=0,b1=0, b2=0, max,min, Nivelmenu=0;
short   Conteo;
int Desplazar (max,min){
            if (valor_key==19){//Letra C abajo
         
         if (a>=max){
            a=0;
         }else {
          a++;
       }
            }
         else if (valor_key==18){//Letra B arriba
               
            if (a<=min){
            a=1;
            }
            else{
            a--;
            }
            }
   return a;
}
void Inicial(){
     NivelMenu=0;
   lcd_gotoxy(1,1);
   Printf(lcd_putc,"\fScroll Menu");
   
}
void Rutinas(){
   NivelMenu=2;
   lcd_gotoxy(7,1);
   printf(lcd_putc,"\fRUTINAS");
   lcd_gotoxy(1,2);
   printf(lcd_putc,"*Rutina 1");
 
   if (valor_key==17){//Letra A aceptar
      NivelMenu=0;
      valor_key=0;         
     lcd_gotoxy(1,1);
      printf(lcd_putc,"\fRutina 1");
      delay_ms(1000);

      Inicial();
   }
 
}
void Menu(){
   NivelMenu=1;
   
   lcd_gotoxy(7,1);
   printf(lcd_putc,"\fMENU");
   lcd_gotoxy(1,2);
   printf(lcd_putc,"*Rutinas");
   if (valor_key==17){//Letra A aceptar
      NivelMenu=2;
      valor_key=0;         
        b0=0;
     
      Rutinas();
        }
   
}
void Conteos(){
   NivelMenu=4;
   
   lcd_gotoxy(7,1);
   printf(lcd_putc,"\fCONTEO");
   lcd_gotoxy(1,2);
   printf(lcd_putc,"*Ascendente");
   if (valor_key==17){//Letra A aceptar
      NivelMenu=0;
     valor_key=0;         
     Conteo=1;
      lcd_gotoxy(7,1);
      printf(lcd_putc,"\f %i",Conteo);
      delay_ms(1000);
     
      Inicial();
   }
 
}
void Configuracion(){
   NivelMenu=3;
   lcd_gotoxy(7,1);
   printf(lcd_putc,"\fCONFIGURACION %i",NivelMenu);
   lcd_gotoxy(1,2);
   printf(lcd_putc,"*Conteo");
   if (valor_key==17){//Letra A aceptar
   b2=0;
   NivelMenu=4;
   valor_key=0;
   Conteos();
   }
   
}

   
void Volumen() {
   NivelMenu=0;
   lcd_gotoxy(7,1);
      printf(lcd_putc,"\fVolumen %i",NivelMenu);
         lcd_gotoxy(1,2);
         printf(lcd_putc,"%i",b1);
       delay_ms(1000);
       
               Inicial();
   
}
void main(){
   port_b_pullups (1);
   lcd_init();
   kbd_init();
   NivelMenu=0;
   while (true){
        key = kbd_getc();
      if (key!=0){
         valor_key = key-48; // convertir de ascii a entero
         switch ( NivelMenu ) {
         case 0: //MENU INICIAL
         
            if (valor_key == 20) { //Letra D Menu
            valor_key=0;           
            a0=0;
            Menu();           
               }else
               Inicial();
               
                 
           
         break;
         case 1:
         
            if (valor_key==-13){//simbolo # atras
         
               Inicial();
            }
            a0=Desplazar(1,0);
                       
            switch ( a0 ) {
               case 0:

               Menu();
               break;
               case 1:
         
               lcd_gotoxy(7,1);
               printf(lcd_putc,"\fRutinas");
               lcd_gotoxy(1,2);
               printf(lcd_putc,"*Configuracion");
               if (valor_key==17){//Letra A aceptar
          valor_key=0;         
               b1=0;
            valor_key=0;
               Configuracion();
               }
               break;
            }
         break;
         case 2:
         
            if (valor_key==-13){//simbolo D atras
         
            a0=0;
               Menu();
               }
            b0=Desplazar(1,0);
            switch ( b0 ) {
            case 0:
            Rutinas();
            break;
            case 1:
            lcd_gotoxy(7,1);
            printf(lcd_putc,"\fRutina 1");
            lcd_gotoxy(1,2);
            printf(lcd_putc,"*Rutina 2");
            if (valor_key==17){//Letra A aceptar
               valor_key=0;         
               lcd_gotoxy(1,1);
               printf(lcd_putc,"\fRutina 2");
               delay_ms(1000);
               Inicial();
            }
            break;
            }
         break;
         case 3:
            if (valor_key==-13){//simbolo # atras
         
            a0=0;
            Menu();
            }
            b1=Desplazar(1,0);
            switch ( b1 ) {
            case 0:
         
            Configuracion();
            break;
            case 1:
            lcd_gotoxy(7,1);
            printf(lcd_putc,"\fConteo");
            lcd_gotoxy(1,2);
            printf(lcd_putc,"*Volumen");
            if (valor_key==17){//Letra A aceptar
            valor_key=0;         
            Volumen();
            }
            break;
            }
         break;
         case 4:
            if (valor_key==-13){//simbolo D atras
         
           b1=0;
               Configuracion();
            }
            b2=Desplazar(1,0);
            switch ( b2 ) {
            case 0:
                     Conteos();
            break;
            case 1:
            lcd_gotoxy(7,1);
            printf(lcd_putc,"\fAscendente %i",NivelMenu);
            lcd_gotoxy(1,2);
            printf(lcd_putc,"*Desendente");
            if (valor_key==17){//Letra A aceptar
               valor_key=0;         
               Conteo=0;
               lcd_gotoxy(7,1);
               printf(lcd_putc,"\f %i",Conteo);
               delay_ms(1000);
               Inicial();
            }
            break;
            }
            break;
         }
        }
   }
}


Ya he revisado el código y no doy con el o los errores, no tengo mucha experiencia con micro controladores, si alguien es tan amable de asesorarme estaré muy agradecida.

Nota: hay que presionar cualquier tecla para que muestre el saludo inicial.

Desconectado catatbcd

  • PIC10
  • *
  • Mensajes: 2
Re:Scroll Menu en display LCD 2X16 con teclado matricial 4x4
« Respuesta #1 en: 17 de Marzo de 2020, 01:39:46 »
Hola, así quedo el código funcionando por si a alguien le sirve, había un conflicto con la función de subir y bajar.


Código: [Seleccionar]
#include <16f877A.H> //PIC 16F877A
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //Crystal osc <= 4mhz
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#use delay(clock=20000000) // Oscilador de 20MHz
#include <lcd.c> // Driver para LCD
#DEFINE USE_PORTB_KBD //Teclado conectado al puerto B
#include <KBD4x4.c> // Driver para teclado
//#DEFINE KEYHIT_DELAY 200 //Tiempo(ms) de espera del teclado
#BYTE PORTB =0X06
#BYTE PORTC =0X07
char key=0;
int valor_key,a0=0,b0=0,b1=0, b2=0,Nivelmenu=0;
short   Conteo;

void Inicial(){//  NivelMenu==0
NivelMenu=0;
   lcd_gotoxy(1,1);
   Printf(lcd_putc,"\fScroll Menu NM:%i",NivelMenu);
       
}
void Rutinas(){ //NivelMenu=2
   NivelMenu=2;
 
   if (valor_key==20){//Letra D aceptar
     valor_key =0;
     lcd_gotoxy(1,1);
     printf(lcd_putc,"\fRutina 1 NM:%i",NivelMenu);
     delay_ms(1000);
   NivelMenu=6;
    Inicial();
   }else{lcd_gotoxy(7,1);
   printf(lcd_putc,"\fRUTINAS NM:%i",NivelMenu);
   
   lcd_gotoxy(1,2);
   printf(lcd_putc,"*Rutina 1");
     }
 }

void Menu(){ //NivelMenu==1
  NivelMenu=1;
   if (valor_key==20){//Letra D aceptar
      NivelMenu=2;
     valor_key =0;
      Rutinas();
        }else{
          lcd_gotoxy(7,1);
   printf(lcd_putc,"\fMENU NM:%i",NivelMenu);
   lcd_gotoxy(1,2);
   printf(lcd_putc,"*Rutinas");
     
      }
   

   }
void Conteos(){ //NivelMenu==4
   NivelMenu=4;
   if (valor_key==20){//Letra D aceptar
      NivelMenu=0;
         
         valor_key =0;
     Conteo=1;
      lcd_gotoxy(7,1);
      printf(lcd_putc,"\f %i NM:%i", Conteo,NivelMenu);
      delay_ms(1000);
     
      Inicial();
   }else{
       lcd_gotoxy(7,1);
   printf(lcd_putc,"\fCONTEO NM:%i",NivelMenu);
   lcd_gotoxy(1,2);
   printf(lcd_putc,"*Ascendente");
        }
 
}
void Configuracion(){ //NivelMenu==3
NivelMenu=3;
   if (valor_key==20){//Letra D aceptar
   valor_key =0;
   Conteos();
   }else{
        lcd_gotoxy(7,1);
   printf(lcd_putc,"\fCONFIGURA NM:%i",NivelMenu);
   lcd_gotoxy(1,2);
   printf(lcd_putc,"*Conteo");
       }
   
}

   
void Volumen() {
    lcd_gotoxy(7,1);
      printf(lcd_putc,"\fVolumen  NM:%i",NivelMenu);
         lcd_gotoxy(1,2);
         printf(lcd_putc,"%i",b1);
       delay_ms(1000);
       NivelMenu=0;
   Inicial();   
}
void main(){
   port_b_pullups (1);
   lcd_init();
   kbd_init();
   NivelMenu=0;
   while (true){
        key = kbd_getc();
      if (key!=0){
         valor_key = key-48; // convertir de ascii a entero
         if ( NivelMenu==0 ) { //MENU INICIAL
         
            if (valor_key == 20) { //Letra D Menu
         
         valor_key =0;
         Menu();           
               }else{
             
               inicial();}
                 
           
       }else  if ( NivelMenu==1 ) {
         
         
            if (valor_key==19){//Letra C abajo
         
         if (a0>=1){
            a0=0;
         }else {
          a0++;
       }  }  else if (valor_key==18){//Letra B arriba
               
            if (a0<=0){
            a0=1;
            }
            else{
            a0--;
            }
            }           
            if(a0==0){
if (valor_key==-13){//simbolo # atras
         
        valor_key =0;
          Inicial();
            }else {
               
Menu();}}
            else if(a0==1){
               if (valor_key==-13){//simbolo # atras
         
        valor_key =0;
          Inicial();
            }else{
         
               if (valor_key==20){//Letra D aceptar
                       a0=0;
         valor_key =0;
               Configuracion();
               }else {
               
               lcd_gotoxy(7,1);
               printf(lcd_putc,"\fRutinas");
               lcd_gotoxy(1,2);
               printf(lcd_putc,"*Configuracion");
            }}
               
            }
         }else  if ( NivelMenu==2 ) {//Menu principal
         
          if (valor_key==19){//Letra C abajo
         
         if (b0>=1){
            b0=0;
         }else {
          b0++;
       }  }  else if (valor_key==18){//Letra B arriba
               
            if (b0<=0){
            b0=1;
            }
            else{
            b0--;
            }
            }   
            if( b0==0 ) {
              if (valor_key==-13){//simbolo # atras
                     
         valor_key =0;
               Menu();
               }else{
   Rutinas();}
            }
else if(b0==1){
              if (valor_key==-13){//simbolo # atras
                     
         valor_key =0;
               Menu();
               }else{
            if (valor_key==20){//Letra D aceptar
              b0=0;
           
         valor_key =0;
               lcd_gotoxy(1,1);
               printf(lcd_putc,"\fRutina 2");
              delay_ms(1000);
           NivelMenu=7;
               Inicial();
            }else{lcd_gotoxy(7,1);
            printf(lcd_putc,"\fRutina 1");
            lcd_gotoxy(1,2);
            printf(lcd_putc,"*Rutina 2");}
           
}}
         }else  if ( NivelMenu==3 ) {
         //Configuracion
            if (valor_key==19){//Letra C abajo
         
         if (b1>=1){
            b1=0;
         }else {
          b1++;
       }  }  else if (valor_key==18){//Letra B arriba
               
            if (b1<=0){
            b1=1;
            }
            else{
            b1--;
            }
            }   
            if( b1==0 ) {if (valor_key==-13){//simbolo # atras
         
         valor_key =0;
                     Menu();
            }else{
         
         
            Configuracion();}
            }else if (b1==1){
     if (valor_key==-13){//simbolo # atras
         
         valor_key =0;
                     Menu();
            }else{
           
            if (valor_key==20){//Letra D| aceptar
            NivelMenu=5;   
                b1=0;
         valor_key =0;
            Volumen();
            }else{
             lcd_gotoxy(7,1);
            printf(lcd_putc,"\fConteo");
            lcd_gotoxy(1,2);
            printf(lcd_putc,"*Volumen");
         }
           
            }}
         }else  if ( NivelMenu==4 ) { //Conteo
           
           if (valor_key==19){//Letra C abajo
         
         if (b2>=1){
            b2=0;
         }else {
          b2++;
       }  }  else if (valor_key==18){//Letra B arriba
               
            if (b2<=0){
            b2=1;
            }
            else{
            b2--;
            }
            }   
            if ( b2==0 ) { if (valor_key==-13){//simbolo # atras
            valor_key =0;
            Configuracion();
            }else{
           
Conteos();}
            }
else if(b2== 1){
if (valor_key==-13){//simbolo # atras
            valor_key =0;
            Configuracion();
            }else{
           
            if (valor_key==20){//Letra D aceptar
         b2=0;
         valor_key =0;
         
               Conteo=0;
               lcd_gotoxy(7,1);
               printf(lcd_putc,"\f %i",Conteo);
               delay_ms(1000);
               Inicial();
            }else{ lcd_gotoxy(7,1);
            printf(lcd_putc,"\fAscendente %i",NivelMenu);
            lcd_gotoxy(1,2);
            printf(lcd_putc,"*Desendente");}
           
            }
}}
         }
        }
   }