Autor Tema: [16f876A] Botoneras  (Leído 2651 veces)

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

Desconectado xelieve

  • PIC10
  • *
  • Mensajes: 23
[16f876A] Botoneras
« en: 07 de Marzo de 2016, 11:20:42 »
buenas, tengo 3 botones y quiero usarlos para configurar un menu en mi lcd, el problema que tengo es que si dejo precionado el boton ejecuta toda la secuencia y no me da tiempo para precionar otro boton, y si le pongo delay se me hace lento la programacion, si me pueden ayudar un favor.

dejo mi programación, necesariamente tiene que ser por el puerto C.

Código: [Seleccionar]
   while(1){
   
      PIN1=INPUT(PIN_C3);   
      if(j<4&&r==0&&PIN1==0){
         lcd_putc("\f  ACCEDIENDO ");
         for(i=0;i<15;i++){
            lcd_gotoxy(i,2);
            lcd_putc("*");
            delay_ms(50);
         }
         if(PIN1==0){
         lcd_putc("\f   PASSWORD  ");
         i=0;
         while(i<4){
            while(PIN1==0){
            PIN1=INPUT(PIN_C3);
            }
            while(PIN2==0){
            PIN2=INPUT(PIN_C4);
            }
            while(PIN3==0){
            PIN3=INPUT(PIN_C5);
            }
            IF(PIN1==1&&PIN2==1&&PIN3==1){
               while(PIN1==1&&PIN2==1&&PIN3==1){
                  PIN1=INPUT(PIN_C3);
                  PIN2=INPUT(PIN_C4);
                  PIN3=INPUT(PIN_C5); 
               }
               
               if(PIN1==0&&PIN2==1&&PIN3==1){
                  dato[i]='1';
                  i++;
                  lcd_gotoxy(i+3,2);
                  lcd_putc('*');
                  DELAY_MS(500);
               }
               if(PIN1==1&&PIN2==0&&PIN3==1){
                  dato[i]='3';
                  i++;
                  lcd_gotoxy(i+3,2);
                  lcd_putc('*');
                  DELAY_MS(500);
               }
               if(PIN1==1&&PIN2==1&&PIN3==0){
                  dato[i]='5';
                  i++;
                  lcd_gotoxy(i+3,2);
                  lcd_putc('*');
                  DELAY_MS(500);
               }
            }
         }
         for(i=0;i<4;i++){
            clave[i]=read_eeprom(i);
         }

         if( dato[0]==clave[0] &&  dato[1]==clave[1] && dato[2]==clave[2] && dato[3]==clave[3]){
           
            lcd_gotoxy(5,1);
            printf(lcd_putc,"\f   Accediendo ");
            for(i=0;i<15;i++){
               lcd_gotoxy(i,2);
               printf(lcd_putc,"*");
               delay_ms(50);
            }
            r=1;
         }
         else{
               lcd_putc("\f Clave incorecta ");
               j++;
               delay_ms(2000);
          }
      }
}
}

es para usar contraseña


2° tambien tengo otro problema quero mostrar valores con mi lcd y me sale borroso y paradeante

Código: [Seleccionar]
               DO{
                  SET_ADC_CHANNEL(0);
                  DELAY_US(10);
                  RADIO=READ_ADC();
                  RADIO=RADIO*2/1023.0;
                  write_eeprom(6,RADIO);
                  PRINTF(LCD_PUTC,"\f   RADIO");
                  PRINTF(LCD_PUTC,"\n  %f ",RADIO);
                  PIN1=INPUT(PIN_C3);
                  MEN=0;
                  i++;
                  r=0;}WHILE(PIN1==1);
            }

algunas ayudas por favor.
« Última modificación: 07 de Marzo de 2016, 11:26:10 por xelieve »

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re:[16f876A] Botoneras
« Respuesta #1 en: 07 de Marzo de 2016, 12:41:13 »
Hola yo lo que hago en estos casos es lo siguiente: cuando detecto que presionaron la tecla activo una bandera (1 bit), esta bandera impide volver a entrar si no han soltado la tecla, cuando sueltan la tecla se apaga la bandera habilitando nuevamente la función.

Código: C
  1. [code]void funcion()
  2. {
  3.         if(!bit_test(tecla) && !ban_tecla)
  4.         {
  5.                 ban_tecla = 1;
  6.                
  7.                 "resto de funciones"
  8.         }
  9.        
  10.         else if(bit_test(tecla) && ban_tecla)
  11.         {
  12.                 ban_tecla = 0;
  13.                
  14.                 "resto de funciones"           
  15.         }      
  16. }
[/code]

Saludos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:[16f876A] Botoneras
« Respuesta #2 en: 07 de Marzo de 2016, 13:25:30 »
Ademas de lo de DiegoE, en tu codigo hay demasiados while. Por demas. Solo un pedacito de codigo y ya hay 5:


Código: C
  1. while(i<4){
  2.             while(PIN1==0){
  3.             PIN1=INPUT(PIN_C3);
  4.             }
  5.             while(PIN2==0){
  6.             PIN2=INPUT(PIN_C4);
  7.             }
  8.             while(PIN3==0){
  9.             PIN3=INPUT(PIN_C5);
  10.             }
  11.             IF(PIN1==1&&PIN2==1&&PIN3==1){
  12.                while(PIN1==1&&PIN2==1&&PIN3==1){
  13.                   PIN1=INPUT(PIN_C3);
  14.                   PIN2=INPUT(PIN_C4);
  15.                   PIN3=INPUT(PIN_C5);  
  16.                }

Desconectado w3-sistemas

  • PIC12
  • **
  • Mensajes: 89
Re:[16f876A] Botoneras
« Respuesta #3 en: 07 de Marzo de 2016, 13:44:01 »
hola, te paso 3 archivos que yo uso en rutinas de lcd, dos de ellos son para el lcd en si uno es un .c y el otro para un .h, la otra es una rutina de timer 0.
te comento que en el timer 0 es de un proyecto de lectura dmx y hay que limpiarlo para que no te complique, pero es para que veas 4 rutinas de lectura y antirrebote de interruptores y hay que si te sirven usalos, pwm por soft, yo opino que usas como dijo otro compañero muchos while que son en muchos casos prohibitivos y alentan, despues la parte del lcd anda perfecto, esto yo lo uso con un 877 asi que calculo no vas a tener problemas, saludos

Desconectado xelieve

  • PIC10
  • *
  • Mensajes: 23
Re:[16f876A] Botoneras
« Respuesta #4 en: 07 de Marzo de 2016, 14:20:40 »
si ya que mi principal problema es eliminar todos los whiles posibles, pero tengo q ponerlos, tente con la opcion de la bandera pero no la entiendo.

Desconectado w3-sistemas

  • PIC12
  • **
  • Mensajes: 89
Re:[16f876A] Botoneras
« Respuesta #5 en: 07 de Marzo de 2016, 14:44:54 »
las banderas son interruptores, prendes o apagas algo

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:[16f876A] Botoneras
« Respuesta #6 en: 07 de Marzo de 2016, 15:12:26 »
Tu idea es hacer un sistema de acceso con password no ?. En el cual hay que presionar los botones en cierto orden?.

Siempre y cuando no sea presionar 2 botones juntos, lo que podes hacer es tomar el valor del puerto anterior, y guardarlo, luego compararlo , si cambio haces lo que tengas que hacer. Si no cambio omitis la comprobacion. Dejo un codigo como ejemplo, ni siquiera lo hice pensando en como tenes tu programa. Asi que no va a ser cuestion de copiar/pegar

Código: C
  1. while(1)
  2. {
  3.         PuertoActual = input_b();
  4.  
  5.         if( PuertoActual != PuertoAnterior && PuertoActual != 0)       // Si es distinto a la anterior vuelta del while
  6.         {                                                               // Y es disitnto de 0 ( ninguno presionado )
  7.                 //Aca guardo el valor en un array
  8.                 Ingresado[numero] = PuertoActual;
  9.                 PuertoAnterior = PuertoActual;
  10.                 ++numero;
  11.                 // Estan todos los valores ?
  12.                 if(numero == 7 )
  13.                 {
  14.                         numero = 0;
  15.                         codigo_erroneo=false;
  16.                         for(i=0;i<7;++i)
  17.                         {
  18.                                 if(Pass[i]!=Ingresado[i])
  19.                                 {
  20.                                         codigo_erroneo=true;
  21.                                         break;
  22.                                 }
  23.                         }
  24.                         if ( codigo_erroneo == false )
  25.                         {
  26.                                 //Pass correcto
  27.                         }
  28.                         else
  29.                         {
  30.                                 //Pass incorrecto
  31.                         }
  32.                 }
  33.  
  34.         }
  35. }

Tu problema con los while es que SI o SI estas esperando que el usuario ponga eso, lo cual terminaras presionando todo y lo mismo "entrar".

EDIT:
Me habia olvidado una linea, que demostraba lo que queria "demostrar"
« Última modificación: 07 de Marzo de 2016, 16:04:27 por KILLERJC »

Desconectado xelieve

  • PIC10
  • *
  • Mensajes: 23
Re:[16f876A] Botoneras
« Respuesta #7 en: 07 de Marzo de 2016, 18:14:49 »
si pero tambien tengo que pensar que el personal pueda presionar los 2 botones al mismo tiempo, si eso sucedo como puedo hacer, actualmente con tantos whiles pero me resulta.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:[16f876A] Botoneras
« Respuesta #8 en: 07 de Marzo de 2016, 18:40:13 »
Pueden presionar 2 botones al mismo tiempo. Lo cual va a invalidar la clave al menos como tengo realizado el programa.
Tambien vas a tener que usar un timer para hacer un timeout si es que se queda a la mitad del pass y no se ingresa mas nada.

O queres que cuando se presionen 2 botones no cuente como si se hubiera presionado otro hasta que suelte todo ?.
En ese caso.. suponiendo que sean 4 botones.

Si presiono el boton 1, no lo suelto y presiono el boton 2.
- El boton 2 cuenta o no ?, es decir lo tomo como presionado ?
- Si suelto el boton 2 primero que deberia pasar ?
- Si suelto el boton 1 primero que deberia pasar ?

Hacer eso es agregar mas condiciones para que entre adentro del if, nada mas.

Desconectado xelieve

  • PIC10
  • *
  • Mensajes: 23
Re:[16f876A] Botoneras
« Respuesta #9 en: 08 de Marzo de 2016, 10:11:48 »
Pueden presionar 2 botones al mismo tiempo. Lo cual va a invalidar la clave al menos como tengo realizado el programa.
Tambien vas a tener que usar un timer para hacer un timeout si es que se queda a la mitad del pass y no se ingresa mas nada.

O queres que cuando se presionen 2 botones no cuente como si se hubiera presionado otro hasta que suelte todo ?.
En ese caso.. suponiendo que sean 4 botones.

Si presiono el boton 1, no lo suelto y presiono el boton 2.
- El boton 2 cuenta o no ?, es decir lo tomo como presionado ?
- Si suelto el boton 2 primero que deberia pasar ?
- Si suelto el boton 1 primero que deberia pasar ?

Hacer eso es agregar mas condiciones para que entre adentro del if, nada mas.

eso mismo, el boton 2 no cuenta, y solo contara si antes no hay ningun boton precionado.

se puede hacer las botoneras con el puerto C, es lo que busco ya que el B no lo puedo tocar esta destinado para otra cosa

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:[16f876A] Botoneras
« Respuesta #10 en: 08 de Marzo de 2016, 13:07:54 »
Entonces lo que tenes que usar es la idea de Diego E. cuando esten todos en 0 recien ahi "habilitas" que pueda recibir otro boton.

Desconectado xelieve

  • PIC10
  • *
  • Mensajes: 23
Re:[16f876A] Botoneras
« Respuesta #11 en: 08 de Marzo de 2016, 13:33:46 »
Hola yo lo que hago en estos casos es lo siguiente: cuando detecto que presionaron la tecla activo una bandera (1 bit), esta bandera impide volver a entrar si no han soltado la tecla, cuando sueltan la tecla se apaga la bandera habilitando nuevamente la función.

Código: C
  1. [code]void funcion()
  2. {
  3.         if(!bit_test(tecla) && !ban_tecla)
  4.         {
  5.                 ban_tecla = 1;
  6.                
  7.                 "resto de funciones"
  8.         }
  9.        
  10.         else if(bit_test(tecla) && ban_tecla)
  11.         {
  12.                 ban_tecla = 0;
  13.                
  14.                 "resto de funciones"           
  15.         }      
  16. }
[/code]

Saludos

compañero y como haces para detectar ese flanco, ya que al ser 3 botones pueden presionar cualquiera de ellos, tambien seria por el puerto C y sinose puede ya tendria q ser por el puerto B

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re:[16f876A] Botoneras
« Respuesta #12 en: 08 de Marzo de 2016, 13:43:44 »
Puedes utilizar una rutina para cada tecla, además al entrar a cada función preguntas por las otras banderas, si están activas es porqué otra tecla ya fue presionada

Código: CSS
  1. void funcion1()
  2. {
  3.         if(!bit_test(tecla1) && !ban_tecla1)
  4.         {
  5.                 if(ban_tecla2 || ban_tecla3) {return;}
  6.                
  7.             ban_tecla1 = 1;
  8.                
  9.             "resto de funciones"
  10.         }
  11.        
  12.         else if(bit_test(tecla1) && ban_tecla1)
  13.         {
  14.              ban_tecla1 = 0;
  15.                
  16.              "resto de funciones"            
  17.         }      
  18. }
  19. ///////////////////////////////////////////////////////////////////////////////
  20. void funcion2()
  21. {
  22.         if(!bit_test(tecla2) && !ban_tecla2)
  23.         {
  24.                 if(ban_tecla1 || ban_tecla3) {return;}
  25.                
  26.             ban_tecla2 = 1;
  27.                
  28.             "resto de funciones"
  29.         }
  30.        
  31.         else if(bit_test(tecla2) && ban_tecla2)
  32.         {
  33.              ban_tecla2 = 0;
  34.                
  35.              "resto de funciones"            
  36.         }      
  37. }///////////////////////////////////////////////////////////////////////////////
  38. void funcion3()
  39. {
  40.         if(!bit_test(tecla3) && !ban_tecla3)
  41.         {
  42.                 if(ban_tecla1 || ban_tecla2) {return;}
  43.                
  44.             ban_tecla3 = 1;
  45.                
  46.             "resto de funciones"
  47.         }
  48.        
  49.         else if(bit_test(tecla3) && ban_tecla3)
  50.         {
  51.              ban_tecla3 = 0;
  52.                
  53.              "resto de funciones"            
  54.         }      
  55. }

Saludos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:[16f876A] Botoneras
« Respuesta #13 en: 08 de Marzo de 2016, 14:04:52 »
Como dice Diego, o si queres hacerlo para todo el port completo.


Código: C
  1. int1 banTeclas=1;
  2.  
  3.  
  4.  
  5. while(1)
  6. {
  7.         PuertoActual = input_c() & 0x0F;                //Suponete para los 4 botones de abajo nomas
  8.  
  9.         if( banTeclas==0 && PuertoActual != 0)       // Si es distinto a la anterior vuelta del while
  10.         {                                                               // Y es disitnto de 0 ( ninguno presionado )
  11.                 banTeclas=1;
  12.                 if( Una_sola_tecla())
  13.                 {
  14.                         //Hago algo
  15.                 }
  16.  
  17.         }
  18.         if( PuertoActual==0 )
  19.         {
  20.                 banTeclas=0;
  21.         }
  22. }

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re:[16f876A] Botoneras
« Respuesta #14 en: 08 de Marzo de 2016, 14:11:25 »
Yo normalmente defino las variables como bit, así se optimiza más la memoria ram y el procesador sólo chequea bits no registros.

short ban_tecla1;
short ban_tecla2;
short ban_tecla3;

Saludos