Buenas noches,
He estado tratando de rotar a la derecha un byte: b'11001100' en el PIC16F84A , con la instrucción asm de RRL y no puedo hacer que se vea en el PORTB como yo quiero, ya me sale siempre 87H o a veces cuando añado que al principio del programa cargue b'00000000' el byte en el PORTB, pues se queda así y no más.
Bueno, en fin, quiero que inicie con b'00000000' y al pulsar cargue el dato b'11001100' y luego con el resto de pulsos lo rote a la derecha y veré si se borra o qué.
Este es el assembler:
listp=16f84a
#include<p16f84a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;********VARIABLE DEFINITION*************************************
CBLOCK
BYTE
CONT
CONT2
ENDC
;***************************************************************
ORG 0X00
GOTO INICIO
INICIO
BSF STATUS,5 ;ACCESO BANCO 1
CLRF TRISB ;PORTB ES SALIDA
BSF TRISA,0 ;RA0 ES ENTRADA
BCF STATUS,5 ;VOLVEMOS AL BANCO 0
MOVLW B'11001100' ;
MOVWF BYTE ;BYTE= B'11001100'
MOVLW 0X00 ;PORTB COMIENZA SACANDO 00000000
MOVWF PORTB
PRUEBA_PULSO
BTFSS PORTA,0 ;RA0=1?
GOTO PRUEBA_PULSO ;NO, ESPERA EN "PRUEBA_PULSO"
ESPERA BTFSC PORTA,0 ;SI, ESPERA QUE SE SUELTE EL PULSADOR
GOTO ESPERA ;NO HA SIDO SOLTADO Y ESPERA EN "ESPERA"
RETARDO MOVLW 0XFF ;ELIMINA REBOTE
MOVWF CONT2
CICLO2 MOVLW 0XFF
MOVWF CONT
CICLO DECFSZ CONT,1
GOTO CICLO
DECFSZ CONT2,1
GOTO CICLO2
MOVF BYTE,0 ;
MOVWF PORTB ;MUEVO EL BYTE (B'11001100') A PORTB
RRF BYTE,0 ;LO ROTO A LA DERECHA, CARGO EN W
BCF STATUS,C ;BORRO FLAG DE ACARREO
MOVWF PORTB ;Y QUE EL RESULTADO VUELVA A PORTB A MOSTRAR DESPLAZAMIENTO
GOTO PRUEBA_PULSO ;VUELVO A REVISAR EL PULSO
END
Gracias por su respuesta,
He estado tratando de rotar a la derecha un byte: b'11001100' en el PIC16F84A , con la instrucción asm de RRL y no puedo hacer que se vea en el PORTB como yo quiero, ya me sale siempre 87H o a veces cuando añado que al principio del programa cargue b'00000000' el byte en el PORTB, pues se queda así y no más.
Bueno, en fin, quiero que inicie con b'00000000' y al pulsar cargue el dato b'11001100' y luego con el resto de pulsos lo rote a la derecha y veré si se borra o qué.
Este es el assembler:
listp=16f84a
#include<p16f84a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;********VARIABLE DEFINITION*************************************
CBLOCK
BYTE
CONT
CONT2
ENDC
;***************************************************************
ORG 0X00
GOTO INICIO
INICIO
BSF STATUS,5 ;ACCESO BANCO 1
CLRF TRISB ;PORTB ES SALIDA
BSF TRISA,0 ;RA0 ES ENTRADA
BCF STATUS,5 ;VOLVEMOS AL BANCO 0
MOVLW B'11001100' ;
MOVWF BYTE ;BYTE= B'11001100'
MOVLW 0X00 ;PORTB COMIENZA SACANDO 00000000
MOVWF PORTB
PRUEBA_PULSO
BTFSS PORTA,0 ;RA0=1?
GOTO PRUEBA_PULSO ;NO, ESPERA EN "PRUEBA_PULSO"
ESPERA BTFSC PORTA,0 ;SI, ESPERA QUE SE SUELTE EL PULSADOR
GOTO ESPERA ;NO HA SIDO SOLTADO Y ESPERA EN "ESPERA"
RETARDO MOVLW 0XFF ;ELIMINA REBOTE
MOVWF CONT2
CICLO2 MOVLW 0XFF
MOVWF CONT
CICLO DECFSZ CONT,1
GOTO CICLO
DECFSZ CONT2,1
GOTO CICLO2
MOVF BYTE,0 ;
MOVWF PORTB ;MUEVO EL BYTE (B'11001100') A PORTB
RRF BYTE,0 ;LO ROTO A LA DERECHA, CARGO EN W
BCF STATUS,C ;BORRO FLAG DE ACARREO
MOVWF PORTB ;Y QUE EL RESULTADO VUELVA A PORTB A MOSTRAR DESPLAZAMIENTO
GOTO PRUEBA_PULSO ;VUELVO A REVISAR EL PULSO
END
Gracias por su respuesta,
Última edición: