对于学校的家庭作业,我需要使用 MMIO LED 显示屏,其中每个 LED 恰好存储在一个字节内的 2 位。对于作业,我需要向上、向下、向左和向右“移动”这些 LED。我还需要设置颜色(我将为此使用 0x40)。这是我的问题:
当我单击“右”箭头将 LED 移动到 1 列上时,当它应该返回黑色 (0x00) 时,它仍保留在当前列中。如果我右击 4 次(正好移动 1 个字节),我会得到另一个点亮的 LED,将原来的 LED 留在那里。
这是我的 MIPS 代码:
getLedPattern:
move $t2, $s2
andi $t1, $t2, 0x3 #remainder of x / 4 is in $t0
sll $t0, $t2, 2 #x / 4 is in $t0
beq $t0, 0, case0
beq $t0, 1, case1
beq $t0, 2, case2
case3:
andi $a0, 0xFFFFFFFC
#insert $a1 into bits 0 and 1 of $a0 into $v0
or $v0, $a0, $a1
jr $ra
case2:
andi $a0, 0xFFFFFCFF
#insert $a1 into bits 2 and 3 of $a0 into $v0
#srl $a1, $a1, 2
or $v0, $a0, $a1
jr $ra
case1:
andi $a0, 0xFFFCFFFF
#insert $a1 into bits 4 and 5 of $a0 into $v0
#srl $a1, $a1, 4
or $v0, $a0, $a1
jr $ra
case0:
andi $a0, 0xFCFFFFFF
#insert $a1 into bits 6 and 7 of $a0 into $v0
#srl $a1, $a1, 6
or $v0, $a0, $a1
jr $ra
setLED:
addi $sp, $sp, -20
sw $ra, 0($sp)
sw $t0, 4($sp)
sw $t1, 8($sp)
sw $t2, 12($sp)
sw $t3, 16($sp)
move $t5, $a0
sll $t6, $a1, 5 # y*32
srl $t2, $a2, 2 # x/4
add $t5, $t5, $t6
add $t5, $t5, $t2
lb $a0, 0($t5)
move $a1, $a3
jal getLedPattern
sb $v0, 0($t5)
move $s3, $t5
lw $ra, 0($sp)
lw $t0, 4($sp)
lw $t1, 8($sp)
lw $t2, 12($sp)
lw $t3, 16($sp)
addi $sp, $sp, 20
jr $ra
逻辑是它从内存位置 0xFFFFOOO8(左上角 LED)开始,向下移动一行(+32 字节)和 x 列(加上 x*bits)。但是,我似乎无法取消当前 LED 的设置并将其移到一个上方。任何帮助,将不胜感激。我相信我的 or in getLedPattern: 是错误的,但不是 100% 肯定。
希望得到这个正确的,我将能够在一般意义上得到这个正确的(没有 LED 显示)。