; 11-06-06
; Ejemplo 07
; Juego de luces
; PIC 16f84a
; MPLAB 7.30
; PROTEUS 6.9 SP3
; Veguepic
; el efecto que se busca es de dos luces que se mueven en 4 posiciones de lado a lado.
LIST P=16F84A, ; usar PIC 16F84A
#include <p16f84A.inc>
__CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC ; code protec off
; power up timer on
; watchdog off
; osc XT
PDel0 equ 0C
PDel1 equ 0D
SEC1 equ 0E
SEC2 equ 0f
ORG 0
BSF STATUS,5 ; activa la pagina 1
MOVLW B'00000' ; carga 00000 en W
MOVWF TRISA ; puerto a todos salidas
MOVLW B'00000000' ; carga 00000000 en W
MOVWF TRISB ; puerto b todos salidaS
BCF STATUS,5 ; volvemos a la pagina 0
CLRF PORTA ; ponemos a cero el puerto a
CLRF PORTB ; ponemos a cero el puerto b
BCF STATUS,0 ; limpia el carry de STATUS,C
MOVLW B'00000001' ; carga 00000001 en w
MOVWF SEC1 ; guarda el valor en SEC1
INICIO ; etiqueta
DERECHA ; rutina para mover a derecha
CALL CAMBIAR ; llama a CAMBIAR
RLF SEC1,1 ; mueve el contenido a la izquierda y lo guarda en SEC1
BTFSS SEC1,3 ; si el bit 7 es igual a 1 salta una instruccion
GOTO DERECHA ; repite la rutina derecha
IZQUIERDA ; rutina para mover a izquierda
CALL CAMBIAR ; llama a CAMBIAR
RRF SEC1,1 ; mueve el contenido a la izquierda y lo guarda en SEC1
BTFSS SEC1,0 ; si el bit 0 es igual a 1 salta una instruccion
GOTO IZQUIERDA ; repite la rutina izquierda
GOTO INICIO ; va a inicio
CAMBIAR ; rutina para repetir los 4 bits bajos en los 4 bits altos
SWAPF SEC1,0 ; intercambia los 4 bits bajos por los 4 bits altos
MOVWF SEC2 ; guarda el valor en SEC2
MOVF SEC1,0 ; carga SEC1 en w
ADDWF SEC2,1 ; suma w y SEC2 y lo guarda en SEC2
MOVF SEC2,0 ; carga SE21 en w
MOVWF PORTB ; mueve el valor de w en el puerto b
CALL DEMORA ; demora de 200ms
RETURN
;-------------------------------------------------------------
; La demora a sido generada con el programa PDEL
; Descripcion: Delay 200000 ciclos - 200 ms
;-------------------------------------------------------------
DEMORA movlw .156 ; 1 set numero de repeticion (B)
movwf PDel0 ; 1 |
PLoop1 movlw .213 ; 1 set numero de repeticion (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2
decfsz PDel1,1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel0,1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
PDelL3 goto PDelL4 ; 2 ciclos delay
PDelL4 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;-------------------------------------------------------------
END ; fin de programa