;------------------------------------------------------------------------------------
;
; Rutina para Leer valores de tabla ubicados en cualquier lugar para PIC16Fxxx
;
; Versión : 0.3
; Utilización de un macro para comprimir el código
; Código idéntico al de la version 0.2 pero con uso de macro
;
; Última Revisión: 12-7-2006
; Autor : Maunix
;
;
; Versión : 0.2
; : Optimiza la forma de llamar a la rutina mediante el uso de un bucle
; Version : 0.1
; Primera versión.
;
;------------------------------------------------------------------------------------
list P=16F628A
include <p16F628A.inc>
MENSAJEADDRESS equ 0x20 ;Dejar 2 bytes para la variable MENSAJEADDRESS
OFFSET equ 0x22
OFFSETEND equ 0x23
;
; Modo de USO
;
; En MENSAJEADRESS<1> guardamos el valor high de la dirección donde está el código a leer
; En MENSAJEADRESS<0> guardamos el valor low de la dirección donde está el código a leer
; OFFSET es un índice dentro del mensaje, que irá de 0 a Largo de Mensaje - 1.
; 0 para el primer valor, N-1 para el último
; Funciona con mensajes donde cada mensaje sea menor a 255 bytes. Para mayores tablas se deberá incorporar un OFFSET de 16 bits.
;
; La rutina está armada para que sea utilizada no solo con mensajes de texto, sino cualquier tipo de datos que uno quiera leer
;
; Se asume que las variables MENSAJEADDRESS, OFFSET Y OFFSETEND están todas en el banco 0 de memoria ram. De no ser así deberán modificarse las rutinas
; Se asume conocimiento del uso del PCLATH
; El ejemplo es muy simple y no tiene en cuenta interrupciones ni otro tipo de cosas, su única finalidad es mostrar una forma
; eficiente y fácil de ubicar una tabla en cualquier posición de la memoria de programa e irlo procesando en forma consecutiva
;
;
;
_mensaje macro NombreMensaje,LargoMensaje
movlw LOW NombreMensaje
movwf MENSAJEADDRESS+0
movlw HIGH NombreMensaje
movwf MENSAJEADDRESS+1
movlw LargoMensaje
movwf OFFSETEND ;Leera 3 bytes (del 0 al 2)
call _MENSAJESTART
endm
_RUTINAS:
_mensaje MENSAJE1,.4 ;Leera 4 bytes (del 0 al 3)
_mensaje MENSAJE2,.21 ;Leera el 21 bytes (del 0 al 20)
_mensaje MENSAJE3,.2 ;Leera el 2 bytes (del 0 al 1)
_mensaje MENSAJE4,.6 ;Leera el 6 bytes (del 0 al 5)
;A partir de aquí hacer lo que el usuario uno desee
nop
goto $-1
_MENSAJESTART:
clrf OFFSET
movf OFFSET,w
addwf MENSAJEADDRESS+0,f
btfsc STATUS,C
incf MENSAJEADDRESS+1,f
_MENSAJEBUCLE
call MENSAJES
; El dato leído está en WREG
; Sacarlo por la USART, enviarlo a una rutina de display 7 seg, rutina de display LCD, etc.
; Ej. (usar una de estas lineas, no todas)
; movwf TXREG
; call CARACTERLCD
; movwf PORTB
bcf STATUS,Z
incf MENSAJEADDRESS+0,f
btfsc STATUS,Z
incf MENSAJEADDRESS+1,f
incf OFFSET,f
movf OFFSET,w
subwf OFFSETEND,w
btfss STATUS,Z
goto _MENSAJEBUCLE
return
org 0x03F0 ;Ubicado aquí a propósito para comprobar como funciona en los límites
MENSAJES:
movf MENSAJEADDRESS+1,w
movwf PCLATH ;Guardo byte 0 del
movf MENSAJEADDRESS+0,w
movwf PCL
MENSAJE1: dt "HOLA"
MENSAJE2: dt "MAUNIX TEST DE TABLAS"
MENSAJE3: dt "VERSION 0.2"
MENSAJE4: dt 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8
end