document.write('
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. ;**************************** Librería "TECLADO.INC" ***********************************
  2. ;
  3. ; Librería de subrutinas para la gestión de un teclado organizado en una matriz de 4 x 4 y
  4. ; conectado al Puerto B según la disposición siguiente y explicada en la figura 19-2 del libro:
  5. ;
  6. ;        RB4 RB5 RB6 RB7
  7. ;          ^    ^    ^    ^
  8. ;       |----|----|----|----|
  9. ;   RB0 --> |  0 |  1 |  2 |  3 |
  10. ;       |----|----|----|----|
  11. ;   RB1 --> |  4 |  5 |  6 |  7 |
  12. ;       |----|----|----|----|
  13. ;   RB2 --> |  8 |  9 | 10 | 11 |
  14. ;       |----|----|----|----|
  15. ;   RB3 --> | 12 | 13 | 14 | 15 |
  16. ;       |----|----|----|----|
  17. ;
  18. ; Los números que se han dibujado dentro de cada cuadrado son el orden de las teclas
  19. ; que no tienen por qué coincidir con lo serigrafiado sobre ellas. El paso del número de orden
  20. ; de la tecla al valor que hay serigrafiado sobre la misma se hace con una tabla de conversión.
  21. ;
  22. ; ZONA DE DATOS **********************************************************************
  23. ;
  24.     CBLOCK
  25.     Tecl_TeclaOrden         ; Orden de la tecla a chequear.
  26.     ENDC
  27.  
  28. Tecl_UltimaTecla    EQU d\'15\'       ; Valor de orden de la última tecla utilizada.
  29.  
  30. ; Subrutina "Teclado_LeeHex" ************************************************************
  31. ;
  32. ; Cada tecla tiene asignado un número de orden que es contabilizado en la variable
  33. ; Tecl_TeclaOrden. Para convertir a su valor según el tipo de teclado en concreto se
  34. ; utiliza una tabla de conversión.
  35. ; A continuación se expone la relación entre el número de orden de la tecla y los
  36. ; valores correspondientes para el teclado hexadecimal más utilizado.
  37. ;
  38. ;       ORDEN DE TECLA:     TECLADO HEX. UTILIZADO:
  39. ;        0   1   2   3          1  2  3  F
  40. ;        4   5   6   7          4  5  6  E
  41. ;        8   9  10  11          7  8  9  D
  42. ;       12  13  14  15          A  0  B  C
  43. ;
  44. ; Así, en este ejemplo, la tecla "7" ocupa el orden 8, la tecla "F" ocupa el orden 3 y la
  45. ; tecla "9" el orden 10.
  46.  
  47. ; Si cambia el teclado también hay cambiar de tabla de conversión.
  48. ;
  49. ; Entrada:  En (W) el orden de la tecla pulsada.
  50. ; Salida:   En (W) el valor hexadecimal para este teclado concreto.
  51. ;
  52. Teclado_LeeHex
  53.     call    Teclado_LeeOrdenTecla   ; Lee el Orden de la tecla pulsada.
  54.     btfss   STATUS,C        ; ¿Pulsa alguna tecla?, ¿C=1?
  55.     goto    Tecl_FinLeeHex      ; No, por tanto sale.
  56.     call    Tecl_ConvierteOrdenEnHex    ; Lo convierte en su valor real mediante tabla.
  57.     bsf STATUS,C        ; Vuelve a posicionar el Carry, porque la
  58. Tecl_FinLeeHex              ; instrucción "addwf PCL,F" lo pone a "0".
  59.     return
  60. ;
  61. Tecl_ConvierteOrdenEnHex            ; Según el teclado utilizado resulta:
  62.     addwf   PCL,F
  63.     DT  0Dh,0Fh,0h,0h       ; Primera fila del teclado.
  64.     DT  0Ch,9h,8h,7h        ; Segunda fila del teclado
  65.     DT  0Bh,6h,5h,4h        ; Tercera fila del teclado.
  66.     DT  0Ah,3h,2h,1h        ; Cuarta fila del teclado.
  67. Teclado_FinTablaHex
  68. ;
  69. ; Esta tabla se sitúa al principio de la librería con el propósito de que no supere la
  70. ; posición 0FFh de memoria ROM de programa. De todas formas, en caso que así fuera
  71. ; visualizaría el siguiente mensaje de error en el proceso de ensamblado:
  72. ;
  73.     IF (Teclado_FinTablaHex > 0xFF)
  74.         ERROR   "Atención: La tabla ha superado el tamaño de la página de los"
  75.         MESSG   "primeros 256 bytes de memoria ROM. NO funcionará correctamente."
  76.     ENDIF
  77.    
  78. ; Subrutina "Teclado_Inicializa" --------------------------------------------------------
  79. ;
  80. ; Esta subrutina configura las líneas del Puerto B según la conexión del teclado realizada
  81. ; y comprueba que no hay pulsada tecla alguna al principio.
  82.  
  83. Teclado_Inicializa
  84.     bsf STATUS,RP0      ; Configura las líneas del puerto:
  85.     movlw   b\'11110000\'     ; <RB7:RB4> entradas, <RB3:RB0> salidas
  86.     movwf   PORTB
  87.     bcf OPTION_REG,NOT_RBPU ; Habilita resistencia de Pull-Up del Puerto B.
  88.     bcf STATUS,RP0      ; Acceso al banco 0.
  89. ;   call    Teclado_EsperaDejePulsar
  90. ;   return
  91. ;
  92. ; Subrutina "Teclado_EsperaDejePulsar" --------------------------------------------------
  93. ;
  94. ;Permanece en esta subrutina mientras siga pulsada la tecla.
  95. ;
  96. Teclado_Comprobacion    EQU b\'11110000\'
  97.  
  98. Teclado_EsperaDejePulsar:
  99.     movlw   Teclado_Comprobacion    ; Pone a cero las cuatro líneas de salida del
  100.     movwf   PORTB           ; Puerto B.
  101. Teclado_SigueEsperando
  102.     call    Retardo_20ms        ; Espera a que se estabilicen los niveles de tensión.
  103.     movf    PORTB,W     ; Lee el Puerto B.
  104.     sublw   Teclado_Comprobacion    ; Si es lo mismo que escribió es que ya no pulsa
  105.     btfss   STATUS,Z        ; tecla alguna.
  106.     goto    Teclado_SigueEsperando
  107.     return
  108. ;
  109. ; Subrutina "Teclado_LeeOrdenTecla" -----------------------------------------------------
  110. ;
  111. ; Lee el teclado, obteniendo el orden de la tecla pulsada.
  112. ;
  113. ; Salida:   En (W) el número de orden de la tecla pulsada. Además Carry se pone a "1" si
  114. ;       se pulsa una tecla ó a "0" si no se pulsa tecla alguna.
  115. ;
  116. Teclado_LeeOrdenTecla:
  117.     clrf    Tecl_TeclaOrden     ; Todavía no ha empezado a chequear el teclado.
  118.     movlw   b\'11111110\'     ; Va a chequear primera fila.
  119. Tecl_ChequeaFila                ; (Ver esquema de conexión).
  120.     movwf   PORTB           ; Activa la fila correspondiente.
  121. Tecl_Columna1
  122.     btfss   PORTB,4         ; Chequea la 1ª columna buscando un cero.
  123.     goto    Tecl_GuardaValor        ; Sí, es cero y por tanto guarda su valor y sale.
  124.     incf    Tecl_TeclaOrden,F       ; Va a chequear la siguiente tecla.
  125. Tecl_Columna2               ; Repite proceso para las siguientes
  126.     btfss   PORTB,5         ; columnas.
  127.     goto    Tecl_GuardaValor
  128.     incf    Tecl_TeclaOrden,F
  129. Tecl_Columna3      
  130.     btfss   PORTB,6
  131.     goto    Tecl_GuardaValor
  132.     incf    Tecl_TeclaOrden,F
  133. Tecl_Columna4      
  134.     btfss   PORTB,7
  135.     goto    Tecl_GuardaValor
  136.     incf    Tecl_TeclaOrden,F
  137. ;
  138. ; Comprueba si ha chequeado la última tecla, en cuyo caso sale. Para ello testea si
  139. ; el contenido del registro Tecl_TeclaOrden es igual al número de teclas del teclado.
  140. ;
  141. Tecl_TerminaColumnas
  142.     movlw   Tecl_UltimaTecla
  143.     subwf   Tecl_TeclaOrden,W       ; (W) = (Tecl_TeclaOrden)-Tecl_UltimaTecla.
  144.     btfsc   STATUS,C        ; ¿C=0?, ¿(W) negativo?, ¿(Tecl_TeclaOrden)<15?
  145.     goto    Tecl_NoPulsada      ; No, se ha llegado al final del chequeo.
  146.     bsf STATUS,C        ; Sí. Va a chequear la siguiente fila.
  147.     rlf PORTB,W     ; Apunta a la siguiente fila.
  148.     goto    Tecl_ChequeaFila   
  149. Tecl_NoPulsada
  150.     bcf STATUS,C        ; Posiciona C=0, indicando que no ha pulsado
  151.     goto    Tecl_FinTecladoLee  ; tecla alguna y sale.
  152. Tecl_GuardaValor
  153.     movf    Tecl_TeclaOrden,W       ; El orden de la tecla pulsada en (W) y sale.
  154.     bsf STATUS,C        ; Como hay tecla tecla pulsada, pone C=1.
  155. Tecl_FinTecladoLee
  156.     return
');