Programación en Ensamblador PIC: Control de LEDs y Sensores con Entradas Digitales

Electrónica6,45 KB

Programación en ensamblador de un microcontrolador PIC

Inicio

bsf STATUS,RP0 ; Selecciona Banco 1
bsf STATUS,RP1 ; Selecciona Banco 3
clrf ANSEL ; Puerta A digital
clrf ANSELH ; Puerta B digital
bcf STATUS,RP1 ; Selecciona Banco 1
movlw b'00000010'
movwf TRISA ; Configurar Puerta A
movlw b'00000000'
movwf TRISB ; Configurar Puerta B
movlw b'00000000'
movwf TRISC ; Configurar Puerta C
movlw b'00011110'
movwf TRISD ; Configurar Puerta D
bcf STATUS,RP0 ; Selecciona Banco 0

Rutina ApagarTodo

ApagarTodo

call ApagarLEDs
call Detenido
; Apagar todos los LEDs.

Bucle principal

;BUCLE PRINCIPAL
InterA1

BTFSS PORTA,1 ; Leer la entrada E3 (RA1)
goto A1Apagado
goto A1Encendido

; Si está apagado (RA1 == 0):
; apagar todos los LEDs S7-S0 (RD5-RC2-RD7-RD6 - B3-B2-B1-B0 = 0)
; Si está encendido (RA1 == 1):
; encender LEDs S3-S0 (B3-B2-B1-B0 = 1)
; mantener estado LEDs S7-S4 (RD5-RC2-RD7-RD6)
; y mirar pulsadores.

A1Apagado
; ApagarTodo
goto ApagarTodo

A1Encendido
call EncenderLEDs ; Mantener estado LEDs S7-S4 (RD5-RC2-RD7-RD6)

Lectura de sensores

MirarD1
BTFSC PORTD,1 ; Leer sensor (RD4)
goto MirarD2 ; Si no está activo (RD4 == 1) ir a MirarD2
call Atras
call EsperaTMR0
goto InterA1 ; Si está activo (RD4 == 0)
; ir a activar LEDs S7-S4 (RD5-RC2-RD7-RD6 = '1010')

MirarD2
BTFSC PORTD,2 ; Leer sensor (RD3)
goto MirarD3 ; Si no está activo (RD3 == 1) ir a MirarD3
call Adelante
call EsperaTMR0
goto InterA1
; Si está activo (RD3 == 0)
; ir a activar LEDs S7-S4 (RD5-RC2-RD7-RD6 = '0101')

MirarD3
BTFSC PORTD,3 ; Leer sensor (RD2)
goto MirarD4 ; Si no está activo (RD2 == 1) ir a MirarD4
call Derecha
goto InterA1 ; Si está activo (RD2 == 0)
; ir a activar LEDs S7-S4 (RD5-RC2-RD7-RD6 = '1001')

MirarD4
BTFSC PORTD,4 ; Leer sensor (RD1)
goto NoActivos ; Si no está activo (RD1 == 1) ir a NoActivos
call Izquierda
goto InterA1 ; Si está activo (RD1 == 0)
; ir a activar LEDs S7-S4 (RD5-RC2-RD7-RD6 = '0110')

NoActivos
call Adelante
goto InterA1

Subrutinas de control de LEDs S7-S4

Detenido
bcf PORTD,5
bcf PORTC,2 ; Apagar LEDs S7-S4 (RD5-RC2-RD7-RD6 = '0000')
bcf PORTD,7 ; Mantener estado LEDs S3-S0 (RB3-RB0)
bcf PORTD,6
return

Adelante
bsf PORTD,5 ; Activar LEDs S7-S4 (RD5-RC2-RD7-RD6 = '1010')
bcf PORTC,2
bsf PORTD,7
bcf PORTD,6
return

Atras
bcf PORTD,5
bsf PORTC,2
bcf PORTD,7
bsf PORTD,6
return

Derecha
bsf PORTD,5
bcf PORTC,2
bcf PORTD,7
bsf PORTD,6
return

Izquierda
bcf PORTD,5
bsf PORTC,2
bsf PORTD,7
bcf PORTD,6
return

Control de LEDs S3-S0

EncenderLEDs
bsf PORTB,3
bsf PORTB,2
bsf PORTB,1
bsf PORTB,0
return

ApagarLEDs
bcf PORTB,3
bcf PORTB,2
bcf PORTB,1
bcf PORTB,0
return

Temporización con TMR0

EsperaTMR0
movlw 10 ; Inicializar el contador a 10
movwf Contador ; Almacenar en la variable Contador
clrf TMR0 ; Reiniciar TMR0
bcf INTCON, T0IF ; Limpiar bandera de desbordamiento T0IF

ConfigurarTMR0
bsf STATUS, RP0 ; Seleccionar Banco 1
movlw b'00000111' ; Configurar Prescaler 1:256
movwf OPTION_REG ; Configurar OPTION_REG
bcf STATUS, RP0 ; Regresar al Banco 0

BucleEspera
btfsc INTCON, T0IF ; ¿T0IF == 1 (desbordamiento)?
goto DecrementarContador

; Verificar condiciones de salida
btfss PORTA, 1 ; Si A1 == 0, salir
goto SalirEspera
btfss PORTD, 3 ; Si D3 == 0, salir
goto SalirEspera
btfss PORTD, 4 ; Si D4 == 0, salir
goto SalirEspera

goto BucleEspera ; Repetir bucle de espera

DecrementarContador
clrf TMR0 ; Reiniciar TMR0
bcf INTCON, T0IF ; Limpiar bandera T0IF
decfsz Contador, f ; Decrementar contador
goto BucleEspera ; Si Contador != 0, seguir esperando

SalirEspera
return ; Finalizar subrutina

Declaraciones finales

Contador equ 0x20 ; Declarar la variable Contador

end

Descargar

PDF Word HTML