Проблема с запуском моей кнопки на моей макетной плате и миганием светодиода
Я пытаюсь работать над заданием, в котором нам предлагается создать программу на языке ассемблера с использованием Raspberry Pi, подключенного к макетной плате. Мне удалось скомпилировать мою программу и заставить мои светодиоды загораться в правильном порядке, чтобы имитировать настоящий светофор. Однако я пытаюсь понять, как сделать так, чтобы светодиоды двигались только после нажатия кнопки. Я искал в Интернете, но весь код кнопки, который я мог найти, написан на Python или C++, когда мне нужно, чтобы он был на языке ассемблера. Я также пытаюсь выяснить, как я могу заставить зеленый светодиод слева мигать, прежде чем он перейдет на красный. Вот подсказка вопроса:
Уличный переход - состоит из уличного фонаря (красный, желтый, зеленый ряд светодиодов), отдельного красного и зеленого светодиодов (ходить/не ходить) и кнопки. При нажатии кнопки загораются красные лампочки и загорается зеленый индикатор ходьбы. В конце концов зеленый и желтый будут мигать, говоря, что время ходьбы истекло, затем загорится красный, чтобы не ходить, и зеленый, чтобы загорелся светофор.
Вот изображение моей макетной платы: https://imgur.com/a/sI24Wae
Вот изображение таблицы gpio wirepipi: https://raspberrypi.stackexchange.com/questions/40203/pinout-difference
Вот мой код языка ассемблера:
// CSC-11 Final Project Option #2
.equ INPUT, 0
.equ OUTPUT, 1
.equ LOW, 0
.equ HIGH, 1
.equ RED_PIN1, 26 // wiringPi 26
.equ YLW_PIN1, 27 // wiringPi 27
.equ GRN_PIN1, 28 // wiringPi 28
.equ RED_PIN2, 24 // wiringPi 24
.equ GRN_PIN2, 25 // wiringPi 25
.equ STP_PIN, 29 // wiringPi 29 - STOP PIN
.equ PAUSE_S, 3 // pause in seconds
.align 4
.section .rodata
out_s: .asciz "%d, r4=%d, r5=%d\n"
.align 4
.text
.global main
main:
//int main()
push {lr} //{
bl wiringPiSetup // wiringPiSetup(): // initialize the wiringPi library
mov r0, #STP_PIN
bl setPinInput
mov r0, #RED_PIN1
bl setPinOutput
mov r0, #YLW_PIN1
bl setPinOutput
mov r0, #GRN_PIN1
bl setPinOutput
mov r0, #RED_PIN2
bl setPinOutput
mov r0, #GRN_PIN2
bl setPinOutput
lp:
mov r0, #RED_PIN2
mov r1, #RED_PIN2
mov r2, #PAUSE_S
bl action
cmp r0, #1
beq end_lp
mov r0, #GRN_PIN1
mov r1, #YLW_PIN1
mov r2, #PAUSE_S
bl action
cmp r0, #1
beq end_lp
mov r0, #YLW_PIN1
mov r1, #RED_PIN1
mov r2, #PAUSE_S
bl action
cmp r0, #1
beq end_lp
mov r0, #RED_PIN2
mov r1, #GRN_PIN2
mov r2, #PAUSE_S
bl action
//blink r0, #GRN_PIN2
//mov r1, #PAUSE_S
//bl action
mov r0, #GRN_PIN2
mov r1, #RED_PIN2
mov r2, #PAUSE_S
bl action
mov r0, #RED_PIN1
mov r1, #GRN_PIN1
mov r2, #PAUSE_S
bl action
bal lp
end_lp:
mov r0, #RED_PIN1
bl pinOff
mov r0, #YLW_PIN1
bl pinOff
// mov r0, #RED_PIN2
// bl pinOff
mov r0, #GRN_PIN1
bl pinOff
mov r0, #0 //return 0:
pop {pc} //}
setPinInput:
push {lr}
mov r1, #INPUT
bl pinMode
pop {pc}
setPinOutput:
push {lr}
mov r1, #OUTPUT
bl pinMode
pop {pc}
pinOn:
push {lr}
mov r1, #HIGH
bl digitalWrite
pop {pc}
pinOff:
push {lr}
mov r1, #LOW
bl digitalWrite
pop {pc}
readStopButton:
push {lr}
mov r0, #STP_PIN
bl digitalRead
pop {pc}
action:
push {r4, r5, lr}
mov r4, r1
mov r5, r2
bl pinOff
mov r0, r4
bl pinOn
mov r0, #0
bl time
mov r4, r0
do_whl:
bl readStopButton
cmp r0, #HIGH
beq action_done
mov r0, #0
bl time
sub r0, r0, r4
cmp r0, r5
blt do_whl
mov r0, #0
action_done:
pop {r4,r5,pc}
Я использую библиотеку wireingPi в своем коде. RED_PIN1, YLW_PIN1 и GRN_PIN1 предназначены для использования в качестве светодиодных индикаторов на правой стороне моего макета, имитирующих светофор. RED_PIN2 и GRN_PIN2 предназначены для светодиодных индикаторов на левой стороне моего макета, имитирующих пешеходный переход.