0

学校での宿題の場合、各LEDが1バイト内に正確に2ビット格納されているMMIOLEDディスプレイを使用する必要があります。割り当てのために、これらの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)から開始し、1行(+32バイト)下に移動し、x列(およびx *ビット)を超えます。ただし、現在のLEDの設定を解除して1つ上に移動することはできません。どんな助けでもいただければ幸いです。私のまたはgetLedPattern:は間違っていると思いますが、100%確実ではありません。

うまくいけば、これを正しくすることで、一般的な意味でこれを正しくすることができます(LEDディスプレイなし)。

4

1 に答える 1

1

ビットをクリアするための定数が間違っていると思います。代わりに次を試してください。

0xfffffffc  // or ~0x03
0xfffffff3  // or ~0x0C
0xffffffcf  // or ~0x30
0xffffff3f  // or ~0xC0

あなたのコードには他にも奇妙なことがあります:

  • s2が使用されますが、設定されません
  • s3が設定されていますが、使用されていません
  • $ t0は保持できず、1も2も保持できないため、case1とcase2に到達することはありません。
于 2011-03-29T06:39:01.313 に答える