带有按钮的ARM组件数量增加



我想问你一个关于ARM汇编的问题,

.global _start
_start:
.equ COOL, 0x393f3f38
.equ KEY_BASE_ADRESS, 0xFF200050
.equ S_SEGMENT_BASE_ADRESS, 0xFF200020
LDR R1, =KEY_BASE_ADRESS
LDR R2, =S_SEGMENT_BASE_ADRESS
MOV R8, #0x0000000F // Register that holds the number
MOV R5, #0// R5 holds the number obtanined from player  
CHECK_SWITCH:   
LDR R6, [R1]
CMP R6, #2
BEQ ADD
B CHECK_SWITCH  
ADD:
ADD R5, R5, #1
CMP R5, R8  
BNE CHECK_SWITCH
DISPLAY:
LDR R5, =COOL
STR R5, [R2]
.end

我正在尝试为 de1-soc 制作一个游戏(猜数字,但到目前为止不是很有意义(。我想在 R5 中增加"1"玩家的数量,当他按下 KEY1 时。此外,当 R5 中的数字等于 R8 时,7 段将显示"COOL"。问题是当我按下并释放 KEY1 时,程序执行得如此之快并完成程序。我需要的是,每次推送和释放 KEY1,应该只增加"1"我如何处理?谢谢!

顺便说一下,您可以从此处执行代码 https://cpulator.01xz.net/?sys=arm-de1soc

您的代码流是

check for key press:
while key not pressed goto check for key press
add one
go to check for key press:

一旦开关改变状态,然后按下键,它不再等待,它只是继续通过外部(添加一个以检查按键(循环。

您想要的是检查外循环中某处的未按下状态

check for key not pressed:
while key pressed goto check for key not pressed
check for key press:
while key not pressed goto check for key press
add one
go to check for key not pressed

check for key press:
while key not pressed goto check for key press
check for key not pressed:
while key pressed goto check for key not pressed
add one
go to check for key press

check for key press:
while key not pressed goto check for key press
add one
check for key not pressed:
while key pressed goto check for key not pressed
goto check for key press

您可以将添加一和最大计数检查分为两件事,并将其撒上......

但是,一旦开关位断言,您将撕裂外部循环,因为您无法足够快地将开关放回原处。 如果要计算开关的单次按下次数,则需要轮询循环中的断言和非断言状态。

还可以考虑使用 tst 而不是 cmp。 在文档中查找它。

最新更新