Sie sind auf Seite 1von 4

11. Tablas con la instruccin RETLW Es muy comn utilizar la instruccin RETLW para la creacin de tablas de valores.

Esta instruccin devuelve un valor en el acumulador al retornar de una subrutina, la usaremos conjuntamente con el registro PCL (echale un vistazo si no lo recuerdas). La creacin de la tabla se har de la siguiente forma: TABLA VALORES MOVWF RETLW RETLW RETLW RETLW .... PCL VALOR0 VALOR1 VALOR2 VALOR3

Donde VALOR0, VALOR1, VALOR2... etc. son los valores que queremos almacenar en la tabla. La estrategia a seguir para consultar algn valor de la tabla es cargar en el acumulador la direccin de memoria de programa donde se encunetra el valor que quieres leer y despus llamar a la subrutina TABLA (con un CALL). Y te estars preguntando como se en que direccin esta cada valor, pues bien, el VALOR0 est en la direccin VALORES (es la etiqueta que hemos puesto a esa direccin), el VALOR1 est en la direccin VALORES+1, VALOR2 est en la direccin VALORES+2... etc. Y como no hay como un ejemplo para ver las cosas mas claras ah va uno: El siguiente ejemplo cuenta las veces que se acciona un pulsador conectado en RA0 y muestra el valor del conteo en un display de 7 segmentos de nodo comn conectado al puerto B. La tabla contiene los valores necesarios para iluminar el display con cada nmero del 0 al 9. A continuacin se muestran el esquema y el programa:

;**************************** ;* El siguiente programa cuenta las * ;* veces que se acciona un pulsador * ;* conectado a RA0 y muestra el * ;* resultado de la cuenta en un * ;* display de 7 segmentos de nodo * ;* comn conectado en el puerto B * ;**************************** PCL STATUS TRISA PORTA TRISB PORTB EQU EQU EQU EQU EQU EQU 02H 03H 05H 05H 06H 06H ;Registro donde contaremos ;Registro para el retardo 1 0

CUENTA EQU 0CH RETARDO EQU 0DH F w #DEFINE #DEFINE ORG GOTO EQU EQU

BANCO0 BCF STATUS,5 BANCO1 BSF STATUS,5 00H INICIO

;Dejamos sitio a continuacin para escribir ;nuestra tabla

TABLA

MOVWF

PCL

;cargamos el valor del acumulador en el registro ;PCL. Cuando se ejecute esta instruccin el pic ;saltar inmediatamente a la direccin de programa ;que le hayamos metido. ;en esta tabla almacenaremos los valores que hay ;que sacar por el puerto para que se muestren en ;el display los nmeros del 0 al 9: ;Para mostrar el 0 ;Para mostrar el 1 ;Para mostrar el 2 ;Para mostrar el 3 ;Para mostrar el 4 ;Para mostrar el 5 ;Para mostrar el 6 ;Para mostrar el 7 ;Para mostrar el 8 ;Para mostrar el 9 ;Pasamos al banco 1 ;Configuramos RA0 como Entrada ;Configuramos el puerto B como salidas ;Volvemos al banco 0 ;Pone a cero la cuenta ;Carga en el acumulador la direccin donde ;se encuentra el primer valor de la tabla ;Le suma el valor de la cuenta para obtener ;la direccin del valor que nos interesa ;Llama a la subrutina TABLA que nos devolver ;el valor correspondiente de la tabla ;en el acumulador. ;Saca dicho valor por el puerto B que har que se ;muestre en el display el nmero correspondiente ;si RA0 es "1" salta la siguiente ;instruccin (si no se acciona el pulsador) ;Llama a la subrutina SUMA1 (porque RB0 es "0" ;por lo tanto, se ha accionado el pulsador)

DISP RETLW RETLW 79H RETLW 24H RETLW 30H RETLW 19H RETLW 12H RETLW 02H RETLW 78H RETLW 00H RETLW 10H

40H

INICIO BANCO1 BSF TRISA,0 CLRF TRISB BANCO0 CLRF CUENTA MUESTRA MOVLW DISP ADDLW CUENTA CALL TABLA

MOVWF PORTB

BTFSS PORTA,0 CALL SUMA1 y, GOTO MUESTRA

;================================================ ; SUMA1: Subrutina que suma uno al registro ; CUENTA. Solo cuenta pulsaciones entre ; 0 y 9 (ya que no se pueden mostrar mas

; nmeros en un display de 7 segmentos). ; Despus espera a que se suelte el pulsador ; conectado a RA0 SUMA1 INCF CUENTA,F ;Incrementa el registro CUENTA ;a continuacin se mira si el registro ;CUENTA ha llegado a 0AH, en tal caso se ;pone a cero para comenzar de nuevo. MOVLW 0AH SUBWF CUENTA,W BTFSC STATUS,2 CLRF CUENTA ;Carga 0AH en el acumulador ;Le resta CUENTA al acumulador ;mira si el resultado ha sido ;cero (de serlo CUENTA sera igual a 0AH) ;si CUENTA es 0AH la pone a cero ;A continuacin espera a que se suelte el pulsador ;(previene los rebotes) CALL REBOTE ESPERA BTFSS PORTA,0 GOTO ESPERA RETURN ;/ ;Llama a la subrutina que previene los rebotes ;\ ; Espera a que se suelte el pulsador para retornar

; Fin de SUMA1 ;================================================ ;================================================ ; REBOTE: Subrutina que hace una pequea ; temporizacin para prevenir ; los rebotes REBOTE MOVLW 0FFH MOVWF RETARDO RETARDO REBO DECFSZ RETARDO,F GOTO REBO RETURN ;/ ;Carga el acumulador con 0FFh ;Mueve el contenido del acumulador a ;\ ; }No retorna hasta que RETARDO llega a cero

; Fin de REBOTE ;=================================================

END

;Indica final del programa