.syntax unified
.thumb
.equ GPIO_BASE, 0x40014000 @ Dirección base del GPIO para la Raspberry Pi Pico
.equ GPIO_OUTPUT_EN, 0x00000001 @ Valor para configurar los pines como salida
.equ RED_PIN, 1 @ Definir el pin 1 para la luz roja
.equ YELLOW_PIN, 5 @ Definir el pin 5 para la luz amarilla
.equ GREEN_PIN, 9 @ Definir el pin 9 para la luz verde
.global main
main:
bl setup @ Llamar a la función setup
b loop @ Saltar al inicio del bucle principal
setup:
ldr r0, =GPIO_BASE @ Cargar la dirección base del GPIO
movs r1, #0x00000001 @ Configurar los pines como salida (valor para el registro de configuración de pines)
str r1, [r0, #0x10] @ Configurar pines como salida (registro OUTPUT ENABLE)
bx lr @ Volver al llamador
loop:
bl green_light @ Encender la luz verde
movs r0, #30 @ Cargar 30 (3000 ms / 100 ms)
bl delay_ms
bl yellow_light @ Encender la luz amarilla
movs r0, #5 @ Cargar 5 (500 ms / 100 ms)
bl delay_ms
bl red_light @ Encender la luz roja
movs r0, #20 @ Cargar 20 (2000 ms / 100 ms)
bl delay_ms
bl yellow_light @ Encender la luz amarilla
movs r0, #5 @ Cargar 5 (500 ms / 100 ms)
bl delay_ms
bl turn_off @ Apagar todas las luces
b loop @ Repetir el bucle
green_light:
ldr r0, =GPIO_BASE
movs r1, #0x00000002 @ Valor para encender la luz verde (1 << GREEN_PIN)
str r1, [r0, #0x1C] @ Encender la luz verde (registro SET)
bx lr
yellow_light:
ldr r0, =GPIO_BASE
movs r1, #0x00000002 @ Valor para encender la luz amarilla (1 << YELLOW_PIN)
str r1, [r0, #0x1C] @ Encender la luz amarilla (registro SET)
bx lr
red_light:
ldr r0, =GPIO_BASE
movs r1, #0x00000002 @ Valor para encender la luz roja (1 << RED_PIN)
str r1, [r0, #0x1C] @ Encender la luz roja (registro SET)
bx lr
turn_off:
ldr r0, =GPIO_BASE
movs r1, #0x00000002 @ Valor para apagar todas las luces
str r1, [r0, #0x28] @ Apagar todas las luces (registro CLEAR)
bx lr
delay_ms:
push {r4, r5} @ Guardar los registros usados
movs r4, r0 @ Guardar el número de intervalos de 100 ms
inner_loop:
movs r5, #1 @ Cargar el valor 1 en r5
subs r4, r4, r5 @ Decrementar r4 por 1
bne inner_loop @ Repetir hasta que r4 sea 0
pop {r4, r5} @ Restaurar los registros
bx lr @ Regresar de la subrutina