;Secuenciador de ocho LEDS conectados al puerto B ;Velocidad de desplazamiento Ra0 (pin 17) ;Direccion de desplazamiento Ra1 (pin 18) EST equ 0x03 ;Registro de estado PA equ 0x05 ;Puerto A PB equ 0x06 ;Puerto B AUXA equ 0x0c ;Variable de temporizacion AUXB equ 0x0d ;Variable de temporizacion org 0 ;Vector de reset goto INICIO org 5 INICIO bsf EST,5 ;Selecciona el banco de memoria superior clrf PB ;Configura el puerto B como salida movlw 0x1f ;Carga la variable Work con '00011111' movwf PA ;Configura el puerto A como entrada bcf EST,5 ;Selecciona el banco de memoria inferior IZQ movlw 1 ;Enciende el LED de RB0 (pin 6) movwf PB call DELAY ;Rutina de retardo para visualizacion LOOP rlf PB ;Desplaza el bit hacia la izquierda call DELAY ;Otra espera btfss PA,1 ;Verifica el interruptor de direccion goto LOOP2 ;Si esta pulsado salta a giro a la derecha btfsc PB,7 ;Verifica el estado del ultimo LED goto IZQ ;Comienza de nuevo si esta encendido goto LOOP ;Rota nuevamente si esta apagado DER movlw b'10000000' ;Carga la variable Work con el ultimo bit on movwf PB ;Enciende el ultimo LED call DELAY ;Espera LOOP2 rrf PB ;Desplaza el bit hacia la derecha call DELAY ;Vuelve a esperar btfsc PA,1 ;Verifica el interruptor de direccion goto LOOP ;Si esta suelto salta a giro a la izquierda btfsc PB,0 ;Verifica el estado del primer LED goto DER ;Si termino salta al comienzo del proceso goto LOOP2 ;Si no termino sigue desplazando DELAY movlw 255 ;Carga el temporiz. 1 con 255 (lento) btfss PA,0 ;Verifica el interruptor de velocidad movlw 127 ;Si esta presionado carga con 127 (rapido) movwf AUXA CA movlw 0xff ;Carga el auxiliar de temporizacion 2 movwf AUXB CB nop ;Pierde 1ęS por vuelta decfsz AUXB ;Resta uno al auxiliar 2 goto CB ;Si no llego a cero vuelve al punto CB decfsz AUXA ;Resta uno al auxiliar 1 goto CA ;Si no llego a cero vuelve al punto CA return end ;Fin del programa