Autor Tema: Inicialización de menú con * y # de teclado matricial  (Leído 1599 veces)

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

Desconectado Kurt Cobain

  • PIC10
  • *
  • Mensajes: 29
Inicialización de menú con * y # de teclado matricial
« en: 01 de Abril de 2017, 20:00:35 »
Buenos días. Acabo de iniciar mi materia de programación de los microcontroladores y realizando una práctica con el 877a referida a una cerradura electrónica con un teclado matricial 4x4, la cual explico a continuación:

Tengo de inicio un menú en una LCD, que me dice si quiero ingresar clave o cambiar clave. Este menú lo manipulo con 2 pulsadores en rb0 y rb1. Al entregar la práctica el profesor me dijo que ese menú no se debe controlar con esos dos pulsadores, sino con la tecla * y # del teclado. Ya traté de poner en los if que cuando mi variable donde guardo los caracteres se igual a * o # y haga lo mismo que si yo presionara en los pines rb0 y rb1 pero no estoy teniendo éxito. Entonces si alguien sabe algo al respecto agradeceré cualquier información.

Adjunto mi código.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Inicialización de menú con * y # de teclado matricial
« Respuesta #1 en: 01 de Abril de 2017, 21:54:47 »
Bueno, demasiado while y rebuscado para mi gusto. Los pines que decis son A0 y A1 por lo que veo.

Lo unico que tenes que hacer es leer el teclado de vuelta y fijarte si esta presionado ese boton.. En ves de hacer:

Código: C
  1. if(input(PIN_A0)==0)
  2.           {
  3.  
  4.           }
  5.           if(input(PIN_A1)==0)
  6.           {
  7.  
  8.           }

Haces:

Código: C
  1. teclapresionada = kbd_getc();
  2.           if(teclapresionada == '*')
  3.           {
  4.  
  5.           }
  6.           if(teclapresionada == '#')
  7.           {
  8.                
  9.           }

Desconectado Kurt Cobain

  • PIC10
  • *
  • Mensajes: 29
Re:Inicialización de menú con * y # de teclado matricial
« Respuesta #2 en: 02 de Abril de 2017, 17:27:25 »
Gracias por tu atención a este tema, KILLERJC.

Ya lo modifiqué y sigue sin dar resultados. Extrañamente sólo funciono una vez, estaba presionando # muchas veces y me salió la opción para elegir pero ya después no hizo nada.

No supe otra manera para delimitar las veces en las que se ingresa una tecla más que con while, voy aprendiendo todo esto (y pues el profesor no es muy bueno explicando jajaja)

Te adjunto de nuevo el .c, la simulación y la librería del kbd

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Inicialización de menú con * y # de teclado matricial
« Respuesta #3 en: 02 de Abril de 2017, 20:10:39 »
Proba ahora, aunque hay cosas que seguramente sean errores en tu programa.

Código: C
  1. #include <16F877A.h> //Incluye la libreria del PIC
  2. #fuses XT
  3. #use delay(clock=4M) //Define la frecuencia con que se trabajara
  4. #byte PORTB = 0x06
  5.  
  6. #define LCD_ENABLE_PIN  PIN_C5
  7. #define LCD_RS_PIN  PIN_C6
  8. #define LCD_RW_PIN  PIN_C7
  9. #define LCD_DATA4_PIN  PIN_D4
  10. #define LCD_DATA5_PIN  PIN_D5
  11. #define LCD_DATA6_PIN  PIN_D6
  12. #define LCD_DATA7_PIN  PIN_D7
  13.  
  14. #define use_portb_kbd TRUE //Sentencia para poder conectar el teclado al puerto B
  15.  
  16. #include <lcd.c> // incluye libreia del lcd
  17. #include <KBD2.c> //incluye libreria del teclado modificada
  18. #rom 0x2100={'1','9','9','4','A'} //contraseña guardada en memoria
  19.  
  20.  
  21. void main(void)
  22. {
  23.    int teclapresionada;
  24.    int item; //declaramos item
  25.    int n; // declarmos n
  26.    char k;
  27.    int i; //Inicializamos i
  28.    char data[5], clave[5]; //Espacio de memoria
  29.    lcd_init(); //inicializamos lcd
  30.    kbd_init(); //inicializamos el teclado
  31.    port_b_pullups(TRUE); //habilitamos resistencias de pullups
  32.    
  33.    while(true) //ciclo infinito
  34.    {
  35.       teclapresionada = kbd_getc();
  36.       if(teclapresionada == '#') //Si en el Pin AO hay un cero logico debido a que se pulse el boton opciones
  37.       {
  38.          item++; //Incrementar item
  39.          delay_ms(300);
  40.       }
  41.       switch(item)
  42.       {
  43.          case 0:  //si item es igual a cero
  44.           lcd_gotoxy(1,1);
  45.           lcd_putc("Elija una opcion y"); // Imprime este mensaje
  46.           lcd_gotoxy(1,2);
  47.           lcd_putc("presione enter");     //Imprime este mensaje
  48.           break;
  49.  
  50.         case 1:  // si item igual a 1
  51.          lcd_gotoxy(1,1);
  52.          lcd_putc("Opcion 1        "); //imprime este mensaje
  53.          lcd_gotoxy(1,2);
  54.          lcd_putc("Ingresar Contra"); //Imprime este mensaje
  55.          
  56.          teclapresionada = kbd_getc();
  57.          if(teclapresionada == '*')  //Si en el Pin A1 hay un cero logico debido a que se pulse el boton enter
  58.        {
  59.          lcd_putc("\f");  //Limpia la pantalla LCD
  60.          i=0;              // i igual a cero
  61.          lcd_putc("Ingresar clave");  //Imprime este mensaje
  62.          while(i<=4)  //siempre que i sea menor o igual a 4
  63.            {
  64.             k=kbd_getc(); //Se obtiene el valor de la tecla pulsada
  65.              if (k!=0)  //Si ka es diferente de nulo
  66.                {
  67.                 data[i]=k; //Guarda el valor de la tecla pulsada en un
  68.                            //Espacio de memoria
  69.                 i++;       //Incrementa i      
  70.                 lcd_gotoxy(i,2);
  71.                 lcd_putc('*'); //se imprime * en representacion de un caracter
  72.                }
  73.            }
  74.          for (i=0;i<=4;i++) //Ciclo para guardar la clave en moria en una nueva variable
  75.          {
  76.           clave[i]=read_eeprom(i);//Lee la clave guardada en memoria y la guarda en una nueva variable
  77.                                   //Para luego comprobarla con la clave ingresada por el usuario
  78.          }
  79.         if ((data[0]==clave[0])&&(data[1]==clave[1])&&(data[2]==clave[2])&&(data[3]==clave[3])&&(data[4]==clave[4])) //comparacion de la clave ingresada
  80.                                                                                                 //Con la clave guardada en memoria
  81.          {
  82.          printf(lcd_putc,"\fPuerta Abierta"); //Si las claves son iguales se imprime este mensaje
  83.          output_high(PIN_A3);                 //Si las claves son iguales el PIN A3 se pone en alto
  84.          delay_ms(1000);                      // Espera 1 segundo
  85.          output_low(PIN_A3);                  //El PIN A3 se pone en bajo
  86.          }
  87.          else printf(lcd_putc,"\fPuerta Cerrada"); //Si las claves no son iguales se imprime este mensaje
  88.          delay_ms(1000);                        //Espera 1 segundo
  89.          item=0;                //item se iguala a cero con el fin de que se devuelva al primer caso de item
  90.          break;
  91.          }
  92.          break;
  93.          
  94.         case 2:  //Si item igua a2
  95.          lcd_gotoxy(1,1);
  96.          lcd_putc("Opcion 2          "); //Imprime este mensaje
  97.          lcd_gotoxy(1,2);
  98.          lcd_putc("Cambiar Contra"); //Imprime este mensaje
  99.          
  100.           teclapresionada = kbd_getc();
  101.           if(teclapresionada == '#') //Si en el Pin A1 hay un cero logico debido a que se pulse el boton enter
  102.          {
  103.          lcd_putc("\f"); //Limpia pantalla lcd
  104.          i=0; //Se iguala i a cer
  105.          lcd_putc("Ingrese clave"); //Imprime este mensaje
  106.          while(i<=4) //Condicion de que siempre que i sea menor o igual a 3
  107.            {
  108.             k=kbd_getc(); //Se obtiene el valor de la tecla pulsada
  109.              if (k!=0) //si k esta vacio
  110.                {
  111.                 data[i]=k; //Guarda el valor de la tecla pulsada en la variable data
  112.                 i++; //se incrementa item
  113.                 lcd_gotoxy(i,2);
  114.                 lcd_putc('*'); //se imprime * en representacion de un caracter
  115.                }
  116.            }
  117.          for (i=0;i<=4;i++)
  118.          {
  119.           clave[i]=read_eeprom(i);//Lee la clave guardada en memoria y la guarda en una nueva variable
  120.                                   //Para luego compararla con la clave ingresada por el usuario
  121.          }
  122.         if ((data[0]==clave[0])&&(data[1]==clave[1])&&(data[2]==clave[2])&&(data[3]==clave[3])&&(data[4]==clave[4]))//comparacion de la clave ingresada
  123.                                                                                                 //Con la clave guardada en memoria
  124.          {
  125.          printf(lcd_putc,"\fClave nueva"); //Si las claves son iguales se imprime este mensaje
  126.             while(n<=0) //Siempre que n sea menor o igual a 0
  127.             {
  128.                k=kbd_getc(); //Se obtiene el valor de la tecla presionada
  129.                if (k!=0) //Si k esta vacio
  130.                {  
  131.                   data[n]=k;     //Guarda el valor de la tecla en la variable data o
  132.                   write_eeprom(0x2100,k); //Se escibe el valor de la tecla en el primer espacio de memoria        
  133.                   n++;           //se incrementa n
  134.                   lcd_gotoxy(n,2);
  135.                   lcd_putc('*'); //Se imprime * en representacion de un caracter
  136.                   delay_ms(20);
  137.                }
  138.             }
  139.             while(n<=1) //Siempre que n sea menor o igual a 1
  140.             {
  141.                k=kbd_getc();//Se obtiene el valor de la tecla presionada
  142.                if (k!=0) //Si k esta vacio
  143.                {
  144.                   data[n]=k;     //Guarda el valor de la tecla en la variable data 1
  145.                   write_eeprom(0x2101,k);//Se escibe el valor de la tecla en el segundo espacio de memoria
  146.                   n++;              //se incrementa n
  147.                   lcd_gotoxy(n,2);
  148.                   lcd_putc('*');    //Se imprime * en representacion de un caracter
  149.                   delay_ms(20);        
  150.                }
  151.             }
  152.             while(n<=2) //Siempre que n sea menor o igual a 2
  153.             {
  154.                k=kbd_getc(); //Se obtiene el valor de la tecla presionada
  155.                if (k!=0) //Si k esta vacio
  156.                {
  157.                   data[n]=k;     //Guarda el valor de la tecla en la variable data 2
  158.                   write_eeprom(0x2102,k);//Se escibe el valor de la tecla en el tercer espacio de memoria
  159.                   n++;              //se incrementa n
  160.                   lcd_gotoxy(n,2);
  161.                   lcd_putc('*');   //Se imprime * en representacion de un caracter
  162.                   delay_ms(20);        
  163.                }
  164.             }
  165.             while(n<=3) //Siempre que n sea menor o igual a 3
  166.             {
  167.                k=kbd_getc();  //Se obtiene el valor de la tecla presionada
  168.                if (k!=0) //Si k esta vacio
  169.                {  
  170.                   data[n]=k;     //Guarda el valor de la tecla en la variable data 3
  171.                   write_eeprom(0x2103,k);//Se escibe el valor de la tecla en el tercer espacio de memoria
  172.                   n++;              //se incrementa n
  173.                   lcd_gotoxy(n,2);
  174.                   lcd_putc('*');    //Se imprime * en representacion de un caracter
  175.                   delay_ms(20);  
  176.                }
  177.             }
  178.             while(n<=4)
  179.             {
  180.                k=kbd_getc(); //Se obtiene el valor de la tecla presionada
  181.                if (k!=0) //Si k esta vacio
  182.                {  
  183.                   data[n]=k;     //Guarda el valor de la tecla en la variable data o
  184.                   write_eeprom(0x2100,k); //Se escibe el valor de la tecla en el primer espacio de memoria        
  185.                   n++;           //se incrementa n
  186.                   lcd_gotoxy(n,2);
  187.                   lcd_putc('*'); //Se imprime * en representacion de un caracter
  188.                   delay_ms(20);
  189.                }
  190.             }
  191.             printf(lcd_putc,"\fClave cambiada");//Cuando se introduce la clave nueva imprime este mensaje
  192.          }
  193.          else printf(lcd_putc,"\fClave incorrecta"); //Si las claves no son iguales se imprime este mensaje
  194.          delay_ms(1000); //Espera 1 segundo
  195.          item=0;                 //item se iguala a cero con el fin de que se devuelva al primer caso de item
  196.          break;
  197.          }
  198.          break;
  199.  
  200.          default: //Caso por defecto
  201.          item = 0; //Devuelve al primer caso de item
  202.          break;
  203.       }
  204.    }  
  205. }

Desconectado Kurt Cobain

  • PIC10
  • *
  • Mensajes: 29
Re:Inicialización de menú con * y # de teclado matricial
« Respuesta #4 en: 03 de Abril de 2017, 01:41:02 »
Ya lo simulé y  pues solo funciona la tecla * pero no todo el tiempo.

Voy a seguir intentando modificando el código


 

anything