装配:延迟使用循环

时间:2014-06-12 17:46:39

标签: assembly raspberry-pi delay gpio

我正试图让Raspberry Pi上的LED按时间间隔打开/关闭。我知道有一个关于如何做到这一点的教程,但有人告诉我,这对于程序来说太复杂了。

所以我的一个朋友给了我这个代码并告诉我这可以延迟执行:

    /* using 3 loops for delay*/
for_i:
    mov r2, #0

next_i:
    cmp r2, #1000
    bge endfor    

for_j:
    mov r3, #0

next_j:
    cmp r3, #1000
    bge fin_i    

for_k:
    mov r4, #0
    cmp r4, #1000
    bge fin_j
    add r4, #1
    b for_k

fin_j:
    add r3, #1
    b next_j

fint_i:
    add r2, #1
    b next_i

endfor:

据我所知,基本上是3个嵌套的for循环。

我要插入延迟的程序位如下所示:

loop$:

/*turn LED on*/
mov r5,#1
lsl r5,#16
str r5,[r4,#40]

*/insert delay*/

/*turn LED off*/
mov r5, #1
lsl r5,#16
str r5, [r4, #28]

*/insert delay*/

b loop$ 

当我无知地试图在代码中的某处插入循环时,LED就一直停留在。 老实说,我不知道如何插入这段代码来使程序延迟,或者即使3个循环足以注意到间隔。

打开/关闭LED的代码应该可以正常工作,如果我运行没有循环$的代码,LED保持关闭状态,当我使用此循环运行代码时,LED非常暗淡

1 个答案:

答案 0 :(得分:2)

首先,让我们简化一下代码。少分支应该更容易看到它实际上是三个循环:

    mov r2, #0
next_i:
    mov r3, #0
next_j:
    mov r4, #0
next_k:
    add r4, #1
    cmp r4, #1000
    blt next_k
    add r3, #1
    cmp r3, #1000
    blt next_j
    add r2, #1
    cmp r2, #1000
    blt next_i

您只需将其粘贴到您希望延迟的代码中即可。

如果LED发光暗淡,则表明环路太短。使用非常快速的LED开关可以使其以不同的强度发光。

尝试将其中一个#1000更改为#10000,以延迟延迟。