Autor Tema: Duda con el teclado y el LCD  (Leído 3035 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado dbermejo123

  • PIC10
  • *
  • Mensajes: 14
Duda con el teclado y el LCD
« en: 26 de Febrero de 2007, 21:04:52 »
Soy nuevo en microcontroladores pic yestoy haciendo para el PIC16F8aA la lectura del teclado en el LCD, resulta q tengo un teclado diferente q es este:
       RB0 RB1 RB2 RB3
;                      ^   ^   ^   ^        
;                                  |   |   |   |                     
;      |---|---|---|---|   
;   RB4 -->   | 1 | 2 | 3 | A |   
;      |---|---|---|---|   
;   RB5 -->   | 4 | 5 | 6 | B |   
;      |---|---|---|---|   
;   RB6 -->   | 7 | 8 | 9 | C |   
;      |---|---|---|---|   
;   RB7 -->   | * | 0 | . | D |   
;      |---|---|---|---|

En el programita teclado.inc esta configurado para otro teclado q se vera a continuacion.En la  columna RB3 y la fila
RB7 son diferentes las teclas. Queria saber como se podria modificar el teclado que yo quiero del primero
;****************************************************************************************
;               TECLADO.INC
;
;            Autor: Mikel Etxebarria
;         (c) Microsystems Engineering (Bilbao)
;
;Presenta un conjuntos de rutinas que permiten la gestión de un teclado hexadecimal organi-
;zado en una matriz de 4 x 4 tal y como es el caso del teclado incorporado en la tarjeta
;de ampliación MicroPic Trainer PLUS de Microsystems Engineering.
;
;Este fichero se debe incluir en los futuros programas fuente mediante la directiva INCLUDE.
;
;Key_Scan:    realiza un barrido del teclado y detecta si hay alguna tecla pulsada. La
;      variable "Tecla" retorna con el código de la tecla pulsada o el 0x80 en caso
;      de no haber ninguna.
;
;Key_BCD:   Convierte el código de tecla en código BCD (del 0 a F). Antes de llamar a la
;      rutina la variable "Tecla" contiene el código de tecla. Al finalizar, la
;      rutina devuelve el código BCD en la misma variable "Tecla".
;
;BCD_7seg:   Convierte el código BCD en código 7 segmentos. A la llamada de la rutina, el
;      W debe contener el código BCD y al finalizar la misma W retorna con el có-
;      digo 7 segmentos.
;
;El teclado hex. se supone conectado a la puerta B y su disposición es la siguiente:
;
;       RB0 RB1 RB2 RB3
;        ^   ^   ^   ^         TECLA        CODIGO
;                                  |   |   |   |       -----   --------------
;      |---|---|---|---|   0   01111101 = 0x7D
;   RB4 -->   | 1 | 2 | 3 | F |   1   11101110 = 0xEE
;      |---|---|---|---|   2   11101101 = 0xED
;   RB5 -->   | 4 | 5 | 6 | E |   3   11101011 = 0xEB
;      |---|---|---|---|   4   11011110 = 0xDE
;   RB6 -->   | 7 | 8 | 9 | D |   5   11011101 = 0xDD
;      |---|---|---|---|   6   11011011 = 0xDB
;   RB7 -->   | A | 0 | B | C |   7   10111110 = 0xBE
;      |---|---|---|---|   8   10111101 = 0xBD
;            9   10111011 = 0xBB
;            A   01111110 = 0x7E
;            B   01111011 = 0x7B
;            C   01110111 = 0x77
;            D   10110111 = 0xB7
;            E   11010111 = 0xD7
;            F   11100111 = 0xE7
;
;Hubiera sido más interesante que RB4-RB7 actuaran como entradas para poder hacer
;uso de la capacidad que tiene el PIC de provocar interrupción al cambiar de estado
;estas líneas. Ello no es posible dado que, en la Trainer, las líneas RB6 y RB7 forman
;parte también del circuito de grabación.

      cblock   Key_var      ;Inicio de las variables
      Tecla         ;Retorno del código de tecla
      Key_1         ;Nº de columnas a explorar
      Key_2                  ;Temporal de código
      Key_Delay_1      ;Variable de temporización
      Key_Delay_2      ;Variable de temporización
      TRISB_Temp      ;Estado temporal de TRISB
      endc                  

;**************************************************************************************
;Key_Scan: Rutina de exploración del teclado. La variable "Tecla" retorna con el código
;de la tecla pulsada o el código 0x80 si no se pulsa ninguna.

Key_Scan:   bsf   STATUS,RP0   ;Seleciona página 1
      movf   TRISB,W
      movwf   TRISB_Temp   ;Salva estado actual de TRISB
      movlw   b'00001111'
      movwf   TRISB      ;RB0-RB3 entradas, RB4-RB7 salidas
      bcf   STATUS,RP0   ;Selecciona página 0
      movlw   4
      movwf   Key_1      ;Nº de columnas a explorar
      movlw   b'01111111'
      movwf   Tecla      ;Columna a activar
Key_Scan_1:   movf    Tecla,W
      movwf   PORTB      ;Activa columna            
      nop
      movf   PORTB,W
      movwf   Key_2
      subwf   Tecla,W      ;Lee las filas
      btfss   STATUS,Z   ;Hay alguna pulsada ?
      goto   Key_Scan_2   ;Si, hay alguna pulsada
      bsf   STATUS,C   ;No hay ninguna en esa columna
      rrf   Tecla,F      ;Seleciona siguiente columna
      decfsz   Key_1,F
      goto   Key_Scan_1
      movlw   0x80
      movwf   Tecla      ;Retorna código 0x80 (no hay pulsación)
      movf   TRISB_Temp,W
      bsf   STATUS,RP0   ;Selecciona página 1
      movwf   TRISB      ;Repone TRISB al valor original
      bcf   STATUS,RP0   ;Selecciona página 0
      return         ;Fin de exploración
            
Key_Scan_2:   movlw   .10      ;Bucle de temporización de unos 20 mS
      movwf   Key_Delay_1   ;para evitar el rebote de los pulsado-
Key_Scan_3:   clrf   Key_Delay_2   ;res.
      clrwdt
Key_Scan_4:   decfsz   Key_Delay_2,F
      goto   Key_Scan_4
      decfsz   Key_Delay_1,F
      goto   Key_Scan_3
            
      movf   Tecla,W      ;Trás la temporización se lee nuevamente
      movwf   PORTB      ;si la tecla es la misma. Así se evitan
      nop         ;los rebotes.
      movf   PORTB,W
      subwf   Key_2,W
      btfss   STATUS,Z   ;Es la misma ??
      goto   Key_Scan_1   ;No, seguir con la exploración
      movf   Key_2,W      ;Si guardar en variable de salida "Tecla"
      movwf   Tecla
      movf   TRISB_Temp,W
      bsf   STATUS,RP0   ;Selecciona página 1
      movwf   TRISB      ;Repone TRISB al valor original
      bcf   STATUS,RP0   ;Selecciona página 0
      return         ;Fin de exploración                                             

;*************************************************************************************
;Key_BCD: Convierte un código el código de tecla que haya en la variable "Tecla" y lo
;convierte a Hex. (0-F). El resultado se devuelve en la variable "Tecla"
 
Key_Tabla   movf   Key_1,W
      addwf   PCL,F      ;Calcula desplazamiento
      retlw   0x7d      ;0
      retlw   0xee      ;1
      retlw   0xed      ;2
      retlw   0xeb      ;3
      retlw   0xde      ;4
      retlw   0xdd      ;5
      retlw   0xdb      ;6
      retlw   0xbe      ;7
      retlw   0xbd      ;8
      retlw   0xbb      ;9
      retlw   0x7e      ;A
      retlw   0x7b      ;B
      retlw   0x77      ;C
      retlw   0xb7      ;D
      retlw   0xd7      ;E
      retlw   0xe7      ;F
            
Key_BCD:   movf   Tecla,W
       movwf   Key_2      ;Almacena el código temporalmente
       clrf   Key_1      ;Contador BCD a 0
Key_BCD_2   call   Key_Tabla   ;Busca código en la tabla
       subwf   Key_2,W      ;Compara con el de la tecla
       btfsc   STATUS,Z   ;Coincide ??
       goto   Key_BCD_1   ;Si
       incf   Key_1,F      ;No, incrementa contador BCD
       goto   Key_BCD_2
Key_BCD_1   movf   Key_1,W
      movwf   Tecla      ;Carga contador BCD en la variable de salida
      return
                               
;***************************************************************************************
;BCD_7seg:   Rutina de conversión de BCD (0-F) a 7 segmentos. El acumulador W contiene,
;durante la llamada, el código BCD y, al retornar, el correspondiente a 7 segmentos
;
BCD_7seg:   andlw   b'00001111'
      addwf   PCL,F      ;Desplazamiento sobre la tabla
      retlw   b'00111111'   ;0
      retlw   b'00000110'   ;1
      retlw   b'01011011'   ;2
      retlw   b'01001111'   ;3
      retlw   b'01100110'   ;4
      retlw   b'01101101'   ;5
      retlw   b'01111101'   ;6
      retlw   b'00000111'   ;7
      retlw   b'01111111'   ;8
      retlw   b'01100111'   ;9
      retlw   b'01110111'   ;A
      retlw   b'01111100'   ;B
      retlw   b'00111001'   ;C
      retlw   b'01011110'   ;D
      retlw   b'01111001'   ;E
      retlw   b'01110001'   ;F

Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: Duda con el teclado y el LCD
« Respuesta #1 en: 26 de Febrero de 2007, 21:32:20 »
Hola dbermejo123: No has planteado tu duda o problema, si lo que quieres hacer es reemplazar los símbolos por los que trae tu teclado, solo tienes que hacer lo mismo en el programita, esto es en las dos partes donde están los retlw.
En síntesis desde el 0 al 9 queda tal como está ya que son las mismas teclas y ocupan el mismo lugar, luego en las demás vas reemplazando el binario por el símbolo correspondiente, lo que no sé es como vas a dibujar el asterisco...

Saludos.
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.

Desconectado dbermejo123

  • PIC10
  • *
  • Mensajes: 14
Re: Duda con el teclado y el LCD
« Respuesta #2 en: 26 de Febrero de 2007, 22:20:06 »
Esa es la duda q tengo pero como lo hago para pasar a binaro los restantes Simbolos correspondientes
me lo podrias ponerlo

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Duda con el teclado y el LCD
« Respuesta #3 en: 27 de Febrero de 2007, 01:30:24 »
m,........... el codigo q tienes funcionara?, si estas comenzando sugiero q vayas paso por paso, por ejemplo, primero resume ese codigo de teclado y haz tu propia version, de poco a poco se llega lejos!!!  :-/
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: Duda con el teclado y el LCD
« Respuesta #4 en: 27 de Febrero de 2007, 19:24:56 »
Hola dbermejo: 1º ese programita que tienes lo probaste?, sino hacelo funcionar con tu teclado, verás que algunas teclas no corresponden, por lo tanto esas son las que tendrás que ir modificando en tu programa.
2º entiendes el programa tal como está? creo que es lo primero que debes ir haciendo, si hay algo que no entiendes, pregunta y te vamos a ayudar.

Como ayuda te puedo decir que para el resultado final lo que vas a tener que modificar es la última parte del código...  ;-)
saludos...
« Última modificación: 27 de Febrero de 2007, 19:31:05 por flacoclau »
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.

Desconectado dbermejo123

  • PIC10
  • *
  • Mensajes: 14
Re: Duda con el teclado y el LCD
« Respuesta #5 en: 27 de Febrero de 2007, 22:10:58 »
se mas o menos de que va el programa , lo q necesito es crear una rutina que me diga que tal fila y columna es tal tecla y asi... en todas las teclas y no se como me podrias ayudarme. Yo pienso que hay que quitar la rutina de KEYBCD y sustituir una creada para nuestro teclado

Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: Duda con el teclado y el LCD
« Respuesta #6 en: 27 de Febrero de 2007, 23:21:07 »
Para que lo estás haciendo? es un trabajo de la escuela? o un encargue?
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.

Desconectado dbermejo123

  • PIC10
  • *
  • Mensajes: 14
Re: Duda con el teclado y el LCD
« Respuesta #7 en: 28 de Febrero de 2007, 20:33:35 »
es que estoy haciendo un entrenador para el PIC16F88 que es un proyecto que nos ha mandado en el ciclo de Electrónica

Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: Duda con el teclado y el LCD
« Respuesta #8 en: 28 de Febrero de 2007, 21:37:47 »
Mi idea era que lo dedujeras tu mismo, pero veo que no tienes mucha idea ni tampoco ganas de aprender, por lo tanto te lo he resuelto para que no reniegues más.
Te vá a servir para zafar de la materia, lamentablemente te estás perdiendo de ganar una herramienta mucho más importante que es aprender.
saludos.

;****************************************************************************************
;               TECLADO.INC
;
;            Autor: Mikel Etxebarria
;         (c) Microsystems Engineering (Bilbao)
;
;Presenta un conjuntos de rutinas que permiten la gestión de un teclado hexadecimal organi-
;zado en una matriz de 4 x 4 tal y como es el caso del teclado incorporado en la tarjeta
;de ampliación MicroPic Trainer PLUS de Microsystems Engineering.
;
;Este fichero se debe incluir en los futuros programas fuente mediante la directiva INCLUDE.
;
;Key_Scan:    realiza un barrido del teclado y detecta si hay alguna tecla pulsada. La
;      variable "Tecla" retorna con el código de la tecla pulsada o el 0x80 en caso
;      de no haber ninguna.
;
;Key_BCD:   Convierte el código de tecla en código BCD (del 0 a F). Antes de llamar a la
;      rutina la variable "Tecla" contiene el código de tecla. Al finalizar, la
;      rutina devuelve el código BCD en la misma variable "Tecla".
;
;BCD_7seg:   Convierte el código BCD en código 7 segmentos. A la llamada de la rutina, el
;      W debe contener el código BCD y al finalizar la misma W retorna con el có-
;      digo 7 segmentos.
;
;El teclado hex. se supone conectado a la puerta B y su disposición es la siguiente:
;
;            RB0 RB1 RB2 RB3  TECLA     CODIGO
;             ^   ^   ^   ^   ----- ---------------
;           |---|---|---|---|   0   01111101 = 0x7D
;   RB4 --> | 1 | 2 | 3 | A |   1   11101110 = 0xEE
;           |---|---|---|---|   2   11101101 = 0xED
;   RB5 --> | 4 | 5 | 6 | B |   3   11101011 = 0xEB
;           |---|---|---|---|   4   11011110 = 0xDE
;   RB6 --> | 7 | 8 | 9 | C |   5   11011101 = 0xDD
;           |---|---|---|---|   6   11011011 = 0xDB
;   RB7 --> | * | 0 | . | D |   7   10111110 = 0xBE
;           |---|---|---|---|   8   10111101 = 0xBD
;                               9   10111011 = 0xBB
;                               *   01111110 = 0x7E
;                               .   01111011 = 0x7B
;                               D   01110111 = 0x77
;                               C   10110111 = 0xB7
;                               B   11010111 = 0xD7
;                               A   11100111 = 0xE7
;
;Hubiera sido más interesante que RB4-RB7 actuaran como entradas para poder hacer
;uso de la capacidad que tiene el PIC de provocar interrupción al cambiar de estado
;estas líneas. Ello no es posible dado que, en la Trainer, las líneas RB6 y RB7 forman
;parte también del circuito de grabación.

cblock      Key_var             ;Inicio de las variables
            Tecla               ;Retorno del código de tecla
            Key_1               ;Nº de columnas a explorar
            Key_2               ;Temporal de código
            Key_Delay_1         ;Variable de temporización
            Key_Delay_2         ;Variable de temporización
            TRISB_Temp          ;Estado temporal de TRISB
endc

;**************************************************************************************
;Key_Scan: Rutina de exploración del teclado. La variable "Tecla" retorna con el código
;de la tecla pulsada o el código 0x80 si no se pulsa ninguna.

Key_Scan    bsf    STATUS,RP0   ;Seleciona página 1
            movf   TRISB,W
            movwf  TRISB_Temp   ;Salva estado actual de TRISB
            movlw  b'00001111'
            movwf  TRISB        ;RB0-RB3 entradas, RB4-RB7 salidas
            bcf    STATUS,RP0   ;Selecciona página 0
            movlw  .4
            movwf  Key_1        ;Nº de columnas a explorar
            movlw  b'01111111'
            movwf  Tecla        ;Columna a activar

Key_Scan_1  movf   Tecla,W
            movwf  PORTB        ;Activa columna
            nop
            movf   PORTB,W
            movwf  Key_2
            subwf  Tecla,W      ;Lee las filas
            btfss  STATUS,Z     ;Hay alguna pulsada ?
            goto   Key_Scan_2   ;Si, hay alguna pulsada
            bsf    STATUS,C     ;No hay ninguna en esa columna
            rrf    Tecla,F      ;Seleciona siguiente columna
            decfsz Key_1,F
            goto   Key_Scan_1
            movlw  0x80
            movwf  Tecla        ;Retorna código 0x80 (no hay pulsación)
            movf   TRISB_Temp,W
            bsf    STATUS,RP0   ;Selecciona página 1
            movwf  TRISB        ;Repone TRISB al valor original
            bcf    STATUS,RP0   ;Selecciona página 0
            return              ;Fin de exploración
           
Key_Scan_2  movlw  .10          ;Bucle de temporización de unos 20 mS
            movwf  Key_Delay_1  ;para evitar el rebote de los pulsadores.

Key_Scan_3  clrf   Key_Delay_2
            clrwdt

Key_Scan_4  decfsz Key_Delay_2,F
            goto   Key_Scan_4
            decfsz Key_Delay_1,F
            goto   Key_Scan_3
           
            movf   Tecla,W      ;Trás la temporización se lee nuevamente
            movwf  PORTB        ;si la tecla es la misma. Así se evitan
            nop                 ;los rebotes.
            movf   PORTB,W
            subwf  Key_2,W
            btfss  STATUS,Z     ;Es la misma ??
            goto   Key_Scan_1   ;No, seguir con la exploración
            movf   Key_2,W      ;Si guardar en variable de salida "Tecla"
            movwf  Tecla
            movf   TRISB_Temp,W
            bsf    STATUS,RP0   ;Selecciona página 1
            movwf  TRISB        ;Repone TRISB al valor original
            bcf    STATUS,RP0   ;Selecciona página 0
            return              ;Fin de exploración

;*************************************************************************************
;Key_BCD: Convierte un código el código de tecla que haya en la variable "Tecla" y lo
;convierte a Hex. (0-F). El resultado se devuelve en la variable "Tecla"
 
Key_Tabla   movf   Key_1,W
            addwf  PCL,F        ;Calcula desplazamiento
            retlw  0x7d         ;0
            retlw  0xee         ;1
            retlw  0xed         ;2
            retlw  0xeb         ;3
            retlw  0xde         ;4
            retlw  0xdd         ;5
            retlw  0xdb         ;6
            retlw  0xbe         ;7
            retlw  0xbd         ;8
            retlw  0xbb         ;9
            retlw  0x7e         ;*
            retlw  0x7b         ;.
            retlw  0x77         ;D
            retlw  0xb7         ;C
            retlw  0xd7         ;B
            retlw  0xe7         ;A

Key_BCD     movf   Tecla,W
            movwf  Key_2        ;Almacena el código temporalmente
            clrf   Key_1        ;Contador BCD a 0

Key_BCD_2   call   Key_Tabla    ;Busca código en la tabla
            subwf  Key_2,W      ;Compara con el de la tecla
            btfsc  STATUS,Z     ;Coincide ??
            goto   Key_BCD_1    ;Si
            incf   Key_1,F      ;No, incrementa contador BCD
            goto   Key_BCD_2

Key_BCD_1   movf   Key_1,W
            movwf  Tecla        ;Carga contador BCD en la variable de salida
            return

;***************************************************************************************
;BCD_7seg:   Rutina de conversión de BCD (0-F) a 7 segmentos. El acumulador W contiene,
;durante la llamada, el código BCD y, al retornar, el correspondiente a 7 segmentos
;
BCD_7seg    andlw   b'00001111'
            addwf   PCL,F       ;Desplazamiento sobre la tabla
            retlw   b'00111111' ;0
            retlw   b'00000110' ;1
            retlw   b'01011011' ;2
            retlw   b'01001111' ;3
            retlw   b'01100110' ;4
            retlw   b'01101101' ;5
            retlw   b'01111101' ;6
            retlw   b'00000111' ;7
            retlw   b'01111111' ;8
            retlw   b'01100111' ;9
            retlw   b'01110000' ;*
            retlw   b'10000000' ;.
            retlw   b'01011110' ;d
            retlw   b'00111001' ;c
            retlw   b'01111100' ;b
            retlw   b'01110111' ;a
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.

Desconectado dbermejo123

  • PIC10
  • *
  • Mensajes: 14
Re: Duda con el teclado y el LCD
« Respuesta #9 en: 01 de Marzo de 2007, 20:56:09 »
Perdona por todo, no sabia que era la rutina de BCD_7seg donde habia que decir las teclas por el que querias y pasarlo a binario pensaba que era para los displays, es que no se me da bien lo de los PIC. He estado haciendo uno, una rutina esta semana pero todavia no me funciona que es esta para KEY_BCD:

Key_BCD:                 CLRF Tecla

      MOVLW b'11101111'
      MOVWF PORTB

      BTFSS PORTB,0
      GOTO n2
      RETLW '1'
     n2:BTFSS PORTB,1
      GOTO n3
      RETLW '2'
     n3:BTFSS PORTB,2
      GOTO letraA
      RETLW '3'
 letraA:BTFSS PORTB,3
      GOTO n4
      RETLW 'A'

     n4:MOVLW b'11011111'
      MOVWF PORTB
      BTFSS PORTB,0
      GOTO n5
      RETLW '4'
     n5:BTFSS PORTB,1
      GOTO n6
      RETLW '5'
     n6:BTFSS PORTB,2
      GOTO letraB
      RETLW '6'
 letraB:BTFSS PORTB,3
      GOTO n7
      RETLW 'B'

     n7:MOVLW b'10111111'
      MOVWF PORTB
      BTFSS PORTB,0
      GOTO n8
      RETLW '7'
     n8:BTFSS PORTB,1
      GOTO n9
      RETLW '8'
     n9:BTFSS PORTB,2
      GOTO letraC
      RETLW '9'
 letraC:BTFSS PORTB,3
      GOTO estrella
      RETLW 'C'

estrella:MOVLW b'01111111'
      MOVWF PORTB
      BTFSS PORTB,0
      GOTO n0
      RETLW '*'
     n0:BTFSS PORTB,1
      GOTO n#
      RETLW '0'
     n#:BTFSS PORTB,2
      GOTO letraD
      RETLW '#'
 letraD:BTFSS PORTB,3
      GOTO fin
      RETLW 'D'

fin:return


      

Desconectado dbermejo123

  • PIC10
  • *
  • Mensajes: 14
Re: Duda con el teclado y el LCD
« Respuesta #10 en: 04 de Marzo de 2007, 19:24:20 »
la herramienta teclado.inc que no me funcina los del teclado de las que habian que modificar por otras, me siguen saliendo como desde el principio. No se cual es el problema . Yo he estado haciendo un programa para que me lea lo que pulso en el teclado que es este:
ejem3.4.asm

      List   p=F16F88      ;Tipo de procesador
      
      include   "P16F88.INC"   ;Definiciones de registros internos
 __CONFIG    _CONFIG1, _CP_OFF &  _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC

 
                 
Lcd_var      equ   0x20      ;Inicio de las variables para el LCD
Key_var      equ   0x21      ;Inicio de las variables del teclado            
Contador_C   equ   0x22      ;Contador de caracteres
Contador_L   equ   0x23      ;Contador de líneas
               
      org   0x00      ;Vector de reset
      goto   Inicio
      org   0x05      ;Salva vector de interrupción
            
      include   "LCD_CXX.INC"   ;Incluir rutinas de manejo del LCD
      include   "TECLADO.INC"   ;Incluir rutinas de manejo del teclado
                     
Inicio:      bsf   STATUS,RP0   ;Selecciona página 1 de datos
      clrf    ANSEL         ;puertos como E/S digital.
      movlw   b'00001111'
      movwf   OPTION_REG   ;Preescalr de 128 asignado al WDT
      bcf   INTCON,GIE   ;Desconectar interrupciones
      bcf   STATUS,RP0   ;Selecciona página 0 de datos
      clrwdt         ;Refrescar WDT
            
      call   UP_LCD      ;Configura Puerta A y B como salidas
      call   LCD_INI      ;Rutina de inicialización del LCD
      movlw   b'00001110'
      call   LCD_REG      ;LCD en ON, cursor ON
Borra_LCD   movlw   b'00000001'
      call   LCD_REG      ;Borra LCD y HOME

Inicia_L   movlw   .2
      movwf   Contador_L   ;Inicia contador de líneas
Inicia_C   movlw   .16
      movwf   Contador_C   ;Inicia contador de caracteres

Loop:      clrwdt         ;Refrescar el WDT
      call   Key_Scan   ;Explora el teclado
      movlw   0x80
      subwf   Tecla,W
      btfsc   STATUS,Z   ;Hay alguna pulsada ?
      goto   Loop      ;No, seguir explorando
            
      call   Key_BCD      ;Convierte código de tecla a código BCD
      
      movf   Tecla,W
      sublw   .9
      btfss   STATUS,C        ;Es mayor que 9 (A, B,C,D,E,F)?
      goto   Mayor_que_9   ;Si
      movf   Tecla,W      ;No
      addlw   0x30            ;Ajuste ASCII de los caracteres del 0 al 9
      goto   Visualiza

Mayor_que_9   movf   Tecla,W
      addlw   0x37      ;Ajuste ASCII de los caracteres de la A a la F
      
Visualiza   call   LCD_DATO        ;Visualiza sobre el LCD
      
;Es necesario esperar que se libere la tecla pulsada, de lo contrario la visualización
;de esta se repetiría varias veces. Se puede comprobar su efecto si se anulan las 5
;instrucciones que vienen a continuación.

Tecla_pulsada   call   Key_Scan   ;Explora el teclado
      movlw   0x80
      subwf   Tecla,F
      btfss   STATUS,Z   ;Se ha liberado ??
      goto   Tecla_pulsada   ;Todavía no

      decfsz   Contador_C,F   ;Se han imprimido 16 caracteres ??
      goto   Loop      ;No

      movlw   0xc0
      call   LCD_REG      ;Si posiciona cursor en la siguiente línea
      decfsz   Contador_L,F   ;Se han imprimido 2 líneas ??
      goto   Inicia_C   ;No, se imprimen otros 16 caracteres
      goto   Borra_LCD   ;Si, se inicia el LCD
         
      end         ;Fin del programa fuente

 Luego hice unas modificaciones en el teclado.inc q hice una rutina en el KeyBCD y resulta que se me visualiza a 0 todas las teclas que pulso, queria que me ayudarais a solucionar el problema, por favor

;****************************************************************************************
;               TECLADO.INC
;
;            Autor: Mikel Etxebarria
;         (c) Microsystems Engineering (Bilbao)
;
;Presenta un conjuntos de rutinas que permiten la gestión de un teclado hexadecimal organi-
;zado en una matriz de 4 x 4 tal y como es el caso del teclado incorporado en la tarjeta
;de ampliación MicroPic Trainer PLUS de Microsystems Engineering.
;
;Este fichero se debe incluir en los futuros programas fuente mediante la directiva INCLUDE.
;
;Key_Scan:    realiza un barrido del teclado y detecta si hay alguna tecla pulsada. La
;      variable "Tecla" retorna con el código de la tecla pulsada o el 0x80 en caso
;      de no haber ninguna.
;
;Key_BCD:   Convierte el código de tecla en código BCD (del 0 a F). Antes de llamar a la
;      rutina la variable "Tecla" contiene el código de tecla. Al finalizar, la
;      rutina devuelve el código BCD en la misma variable "Tecla".
;
;BCD_7seg:   Convierte el código BCD en código 7 segmentos. A la llamada de la rutina, el
;      W debe contener el código BCD y al finalizar la misma W retorna con el có-
;      digo 7 segmentos.
;
;El teclado hex. se supone conectado a la puerta B y su disposición es la siguiente:
;
;            RB0 RB1 RB2 RB3  TECLA     CODIGO
;             ^   ^   ^   ^   ----- ---------------
;           |---|---|---|---|   0   01111101 = 0x7D
;   RB4 --> | 1 | 2 | 3 | A |   1   11101110 = 0xEE
;           |---|---|---|---|   2   11101101 = 0xED
;   RB5 --> | 4 | 5 | 6 | B |   3   11101011 = 0xEB
;           |---|---|---|---|   4   11011110 = 0xDE
;   RB6 --> | 7 | 8 | 9 | C |   5   11011101 = 0xDD
;           |---|---|---|---|   6   11011011 = 0xDB
;   RB7 --> | * | 0 | . | D |   7   10111110 = 0xBE
;           |---|---|---|---|   8   10111101 = 0xBD
;                               9   10111011 = 0xBB
;                               *   01111110 = 0x7E
;                               .   01111011 = 0x7B
;                               D   01110111 = 0x77
;                               C   10110111 = 0xB7
;                               B   11010111 = 0xD7
;                               A   11100111 = 0xE7
;
;Hubiera sido más interesante que RB4-RB7 actuaran como entradas para poder hacer
;uso de la capacidad que tiene el PIC de provocar interrupción al cambiar de estado
;estas líneas. Ello no es posible dado que, en la Trainer, las líneas RB6 y RB7 forman
;parte también del circuito de grabación.

cblock      Key_var             ;Inicio de las variables
            Tecla               ;Retorno del código de tecla
            Key_1               ;Nº de columnas a explorar
            Key_2               ;Temporal de código
            Key_Delay_1         ;Variable de temporización
            Key_Delay_2         ;Variable de temporización
            TRISB_Temp          ;Estado temporal de TRISB
endc

;**************************************************************************************
;Key_Scan: Rutina de exploración del teclado. La variable "Tecla" retorna con el código
;de la tecla pulsada o el código 0x80 si no se pulsa ninguna.

Key_Scan    bsf    STATUS,RP0   ;Seleciona página 1
            movf   TRISB,W
            movwf  TRISB_Temp   ;Salva estado actual de TRISB
            movlw  b'00001111'
            movwf  TRISB        ;RB0-RB3 entradas, RB4-RB7 salidas
            bcf    STATUS,RP0   ;Selecciona página 0
            movlw  .4
            movwf  Key_1        ;Nº de columnas a explorar
            movlw  b'01111111'
            movwf  Tecla        ;Columna a activar

Key_Scan_1  movf   Tecla,W
            movwf  PORTB        ;Activa columna
            nop
            movf   PORTB,W
            movwf  Key_2
            subwf  Tecla,W      ;Lee las filas
            btfss  STATUS,Z     ;Hay alguna pulsada ?
            goto   Key_Scan_2   ;Si, hay alguna pulsada
            bsf    STATUS,C     ;No hay ninguna en esa columna
            rrf    Tecla,F      ;Seleciona siguiente columna
            decfsz Key_1,F
            goto   Key_Scan_1
            movlw  0x80
            movwf  Tecla        ;Retorna código 0x80 (no hay pulsación)
            movf   TRISB_Temp,W
            bsf    STATUS,RP0   ;Selecciona página 1
            movwf  TRISB        ;Repone TRISB al valor original
            bcf    STATUS,RP0   ;Selecciona página 0
            return              ;Fin de exploración
           
Key_Scan_2  movlw  .10          ;Bucle de temporización de unos 20 mS
            movwf  Key_Delay_1  ;para evitar el rebote de los pulsadores.

Key_Scan_3  clrf   Key_Delay_2
            clrwdt

Key_Scan_4  decfsz Key_Delay_2,F
            goto   Key_Scan_4
            decfsz Key_Delay_1,F
            goto   Key_Scan_3
           
            movf   Tecla,W      ;Trás la temporización se lee nuevamente
            movwf  PORTB        ;si la tecla es la misma. Así se evitan
            nop                 ;los rebotes.
            movf   PORTB,W
            subwf  Key_2,W
            btfss  STATUS,Z     ;Es la misma ??
            goto   Key_Scan_1   ;No, seguir con la exploración
            movf   Key_2,W      ;Si guardar en variable de salida "Tecla"
            movwf  Tecla
            movf   TRISB_Temp,W
            bsf    STATUS,RP0   ;Selecciona página 1
            movwf  TRISB        ;Repone TRISB al valor original
            bcf    STATUS,RP0   ;Selecciona página 0
            return              ;Fin de exploración

;*************************************************************************************
;Key_BCD:

      CLRF Tecla

      MOVLW b'11101111'
      MOVWF PORTB
      call retardo

      BTFSS PORTB,0
      GOTO n2
      RETLW '1'
     n2:BTFSS PORTB,1
      GOTO n3
      RETLW '2'
     n3:BTFSS PORTB,2
      GOTO letraA
      RETLW '3'
 letraA:BTFSS PORTB,3
      GOTO n4
      RETLW 'A'

     n4:MOVLW b'11011111'
      MOVWF PORTB
      call retardo
      BTFSS PORTB,0
      GOTO n5
      RETLW '4'
     n5:BTFSS PORTB,1
      GOTO n6
      RETLW '5'
     n6:BTFSS PORTB,2
      GOTO letraB
      RETLW '6'
 letraB:BTFSS PORTB,3
      GOTO n7
      RETLW 'B'

     n7:MOVLW b'10111111'
      MOVWF PORTB
      call retardo
      BTFSS PORTB,0
      GOTO n8
      RETLW '7'
     n8:BTFSS PORTB,1
      GOTO n9
      RETLW '8'
     n9:BTFSS PORTB,2
      GOTO letraC
      RETLW '9'
 letraC:BTFSS PORTB,3
      GOTO estrella
      RETLW 'C'

estrella:MOVLW b'01111111'
      MOVWF PORTB
      call retardo
      BTFSS PORTB,0
      GOTO n0
      RETLW '*'
     n0:BTFSS PORTB,1
      GOTO n#
      RETLW '0'
     n#:BTFSS PORTB,2
      GOTO letraD
      RETLW '#'
 letraD:BTFSS PORTB,3
      GOTO fin
      RETLW 'D'

retardo:
;retardo de los pulsadores
      bsf STATUS, RP0
      movlw b'00000110'
      movwf OPTION_REG
      bcf STATUS, RP0
      bcf INTCON, TMR0IF
      clrf TMR0
espera1:btfss INTCON, TMR0IF
      goto espera1
      return


fin:return

Desconectado dbermejo123

  • PIC10
  • *
  • Mensajes: 14
Re: Duda con el teclado y el LCD
« Respuesta #11 en: 06 de Marzo de 2007, 21:30:25 »
Al final ya me funcionó,aqui esta por si lo quiere alguien :-/ :-/

;****************************************************************************************
;               TECLADO.INC
;
;            Autor: Mikel Etxebarria
;         (c) Microsystems Engineering (Bilbao)
;
;Presenta un conjuntos de rutinas que permiten la gestión de un teclado hexadecimal organi-
;zado en una matriz de 4 x 4 tal y como es el caso del teclado incorporado en la tarjeta
;de ampliación MicroPic Trainer PLUS de Microsystems Engineering.
;
;Este fichero se debe incluir en los futuros programas fuente mediante la directiva INCLUDE.
;
;Key_Scan:    realiza un barrido del teclado y detecta si hay alguna tecla pulsada. La
;      variable "Tecla" retorna con el código de la tecla pulsada o el 0x80 en caso
;      de no haber ninguna.
;
;Key_BCD:   Convierte el código de tecla en código BCD (del 0 a F). Antes de llamar a la
;      rutina la variable "Tecla" contiene el código de tecla. Al finalizar, la
;      rutina devuelve el código BCD en la misma variable "Tecla".
;
;BCD_7seg:   Convierte el código BCD en código 7 segmentos. A la llamada de la rutina, el
;      W debe contener el código BCD y al finalizar la misma W retorna con el có-
;      digo 7 segmentos.
;
;El teclado hex. se supone conectado a la puerta B y su disposición es la siguiente:
;
;       RB0 RB1 RB2 RB3
;        ^   ^   ^   ^         TECLA        CODIGO
;                 |   |   |   |       -----   --------------
;      |---|---|---|---|   0   01111101 = 0x7D
;   RB4 -->   | 1 | 2 | 3 | A |   1   11101110 = 0xEE
;      |---|---|---|---|   2   11101101 = 0xED
;   RB5 -->   | 4 | 5 | 6 | B |   3   11101011 = 0xEB
;      |---|---|---|---|   4   11011110 = 0xDE
;   RB6 -->   | 7 | 8 | 9 | C |   5   11011101 = 0xDD
;      |---|---|---|---|   6   11011011 = 0xDB
;   RB7 -->   | * | 0 | . | D |   7   10111110 = 0xBE
;      |---|---|---|---|   8   10111101 = 0xBD
;                    9   10111011 = 0xBB
;                    *   01111110 = 0x7E
;                    .   01111011 = 0x7B
;               D   01110111 = 0x77
;               C   10110111 = 0xB7
;               B   11010111 = 0xD7
;               A   11100111 = 0xE7
;
;Hubiera sido más interesante que RB4-RB7 actuaran como entradas para poder hacer
;uso de la capacidad que tiene el PIC de provocar interrupción al cambiar de estado
;estas líneas. Ello no es posible dado que, en la Trainer, las líneas RB6 y RB7 forman
;parte también del circuito de grabación.

      cblock   Key_var      ;Inicio de las variables
      Tecla         ;Retorno del código de tecla
      Key_1         ;Nº de columnas a explorar
      Key_2                  ;Temporal de código
      Key_Delay_1      ;Variable de temporización
      Key_Delay_2      ;Variable de temporización
      TRISB_Temp      ;Estado temporal de TRISB
      endc                  

;**************************************************************************************
;Key_Scan: Rutina de exploración del teclado. La variable "Tecla" retorna con el código
;de la tecla pulsada o el código 0x80 si no se pulsa ninguna.

Key_Scan:   bsf   STATUS,RP0   ;Seleciona página 1
      movf   TRISB,W
      movwf   TRISB_Temp   ;Salva estado actual de TRISB
      movlw   b'00001111'
      movwf   TRISB      ;RB0-RB3 entradas, RB4-RB7 salidas
      bcf   STATUS,RP0   ;Selecciona página 0
      movlw   4
      movwf   Key_1      ;Nº de columnas a explorar
      movlw   b'01111111'
      movwf   Tecla      ;Columna a activar
Key_Scan_1:   movf    Tecla,W
      movwf   PORTB      ;Activa columna            
      nop
      movf   PORTB,W
      movwf   Key_2
      subwf   Tecla,W      ;Lee las filas
      btfss   STATUS,Z   ;Hay alguna pulsada ?
      goto   Key_Scan_2   ;Si, hay alguna pulsada
      bsf   STATUS,C   ;No hay ninguna en esa columna
      rrf   Tecla,F      ;Seleciona siguiente columna
      decfsz   Key_1,F
      goto   Key_Scan_1
      movlw   0x80
      movwf   Tecla      ;Retorna código 0x80 (no hay pulsación)
      movf   TRISB_Temp,W
      bsf   STATUS,RP0   ;Selecciona página 1
      movwf   TRISB      ;Repone TRISB al valor original
      bcf   STATUS,RP0   ;Selecciona página 0
      return         ;Fin de exploración
            
Key_Scan_2:   movlw   .10      ;Bucle de temporización de unos 20 mS
      movwf   Key_Delay_1   ;para evitar el rebote de los pulsado-
Key_Scan_3:   clrf   Key_Delay_2   ;res.
      clrwdt
Key_Scan_4:   decfsz   Key_Delay_2,F
      goto   Key_Scan_4
      decfsz   Key_Delay_1,F
      goto   Key_Scan_3
            
      movf   Tecla,W      ;Trás la temporización se lee nuevamente
      movwf   PORTB      ;si la tecla es la misma. Así se evitan
      nop         ;los rebotes.
      movf   PORTB,W
      subwf   Key_2,W
      btfss   STATUS,Z   ;Es la misma ??
      goto   Key_Scan_1   ;No, seguir con la exploración
      movf   Key_2,W      ;Si guardar en variable de salida "Tecla"
      movwf   Tecla
      movf   TRISB_Temp,W
      bsf   STATUS,RP0   ;Selecciona página 1
      movwf   TRISB      ;Repone TRISB al valor original
      bcf   STATUS,RP0   ;Selecciona página 0
      return         ;Fin de exploración                                             


;***************************************************************************************


Key_BCD:
      bsf   STATUS,RP0   ;Seleciona página 1
      movlw   b'00001111'
      movwf   TRISB      ;RB0-RB3 entradas, RB4-RB7 salidas
      bcf   STATUS,RP0   ;Selecciona página 0

      CLRF Tecla
      MOVLW b'11101111'
      MOVWF PORTB
call retardo
      BTFSC PORTB,0
      GOTO n2
      RETLW '1'
     n2:BTFSC PORTB,1
      GOTO n3
      RETLW '2'
     n3:BTFSC PORTB,2
      GOTO letraA
      RETLW '3'
 letraA:BTFSC PORTB,3
      GOTO n4
      RETLW 'A'

     n4:MOVLW b'11011111'
      MOVWF PORTB
call retardo
      BTFSC PORTB,0
      GOTO n5
      RETLW '4'
     n5:BTFSC PORTB,1
      GOTO n6
      RETLW '5'
     n6:BTFSC PORTB,2
      GOTO letraB
      RETLW '6'
 letraB:BTFSC PORTB,3
      GOTO n7
      RETLW 'B'

     n7:MOVLW b'10111111'
      MOVWF PORTB
call retardo
      BTFSC PORTB,0
      GOTO n8
      RETLW '7'
     n8:BTFSC PORTB,1
      GOTO n9
      RETLW '8'
     n9:BTFSC PORTB,2
      GOTO letraC
      RETLW '9'
 letraC:BTFSC PORTB,3
      GOTO estrella
      RETLW 'C'

estrella:MOVLW b'01111111'
      MOVWF PORTB
call retardo
      BTFSC PORTB,0
      GOTO n0
      RETLW '*'
     n0:BTFSC PORTB,1
      GOTO n#
      RETLW '0'
     n#:BTFSC PORTB,2
      GOTO letraD
      RETLW '#'
 letraD:BTFSC PORTB,3
      GOTO fin
      RETLW 'D'

fin:return

retardo:bsf STATUS,RP0
      movlw b'00000110'
      movwf OPTION_REG
      bcf STATUS, RP0
      bcf INTCON, TMR0IF
      clrf TMR0
espera1:btfss INTCON,TMR0IF
      goto espera1
   return   

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Duda con el teclado y el LCD
« Respuesta #12 en: 07 de Marzo de 2007, 01:36:46 »
de pelos amigo!!!!!!!!!!!!!  :-/, voy a probarlo pa ver si tienen bugs  :twisted:
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: Duda con el teclado y el LCD
« Respuesta #13 en: 07 de Marzo de 2007, 20:52:18 »
saludos, talvez os sirva, aca hay varios, o habia nose, yo ya no puedo descargar ninguno, bueno si descarga pero 0 bytes, y no hay nada, muy raro, haber si prueban y me dicen si ustedes ven algo porque recuerdo que el tema 15 del teclado esta en ASM (no lo encuentro por mi disco, y pues ojala alguien pueda descargarlo) y pues talvez sirva, y los otros temas tb son muy interesantes para iniciarse y ver algunas aplicaciones, esas si que no las vi, si alguien puede que porfavor nos lo comente.

link
.