Programación en Ensamblador PIC: Control de LEDs y Sensores con Entradas Digitales
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