Autor Tema: Problemas con mi cllave de acceso  (Leído 3381 veces)

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

Desconectado tavisho

  • PIC12
  • **
  • Mensajes: 94
Problemas con mi cllave de acceso
« en: 16 de Enero de 2009, 04:26:09 »
saludos piclisteros. Me embarqué a programar una clave de acceso, solo que ahora me genera algunos problemas, aquí se los explico.

Más que primer problema es una duda. Cuando leo un teclado matricial 4x4 este lo manda al lcd y se visualiza el valor ya sea en decimal (0...9) o hexa (A..F). La primer duda es si puedo escribir un valor en la segunda línea de un lcd 2x16 de esta forma : 6739, quiero decir que sean diferentes caracteres sin que se borre al anterior y se que visualicen al mismo tiempo.

La segunda duda es ¿ cómo puedo revisar si ya se dejó de presionar una tecla ? creo que mi problema es que la rutina de exploración del teclado no está escrita para el puerto b, lo que lo hace más difícil sin las interrupciones. Alguna idea? Si no se me ocurre nada pues tendré que escribir la exploración del teclado sea para puertob

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Problemas con mi cllave de acceso
« Respuesta #1 en: 16 de Enero de 2009, 06:21:35 »
En el primer punto, no te entendí que es lo que quieres hacer. En el segundo, lo que yo hago, es explorar el puerto y cuando detecto una pulsación, espero 50ms, y vuelvo a explorar el teclado, si está presionada, ya lo tomo como otra pulsación. Me funciona muy bien.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado tavisho

  • PIC12
  • **
  • Mensajes: 94
Re: Problemas con mi cllave de acceso
« Respuesta #2 en: 16 de Enero de 2009, 16:00:11 »
gracias leon pic. en el primer punto quiero decir que si en la línea 2 de un lcd 2x16 puedo escribir dos caracteres numéricos diferentes al imsmo tiempo, o hasta 4, ya que normalmente al quererlo hacer, solo manda el mismo caracter varias veces. Por ejemplo:

Presiono 5 y luego 6 en el teclado matricial y yo quisiera que el lcd mostrara eso
56

sin embargo presiono 5 y 6 y muestra esto:

55

gracias leonpic

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 627
Re: Problemas con mi cllave de acceso
« Respuesta #3 en: 16 de Enero de 2009, 19:56:28 »
por lo que comentas me parece que tienes un problema mas de programa que del LCD , posiblemente estes detectando mas de una vez que la tecla 5 ha sido presionada, podrias subir el codigo que utilizas para manejar el teclado y talvez encontramos que esta mal.

Saludos
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado tavisho

  • PIC12
  • **
  • Mensajes: 94
Re: Problemas con mi cllave de acceso
« Respuesta #4 en: 16 de Enero de 2009, 21:24:55 »
Código: [Seleccionar]
Sigue
movlw .6
call LCD_PosicionLinea2 ; aqui es donde mando a escribir solo un número
call Lee_Teclado
    call LCD_Nibble
goto Sigue
sleep


Lee_Teclado
BUCLE

call KB_Scan
return ;Vuelve a la subrutina BUCLE
KB_Scan                                 ;Escanea el teclado
   
clrf auxiliar
CLRF    Tecla           ;Borra Tecla y
clrf auxiliar1
INCF    Tecla,f         ;prepara Tecla para primer c¢digo.
                  MOVLW   b'1000'         ;Saca 0 a la primera fila
                MOVWF   PORTD           ;de la Puerta B
NOP                 ;Nada para estabilizaci¢n de señal.
Cheq_Col        BTFSC   PORTD,4         ;Primera columna = 0       
                GOTO    antirebotes     ;Sale si se ha pulsado tecla.
                INCF    Tecla,f         ;Si no tecla pulsada, incrementa tecla.
                BTFSC   PORTD,5         ;Segunda columna = 0
                GOTO    antirebotes     ;Sale si se ha pulsado tecla.
                INCF    Tecla,f         ;Si no tecla pulsada, incrementa tecla.
                BTFSC   PORTD,6         ;Tercera columna = 0
                GOTO    antirebotes     ;Sale si se ha pulsado tecla.
                INCF    Tecla,f         ;Si no tecla pulsada, incrementa tecla.
                BTFSC   PORTD,7         ;Cuarta columna = 0
                GOTO    antirebotes     ;Sale si se ha pulsado tecla.
                INCF    Tecla,f         ;Si no tecla pulsada,incrementa Tecla.
                                       
Ultima_Tecla    MOVLW   d'17'           ;Carga W con el n£mero de Teclas + 1.
                SUBWF   Tecla,w         ;y lo compara con el valor actual de Tecla.
                BTFSC   STATUS,Z        ;Si Tecla + 1 = valor actual.
                GOTO    NTeclas         ;No ha sido pulsada ninguna tecla.
                BSF     STATUS,C        ;Pone a 1 Bit C.   
                RRF     PORTD,f      ;as¡ la Fila 1 pasa a 1 con la rotaci¢n a izqda.
GOTO    Cheq_Col                                             
                                                           
NTeclas         movlw 0x10
movwf Tecla
call T_Conv           ;Coloca variable Tecla a 0
RETURN                  ;y regresa.         
                                                           
antirebotes movf PORTD,0
movwf auxiliar1
               
                MOVF    Tecla,w ;pone en w el numero contenido en la variable
            movwf auxiliar
andlw 0x0F
CALL    T_Conv      ;llama a la tabla de conversion y retorna
                MOVWF   Tecla  ;con el valor en hexadecimal y lo pone en la variable.
        movwf auxiliar
RETURN        ;vuelve al programa principal que hizo la llamada.
                 
                             
T_Conv          ADDWF   PCL,F
                RETLW b'11111010'
                RETLW   b'11111111' ;Tecla nº1 = F
                RETLW   0;Tecla nº2 = 0
                RETLW   b'11111110' ;Tecla nº3 = E
                RETLW   b'11111101' ;Tecla nº4 = D                       
                RETLW   1 ;Tecla nº5 = 1
                RETLW   2 ;Tecla nº6 = 2
                RETLW   3 ;Tecla nº7 = 3
RETLW   b'11111100';Tecla nº8 =  C
                RETLW   4 ;Tecla nº9 = 4
                RETLW   5 ;Tecla nº10 = 5
                RETLW   6 ;Tecla nº11 = 6
                RETLW   b'11111011';Tecla nº12 = B
                RETLW   7 ;Tecla nº13 = 7
                RETLW   8 ;Tecla nº14 = 8
                RETLW   9 ;Tecla nº15 = 9
            goto Blanco

Blanco call LCD_Linea2EnBlanco ; manda este valor si no hay ninguna tecla presionada

goto Sigue

Como se ve hay 2 puntos de interés en el programa. En la etiqueta sigue es donde se escribe el valor del teclado, sin embargo me enfrento a dos problemas. El primero es como saber cuando se dejó de apretar una tecla para no escribirla infinitamente en el lcd. El segundo es como escribo el segundo caracter sin borrar e primero que ya escribí.

El segundo punto de interés es la etiqueta blanco, ya que si no la anotaba al apretar una tecla (digamos 5) se mostraba al 5 y después de dejarla de presionar regrsaba a 0. Como puedo evitarlo sin poner una etiqueta forzada dentro de la tabla? muchas gracias por su atenci´pn

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 627
Re: Problemas con mi cllave de acceso
« Respuesta #5 en: 17 de Enero de 2009, 03:09:32 »
Revisando un poco tu codigo me parece que podrias comenzar revisando lo siguiente:

primero fijate que en tu rutina Sigue  siempre llamas a  LCD_Posicionlinea2 , ahora yo me imagino , a falta de mas informacion,  que esa subrutina coloca el cursor en la segunda linea para iniciar el despliegue desde ahi, entonces siempre estas
escribiendo en la primera posicion de la segunda fila, esto lo solucionarias poniendo el call    LCD_Posicionlinea2 antes de la etiqueta Sigue.
Código: ASM
  1. Sigue
  2.         movlw   .6
  3.         call    LCD_PosicionLinea2 ; aqui es donde mando a escribir solo un número
  4.         call     Lee_Teclado
  5.         call    LCD_Nibble
  6.         goto    Sigue
  7.         sleep

Ahora en tu rutina para leer el teclado no das tiempo suficiente para que tu rutina detecte la pulsacion una sola vez, para esto enla seccion que dice antirebotes , deberias aumentar una llamada a una subrutina de demora de unos 50 ms (como te sugirio leon pic) o mas y despues realizar una espera a que los pines RD4  a RD7 vuelvan a cero , esto seria algo asi

Código: ASM
  1. antirebotes
  2.         call   demora50ms    ;para antirrebotes
  3.  
  4. antirebotesP0
  5.         movf    PORTD,0                  ;leo el valor del PORTD
  6.         andlw 0xF0                       ;solo interesan  los pines de RD4 a RD7
  7.         xorlw  0x00                       ;comparamos con cero
  8.         btfss  STATUS,Z                ;Los pines RD4 a RD7 estan en cero?
  9.         goto  antirrebotesP0         ;no => seguimos esperando
  10.  
  11.         movwf   auxiliar1                  ;Si => continuamos
  12.  
  13.         MOVF    Tecla,w         ;pone en w el numero contenido en la variable
  14.         movwf   auxiliar
  15.         andlw   0x0F
  16.         CALL    T_Conv          ;llama a la tabla de conversion y retorna
  17.         MOVWF   Tecla           ;con el valor en hexadecimal y lo pone en la variable.
  18.         movwf   auxiliar
  19.         RETURN                          ;vuelve al programa principal que hizo la llamada.

Saludos
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Problemas con mi cllave de acceso
« Respuesta #6 en: 17 de Enero de 2009, 11:28:21 »
Además de lo que dice Sander, tienes un Call demás

Código: ASM
  1. call Lee_Teclado


Código: ASM
  1. Lee_Teclado
  2. BUCLE
  3.                
  4.                 call    KB_Scan
  5.                 return          ;Vuelve a la subrutina BUCLE
  6. KB_Scan                                 ;Escanea el teclado

Lo que puedes hacer es reemplazar el call  lee_teclado, por  call KB_Scan

Código: ASM
  1. MOVLW   b'1000'         ;Saca 0 a la primera fila
  2.                 MOVWF   PORTD           ;de la Puerta B

Dices que sacas por el puerto B pero lo haces por el puerto D. Me doy una idea de como tienes conectado el puerto pero hay algo que no entiendo. En la instrucción sitada, estás enviando por el puerto D este valor B'00001000' ¿podrías indicarnos como tienes conectado el teclado?
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado tavisho

  • PIC12
  • **
  • Mensajes: 94
Re: Problemas con mi cllave de acceso
« Respuesta #7 en: 18 de Enero de 2009, 20:58:14 »
las filas van conectadas de esta forma (RD0 -1 -2 -3 ) - (A-B-C-D)

las columnas de la siguiente manera ( RD4-5-6-7) - (1-2-3-4)

muchas gracias por sus comentarios, les aseguro que usaré sus consejos en mi código para que funcione, ya qu eme han propuesto un proyecto que necesitaré de esto y más


les subo la imagen para que vean

Desconectado sander

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 627
Re: Problemas con mi cllave de acceso
« Respuesta #8 en: 19 de Enero de 2009, 12:17:54 »
Otra cosa que debes corregir es que te faltan resistencias de pull down en los pines RD4 a RD7


Saludos
La electrónica es el arte de manipular señales eléctricas que transportan información
Jan Davidse

Visita mi blog
Visita mi canal de youtube