# Duda acerca de rutina de pic en ASM



## juani2312 (Nov 16, 2009)

Hola, tengo una duda acerca de la programacion de una pic.
Necesito una rutina que identifique ciertos numeros provenientes del puerto serie. Estos numeros son el ascii de una tecla presionada (hay 4 posibles: 'w','a','s','d'). Es decir, la rutina debe identificar cual de esas teclas fue ingresada y salta a determinada subrutina.

El dato recibido originalmente esta en F, guardado en "dato_serie". Lo que pense es en pasarlo a W, y empezar a restarle literales correspondientes a los ascii de las teclas posibles, y si el resultado de la operacion da cero, ya tengo la info acerca de que tecla fue presionada...

Para hacer esto debo realizarlo 4 veces, (una por cada letra). El codigo es el siguiente:
------------------------------------------------------
    movf    dato_serie,w    ; recupera el dato guardado
    sublw    b'01110011'        ;resto ascii de "s"
    btfsc    STATUS,Z
    goto    giro_abajo
    sublw    b'01100001'       ;resto ascii de "a"
    btfsc    STATUS,Z
    goto    giro_izquierda
    sublw    b'01100100'         ;resto ascii de "d"
    btfsc    STATUS,Z
    goto    giro_derecha
    sublw    b'01110111'        ;resto ascii de "w"
    btfsc    STATUS,Z
    goto    giro_arriba
    return
-------------------------------------------------------

La pregunta es, al restarle el literal por primera vez, pierdo el dato original??
Debo poner un "movf    dato_serie,w" despues de cada "goto" ???

Desde ya, Muchas Gracias...


----------



## Meta (Nov 17, 2009)

Hola:

Aquí te explica sobre el puerto serie, bájate el ejemplo en .asm que su contraseña es *D.P.E.*
http://www.pic16f84a.org/index.php?...w=article&id=66&Itemid=87#Proteus_Capitulo_20

Aquí hay más manuales que hice sobre el puerto serie.
http://www.abcdatos.com/tutoriales/tutorial/z9521.html

Suerte...


----------



## juani2312 (Nov 17, 2009)

Hola, gracias por tu respuesta, pero mi duda no es acerca del puerto serie. Esa parte ya esta programada.

Solo necesito saber como identificar que ascii fue ingresado....


----------



## Meta (Nov 17, 2009)

Precisasmente, el primer enlace tiene los ejemplos en .asm que te explica como se hace, por eso perdí mi tiempo en buscar y poner el enlace. ejejjeej

Suerte...


----------



## juani2312 (Nov 17, 2009)

Jaja, ok. Pero ese pedacito de programa que puse anteriormente tiene algun error?? O esta bien pensado?

PD: Olvide mencionar que mi pic es el 16F627.


----------



## Meta (Nov 17, 2009)

```
;************************************ RS232_11.asm **************************************
;
;    ===================================================================
;      Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;      E. Palacios, F. Remiro y L. López.        www.pic16f84a.com
;       Editorial Ra-Ma.  www.ra-ma.es
;    ===================================================================
;
; SISTEMA DE GOBIERNO DESDE ORDENADOR: Desde el teclado de un ordenador se desea comandar
; el movimiento de una estructura móvil, según la siguiente tabla:
;
;    TECLA (Por ejemplo)        MOVIMIENTO
;    -------------------        ----------
;            t                Adelante
;            b                Atrás
;            a                Izquierda
;            l                Derecha
;         Espacio            Parada
;
; La pulsación de cualquiera de estas teclas activa el estado de las salidas correspondiente
; RB3 (Adelante), RB2 (Atrás), RB1 (Izquierda), RB0 (Derecha) y apaga el resto.
;
; El movimiento que se está realizando aparece reflejado en un mensaje en el visualizador LCD
; del sistema y también en la pantalla del ordenador.
;
; El programa debe permitir modificar facilmente en posteriores revisiones en el hardware de
; la salida. Es decir, para activar las salidas conviene utilizar el direccionamiento por bit
; en lugar de por byte (utilizar instrucciones "bsf" y "bcf", en lugar de "mov..").
;
; ZONA DE DATOS **********************************************************************

    LIST        P=16F84A
    INCLUDE        <P16F84A.INC>
    __CONFIG    _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

    CBLOCK   0x0C        
    TeclaPulsada                    ; Va a guardar el contenido de la tecla pulsada.
    MensajeApuntado                    ; Va a guarda la dirección del mensaje apuntado.
    ENDC

#DEFINE  SalidaAdelante        PORTB,3    ; Define dónde se sitúan las salidas.
#DEFINE  SalidaAtras        PORTB,2
#DEFINE  SalidaIzquierda    PORTB,1
#DEFINE  SalidaDerecha        PORTB,0

TECLA_ADELANTE    EQU    't'                ; Código de las teclas utilizadas.
TECLA_ATRAS        EQU    'b'
TECLA_IZQ        EQU    'a'
TECLA_DER        EQU    'l'
TECLA_PARADA    EQU    ' '                ; Código de la tecla espaciadora, (hay un espacio,
                                    ; tened cuidado al teclear el programa).
; ZONA DE CÓDIGOS ********************************************************************

    ORG    0
Inicio
    call    LCD_Inicializa
    call    RS232_Inicializa
    bsf        STATUS,RP0                ; Configura como salidas las 4 líneas del
    bcf        SalidaAdelante            ; del Puerto B respetando la configuración del
    bcf        SalidaAtras                ; resto de las líneas.
    bcf        SalidaIzquierda
    bcf        SalidaDerecha
    bcf        STATUS,RP0
    call    Parado                    ; En principio todas las salidas deben estar 
Principal                            ; apagadas.
    call    RS232_LeeDato            ; Espera a recibir un carácter.
    call    TesteaTeclado
    goto    Principal

; "Mensajes" ----------------------------------------------------------------------------
;
Mensajes
    addwf    PCL,F
MensajeParado
    DT "Sistema PARADO", 0x00
MensajeAdelante
    DT "Marcha ADELANTE", 0x00
MensajeAtras
    DT "Marcha ATRAS", 0x00
MensajeIzquierda
    DT "Hacia IZQUIERDA", 0x00
MensajeDerecha
    DT "Hacia DERECHA", 0x00

; Subrutina "TesteaTeclado" -------------------------------------------------------------
;
; Testea el teclado y actúa en consecuencia.

TesteaTeclado
    movwf    TeclaPulsada            ; Guarda el contenido de la tecla pulsada.
    xorlw    TECLA_ADELANTE            ; ¿Es la tecla del movimiento hacia adelante?
    btfsc    STATUS,Z
    goto    Adelante                ; Sí, se desea movimiento hacia adelante.
;
    movf    TeclaPulsada,W            ; Recupera el contenido de la tecla pulsada.
    xorlw    TECLA_ATRAS                ; ¿Es la tecla del movimiento hacia atrás?
    btfsc    STATUS,Z
    goto    Atras                    ; Sí, se desea movimiento hacia atrás.
;
    movf    TeclaPulsada,W            ; Recupera el contenido de la tecla pulsada.
    xorlw    TECLA_IZQ                ; ¿Es la tecla del movimiento hacia la izquierda?
    btfsc    STATUS,Z
    goto    Izquierda                ; Sí, se desea movimiento hacia la izquierda.
;
    movf    TeclaPulsada,W            ; Recupera el contenido de la tecla pulsada.
    xorlw    TECLA_DER                ; ¿Es tecla del movimiento hacia la derecha?
    btfsc    STATUS,Z
    goto    Derecha                    ; Sí, se desea movimiento hacia la derecha.
;
    movf    TeclaPulsada,W            ; Recupera el contenido de la tecla pulsada.
    xorlw    TECLA_PARADA            ; ¿Es la tecla de parada?.
    btfss    STATUS,Z
    goto    Fin                        ; No es ninguna tecla de movimiento. Sale.
Parado
    bcf        SalidaAdelante            ; Como se ha pulsado la tecla de parada se
    bcf        SalidaAtras                ; desactivan todas las salidas.
    bcf        SalidaIzquierda
    bcf        SalidaDerecha
    movlw    MensajeParado
    goto    Visualiza
Adelante
    bcf        SalidaAtras
    bsf        SalidaAdelante
    bcf        SalidaIzquierda
    bcf        SalidaDerecha
    movlw    MensajeAdelante
    goto    Visualiza
Atras
    bcf        SalidaAdelante
    bsf        SalidaAtras
    bcf        SalidaIzquierda
    bcf        SalidaDerecha
    movlw    MensajeAtras
    goto    Visualiza
Izquierda
    bcf        SalidaAdelante
    bcf        SalidaAtras
    bsf        SalidaIzquierda
    bcf        SalidaDerecha
    movlw    MensajeIzquierda
    goto    Visualiza
Derecha
    bcf        SalidaAdelante
    bcf        SalidaAtras
    bcf        SalidaIzquierda
    bsf        SalidaDerecha
    movlw    MensajeDerecha

; Según el estado de las salidas visualiza el estado del sistema en el visualizador LCD y en
; el monitor del ordenador.

Visualiza
    movwf    MensajeApuntado            ; Guarda la posición del mensaje.
    call    LCD_Borra                ; Borra la pantalla del modulo LCD.
    movf    MensajeApuntado,W        ; Visualiza el mensaje en la pantalla
    call    LCD_Mensaje                ; del visualizador LCD.
    call    RS232_LineasBlanco        ; Borra la pantalla del ordenador.
    movf    MensajeApuntado,W
    call    RS232_Mensaje            ; Lo visualiza en el HyperTerminal.
    call    RS232_LineasBlanco
Fin    return

    INCLUDE  <RS232.INC>
    INCLUDE  <RS232MEN.INC>
    INCLUDE  <LCD_4BIT.INC>
    INCLUDE  <LCD_MENS.INC>
    INCLUDE  <RETARDOS.INC>
    END
```


----------



## krit (Nov 17, 2009)

Efectivamente ,debes poner "movf dato_serie,w" despues de cada "goto" .
Si miras la hoja de caracteristicas del chip veras que la instruccion SUBLW k  lo que hace es  W=k-W


----------



## jogues31 (Mar 20, 2011)

Orale, muy buena aportacion meta =)


----------

