这里的第一个计时器。
我试图在我的覆盆子pi 3上编写一个arm组件morse代码转换器。该程序应该读取字符串文字(x),取相应的莫尔斯代码字符串(h)并扫描字符串(" ....")并在字符串上设置的LED上输出一个点,用于字符串中的每个句点。
我的原始代码涉及实际上要逐个字符地扫描整个单词并进行翻译。在点亮LED的功能甚至被调用并且程序停止之前,我的LED将亮起。所以我制作了这个侧面程序,试图只翻译一个字母[在这种情况下" H"]并在我的LED上正确输出。
我的问题是我无法让代码循环回LED_lp :(通过exit_if :)分支到dot:function之后输出" ....&#中的点34;在LED上串起来。
我尝试了很多东西,包括
[ 我得出的结论是它确实存在冲突,即使您没有尝试加载引脚号或调用pinMode,似乎加载寄存器r0,r1的值为0和1导致引脚模式/ LED输出发生过早和不必要的变化 。如果我对此结论不正确,请告诉我。
即使是我的装配教授也不确定我的代码出了什么问题,或者为什么我的LED输出在查看我的原版时表现不正常。
为文本墙道歉,但我认为一点额外的背景故事会节省一些时间并避免模糊。我希望有人能够提供帮助,因为我需要将其实施到我的最终项目中。
提前致谢
.equ MY_PIN, 25
.equ OUTPUT, 1
.equ INPUT, 0
.equ LOW, 0
.equ HIGH, 1
.data
x: .asciz "H"
h: .asciz "...."
.text
.global main
main:
push {lr}
bl wiringPiSetup
ldr r4, =x
mov r5, #0
lp:
mov r6, r4 // mov r4 [x] into r6
cmp r6, #72 // check if r6 = H ascii code
beq _do_H // if equal branch to _do_H
_do_H:
ldr r4, =h
bl LED
LED:
push {lr}
mov r5, #0
LED_lp:
ldrb r6, [r4, +r5] // scan for first char in r6
cmp r6, #0 // cmp , if string done branch to exit_if
beq exit_LED
cmp r6, #46 // cmp, if first char is dash, branch to dash_check
bne check_dash
bl dot // else branch to dot
check_dash:
cmp r6, #45
beq dash
exit_if:
add r5, #1 // increment index for string scan
bal LED_lp
exit_LED:
pop {pc}
dot:
push {r0, r1,r2}
mov r0, #MY_PIN
mov r1, #HIGH
bl digitalWrite
mov r0, #100
bl delay
mov r0, #MY_PIN
mov r1, #LOW
bl digitalWrite
// bl exit_if $$ having this line BEFORE the pop causes LED to stay on
// for more than 100 ms, but seems to terminate the program after it
// lights up
pop {r0, r1,r2}
// bl exit_if $$ having this line AFTER the pop causes the led to stay on
// $$ for longer than 100 ms, and gets the program stuck running? after
// $$ execution
dash: // commented out dash to work on dot, left here for reference
// push {lr}
push {r0,r1,r2}
// mov r0, #MY_PIN
// mov r1, #HIGH
// bl digitalWrite
// mov r0, #1000
// bl delay
// mov r0, #MY_PIN
// mov r1, #LOW
// bl digitalWrite
pop {r0,r1,r2}
// pop {pc}
/////////end