Autor Tema: interrupciones pic 16f877  (Leído 4292 veces)

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

Desconectado juanv030

  • PIC10
  • *
  • Mensajes: 14
interrupciones pic 16f877
« en: 06 de Octubre de 2010, 22:10:04 »
Buenas a todos los miembros.

Tenia una duda acerca de como podia escribir numeros con pulsadores en un lcd. Resulta que automaticamente si o si tengo que escribir el numero 123456789 porque no puedo alternar los mismos. Mi pregunta era simple. Queria saber como poder cambiar el orden desde los pulsadores. Aca dejo el codigo:



#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use standard_io(A)
#use standard_io(B)
#use standard_io(C)
#include <stdlib.h>
#include <string.h>
#include <lcd.c>


void teclado();

void teclado() {

do{

  if(!input(PIN_B0)){                  //¿se ha pulsado up?
         while(!input(PIN_B0)){} //elimina rebotes
         
         lcd_putc("1");

       ;
       
         }

if(!input(PIN_B1)){                  //¿se ha pulsado up?
         while(!input(PIN_B1)){} //elimina rebotes
         
         lcd_putc("2");
         
         }
         
if(!input(PIN_B2)){                  //¿se ha pulsado up?
         while(!input(PIN_B2)){} //elimina rebotes
         
         lcd_putc("3");
         
         }

if(!input(PIN_B3)){                  //¿se ha pulsado up?
         while(!input(PIN_B3)){} //elimina rebotes
         
         lcd_putc("4");
         
         }
         
if(!input(PIN_B4)){                  //¿se ha pulsado up?
         while(!input(PIN_B4)){} //elimina rebotes
         
         lcd_putc("5");
         
         }

if(!input(PIN_B5)){                  //¿se ha pulsado up?
         while(!input(PIN_B5)){} //elimina rebotes
         
         lcd_putc("6");
         
         }


if(!input(PIN_B6)){                  //¿se ha pulsado up?
         while(!input(PIN_B6)){} //elimina rebotes
         
         lcd_putc("7");
         
         }


if(!input(PIN_A0)){                  //¿se ha pulsado up?
         while(!input(PIN_A0)){} //elimina rebotes
         
         lcd_putc("8");
         
         }

if(!input(PIN_A1)){                  //¿se ha pulsado up?
         while(!input(PIN_A1)){} //elimina rebotes
         
         lcd_putc("9");
         
         }
       
if(!input(PIN_A2)){                  //¿se ha pulsado up?
         while(!input(PIN_A2)){} //elimina rebotes
         
         lcd_putc(".");
         
         }

if(!input(PIN_A3)){                  //¿se ha pulsado up?
         while(!input(PIN_A3)){} //elimina rebotes
         
         lcd_putc("\b");
         
         }

if(!input(PIN_A4)){                  //¿se ha pulsado up?
         while(!input(PIN_A4)){} //elimina rebotes
         
         lcd_putc("0");
         
         }
         
if(!input(PIN_C0)){                  //¿se ha pulsado up?
         while(!input(PIN_C0)){} //elimina rebotes
         
         lcd_putc("-");
         
         }
         

         

}while(input(PIN_A5));      //apretas enter y..
   while(!input(PIN_A5)){} //elimina rebotes
   

 
 
 
}

void main() {


set_tris_A(0x3F);
set_tris_B(0x3F);
set_tris_C(0x3F); 

   lcd_init();

lcd_putc("Primer digito\n");
teclado();
lcd_putc("\fSegundo digito\n");
teclado();
}
   
             
             
 muchas gracias a los integrantes del foro! :)

Desconectado f-traxx

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
Re: interrupciones pic 16f877
« Respuesta #1 en: 07 de Octubre de 2010, 04:38:46 »
Buenas no he entendido bien que es lo que preguntas, tu duda es saber como puedes leer un teclado? y segun el boton pulsado poner una cosa en la LCD, o que se pulse lo que se pulse salga 123456789?? explicate un poco mejor porfavor.

Desconectado juanv030

  • PIC10
  • *
  • Mensajes: 14
Re: interrupciones pic 16f877
« Respuesta #2 en: 07 de Octubre de 2010, 21:52:45 »
Muchas gracias. Claro, lo que queria hacer es que segun el boton pulsaso se pueda poner un numero en el lcd. Entonces hice ese codigo. Pero a los pulsadores, en el lcd si o si (debe ser por algun fallo en la programacion ) los tengo que apretar en orden, es decir como aparecen numericamente los "if", es decir 123456789.... Entonces queria que se pueda apretar cualquier boton sin orden alguno. Muchas gracias  :)

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: interrupciones pic 16f877
« Respuesta #3 en: 07 de Octubre de 2010, 22:31:49 »
Yo cambiaría la rutina "antirebote" un poco; porque en realidad lo que estás haciendo es una espera hasta soltar el pulsador y no es así como debería ser. Lo que yo siempre hago como antirebote es...

....leo el pulsador  (supongamos que quiero que 0 sea presionado)
espero 10mS aproximadamente
vuelvo a leer el pulsador (si sigue estando en 0 es porque realmente lo presiono sino, es porque fue un rebote)

Tus if dentro de la función Teclado() no están anidados así que no tiene sentido que tengas que presionar los número en secuencia.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado f-traxx

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
Re: interrupciones pic 16f877
« Respuesta #4 en: 08 de Octubre de 2010, 04:50:30 »
Te he retocado un poco el codigo, pero no lo he probado porque no tengo mucho tiempo, lo único que he hecho es añadirle unos else despues de cada if porque sino se cumple la primera accion siga con la siguiente, nose si sera eso pero a mi me ha dado por saco mas de una vez una tonteria asi, descargate el codigo, que no es muy "limpio" poer el codigo tan largo pegado.

Si consigues solucionarlo postea qual fue el problema y la solucion, asi si alguna vez alguien se encuentra con un problemilla similar ya lo tendra arreglado.


Desconectado juanv030

  • PIC10
  • *
  • Mensajes: 14
Re: interrupciones pic 16f877
« Respuesta #5 en: 08 de Octubre de 2010, 22:43:29 »
Gracias por responder, pero la verdad es que sigo sin poder solucionar el problema. Es que si le agrego los else, sigue funcionando igual.. :/. AngelGris, no me podrias colocar un ejemplo sobre lo del antirebote por favor porque la verdad no soy muy experimentado en esto .Muchas gracias :)

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: interrupciones pic 16f877
« Respuesta #6 en: 08 de Octubre de 2010, 22:57:17 »
Gracias por responder, pero la verdad es que sigo sin poder solucionar el problema. Es que si le agrego los else, sigue funcionando igual.. :/. AngelGris, no me podrias colocar un ejemplo sobre lo del antirebote por favor porque la verdad no soy muy experimentado en esto .Muchas gracias :)

Hola, a primera vista no debería suceder lo que comentas.  Podrías subir el esquematico?  Tal vez sea algo del hardware. Entiendo que esta es una buena práctica para aprender, pero si le das una ojeada a la librería KBD.C que trae el CCS junto con el ejemplo EX_LCDKB.C, podrás ver una forma más sencilla y práctica de leer botones.

Saludos!

Desconectado juanv030

  • PIC10
  • *
  • Mensajes: 14
Re: interrupciones pic 16f877
« Respuesta #7 en: 08 de Octubre de 2010, 23:18:13 »
Gracias por el aporte de esa libreria. Aca dejo el codigo de vuelta porque le cambie algunas cosas y la simulacion en el proteus :)

Gracias por la ayuda!